plsqlwks 0.2.2__tar.gz → 0.2.3__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 (133) hide show
  1. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/PKG-INFO +112 -11
  2. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/README.md +111 -10
  3. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/doc/API.md +22 -3
  4. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/doc/ARCHITECTURE.md +24 -0
  5. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/doc/PLUGINS.md +3 -1
  6. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/doc/PLUGIN_CATALOG.md +94 -21
  7. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/__init__.py +1 -1
  8. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/config/loader.py +2 -0
  9. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/config/models.py +24 -0
  10. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/config/settings.py +30 -1
  11. plsqlwks-0.2.3/plsqlwks/db/ddl_remap.py +452 -0
  12. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/metadata.py +4 -2
  13. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/table_export.py +217 -15
  14. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/table_export_catalog.py +313 -30
  15. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/__init__.py +2 -0
  16. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/app.py +29 -2
  17. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/catalog.py +22 -7
  18. plsqlwks-0.2.3/plsqlwks/ui/clipboard.py +513 -0
  19. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/commands.py +4 -0
  20. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/constants.py +11 -7
  21. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/dialogs.py +147 -38
  22. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/documents.py +24 -3
  23. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/editor_controller.py +42 -15
  24. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/input_controller.py +4 -0
  25. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/keys.py +8 -0
  26. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/renderer.py +7 -0
  27. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/result_controller.py +31 -29
  28. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/table_export.py +19 -3
  29. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/tests/fixtures/ui_exports.txt +2 -0
  30. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/tools/putty_keys.ps1 +6 -0
  31. plsqlwks-0.2.2/plsqlwks/db/ddl_remap.py +0 -132
  32. plsqlwks-0.2.2/plsqlwks/ui/clipboard.py +0 -128
  33. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/doc/COMPATIBILITY.md +0 -0
  34. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/doc/QUICKSTART.html +0 -0
  35. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/doc/QUICKSTART.md +0 -0
  36. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/license.txt +0 -0
  37. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/__main__.py +0 -0
  38. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/cli.py +0 -0
  39. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/config/__init__.py +0 -0
  40. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/config/paths.py +0 -0
  41. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/config/session.py +0 -0
  42. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/__init__.py +0 -0
  43. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/dependencies.py +0 -0
  44. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/editing.py +0 -0
  45. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/execution.py +0 -0
  46. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/explain.py +0 -0
  47. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/health.py +0 -0
  48. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/identifiers.py +0 -0
  49. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/models.py +0 -0
  50. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/session.py +0 -0
  51. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/sql_analysis.py +0 -0
  52. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/timestamps.py +0 -0
  53. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/db/transactions.py +0 -0
  54. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/exporting.py +0 -0
  55. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/plugins/__init__.py +0 -0
  56. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/plugins/api.py +0 -0
  57. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/plugins/loader.py +0 -0
  58. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/plugins/management.py +0 -0
  59. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/sqlbinds.py +0 -0
  60. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/sqlsplit.py +0 -0
  61. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/application_controller.py +0 -0
  62. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/browser.py +0 -0
  63. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/buffer.py +0 -0
  64. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/code_generation.py +0 -0
  65. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/command_dispatcher.py +0 -0
  66. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/completion.py +0 -0
  67. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/db_operations.py +0 -0
  68. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/db_session.py +0 -0
  69. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/db_worker.py +0 -0
  70. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/dependency_walker.py +0 -0
  71. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/display.py +0 -0
  72. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/errors.py +0 -0
  73. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/help.py +0 -0
  74. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/key_reader.py +0 -0
  75. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/menu.py +0 -0
  76. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/output_selection.py +0 -0
  77. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/plugin_host.py +0 -0
  78. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/ports.py +0 -0
  79. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/query_controller.py +0 -0
  80. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/result_export.py +0 -0
  81. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/result_presenter.py +0 -0
  82. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/results.py +0 -0
  83. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/sql.py +0 -0
  84. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/sqlplus.py +0 -0
  85. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/state.py +0 -0
  86. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/syntax.py +0 -0
  87. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/ui/viewport.py +0 -0
  88. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks/workspace.py +0 -0
  89. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plsqlwks.egg-info/SOURCES.txt +0 -0
  90. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/csv-export/install.plw +0 -0
  91. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/csv-export/payload/__init__.py +0 -0
  92. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/csv-export/payload/plugin.py +0 -0
  93. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/csv-export/payload/support.py +0 -0
  94. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/csv-export/payload/writer.py +0 -0
  95. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/csv2oratab/install.plw +0 -0
  96. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/csv2oratab/payload/__init__.py +0 -0
  97. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/csv2oratab/payload/csv2oratab.py +0 -0
  98. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/csv2oratab/payload/plugin.py +0 -0
  99. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/dependencies-walker/install.plw +0 -0
  100. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/dependencies-walker/payload/__init__.py +0 -0
  101. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/dependencies-walker/payload/plugin.py +0 -0
  102. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/html-export/install.plw +0 -0
  103. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/html-export/payload/__init__.py +0 -0
  104. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/html-export/payload/html_exporting.py +0 -0
  105. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/html-export/payload/plugin.py +0 -0
  106. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/html-export/payload/support.py +0 -0
  107. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/html-export/payload/writer.py +0 -0
  108. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/packages/csv-export-1.0.0.plwgn +0 -0
  109. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/packages/csv2oratab-0.1.0.plwgn +0 -0
  110. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/packages/dependencies-walker-0.1.0.plwgn +0 -0
  111. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/packages/html-export-1.0.0.plwgn +0 -0
  112. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/packages/sqlplus-0.1.0.plwgn +0 -0
  113. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/packages/table-ddl-export-0.1.1.plwgn +0 -0
  114. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/packages/xlsx-export-1.0.0.plwgn +0 -0
  115. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/sqlplus/install.plw +0 -0
  116. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/sqlplus/payload/__init__.py +0 -0
  117. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/sqlplus/payload/plugin.py +0 -0
  118. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/table-ddl-export/install.plw +0 -0
  119. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/table-ddl-export/payload/__init__.py +0 -0
  120. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/table-ddl-export/payload/plugin.py +0 -0
  121. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/xlsx-export/install.plw +0 -0
  122. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/xlsx-export/payload/__init__.py +0 -0
  123. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/xlsx-export/payload/plugin.py +0 -0
  124. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/xlsx-export/payload/support.py +0 -0
  125. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/plugins/xlsx-export/payload/xlsx_exporting.py +0 -0
  126. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/pyproject.toml +0 -0
  127. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/pytest.ini +0 -0
  128. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/rchar.py +0 -0
  129. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/requirements.txt +0 -0
  130. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/setup.cfg +0 -0
  131. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/tests/conftest.py +0 -0
  132. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/tests/fixtures/config_exports.txt +0 -0
  133. {plsqlwks-0.2.2 → plsqlwks-0.2.3}/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.3
4
4
  Summary: An ncurses SQL and PL/SQL workspace for Oracle databases.
5
5
  Author: unu2000
6
6
  License-Expression: LicenseRef-plsqlwks-Donationware
@@ -533,7 +533,11 @@ After a successful quit, plsqlwks records the open file-backed tabs, active tab,
533
533
  Worksheet and configuration saves replace their destination atomically while
534
534
  preserving an existing file's POSIX permission bits. A
535
535
  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.
536
+ plsqlwks and asks whether to overwrite it, reload the disk version, save under
537
+ another name, or cancel. Reload is available while the file exists, including
538
+ when a change is detected just before saving. It replaces the editor text
539
+ without writing to disk; Undo can restore local edits. If reading fails, the
540
+ local buffer stays intact.
537
541
  Undo and redo update the unsaved-change marker by comparing the current content
538
542
  with the last successful save.
539
543
 
@@ -613,9 +617,11 @@ Use left Alt for application shortcuts; AltGr remains available for characters
613
617
  on international keyboards. Shortcut digits and symbols refer to the character
614
618
  on the active Windows layout: for example, Czech top-row digits need Shift,
615
619
  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
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
624
+ PuTTY's native paste (`Shift-Insert` or
619
625
  right-click) to insert Windows clipboard text as bracketed paste, and PuTTY
620
626
  mouse selection to copy to Windows. Leave plsqlwks' Ctrl-letter shortcuts
621
627
  available to the server when customizing PuTTY clipboard settings.
@@ -680,6 +686,94 @@ Run `tools\windows_keys.cmd -SelfTest` to check the helper without enabling it.
680
686
  The original `powershell.exe -NoProfile -File .\tools\putty_keys.ps1` command
681
687
  also works from Command Prompt and continues to support PuTTY.
682
688
 
689
+ ### Windows Terminal and WSL clipboard shortcuts
690
+
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.
694
+
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.
715
+
716
+ ```ini
717
+ [clipboard]
718
+ copy_to_windows = yes
719
+ copy_to_linux = no
720
+ ctrl_v_source = windows
721
+ ctrl_shift_v_source = internal
722
+ ```
723
+
724
+ Paste sources are `windows`, `internal`, or `linux`. Windows paste reads Windows
725
+ exclusively: failure or empty contents causes no insertion and explicit
726
+ 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,
729
+ then `clip.exe` on failure, and verifies contents by readback when a reader is
730
+ available. Copy-only Windows access is labelled unverified. Each Linux provider
731
+ is attempted when Linux copying is enabled. A Linux success does not conceal a
732
+ Windows failure.
733
+
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
736
+ entries to `actions`, keeping the other actions:
737
+
738
+ ```json
739
+ { "command": { "action": "sendInput", "input": "\u0003" }, "id": "User.PlsqlwksCopy" },
740
+ { "command": { "action": "sendInput", "input": "\u001b[99;6u" }, "id": "User.PlsqlwksInternalCopy" },
741
+ { "command": { "action": "sendInput", "input": "\u0016" }, "id": "User.PlsqlwksPaste" },
742
+ { "command": { "action": "sendInput", "input": "\u001b[118;6u" }, "id": "User.PlsqlwksAlternatePaste" }
743
+ ```
744
+
745
+ Replace the existing copy/paste entries in `keybindings` with
746
+ the entries below, keeping the other keybindings:
747
+
748
+ ```json
749
+ { "id": "User.PlsqlwksCopy", "keys": "ctrl+c" },
750
+ { "id": "User.PlsqlwksInternalCopy", "keys": "ctrl+shift+c" },
751
+ { "id": "User.PlsqlwksPaste", "keys": "ctrl+v" },
752
+ { "id": "User.PlsqlwksAlternatePaste", "keys": "ctrl+shift+v" }
753
+ ```
754
+
755
+ This setting applies to every Windows Terminal profile and tab. Restart
756
+ plsqlwks after upgrading and reopen Windows Terminal if it retains old bindings.
757
+ 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
759
+ enabled for the active Windows terminal window.
760
+
761
+ Keyboard navigation, resizing and dialogs remain available while clipboard
762
+ commands run. Windows paste waits behind pending external copies. If you change
763
+ the paste target's text, cursor, selection or active tab before it finishes, the
764
+ pending paste is cancelled; repeated external paste requests for that target
765
+ are ignored. Requests retain the settings in effect when submitted.
766
+
767
+ For native Windows Terminal paste, wait until application copy reports that the
768
+ Windows clipboard has been updated. Native paste reads the Windows clipboard
769
+ independently and receives no internal fallback. Its bracketed paste payload is
770
+ inserted directly without a second clipboard lookup.
771
+
772
+ Windows Terminal's **Copy on select** setting can overwrite the clipboard when
773
+ you select terminal text with the mouse. Turn it off if you want only explicit
774
+ copy commands to change the Windows clipboard.
775
+ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/terminal/customize-settings/actions#send-input).
776
+
683
777
  ## Keys
684
778
 
685
779
  ### Global
@@ -742,8 +836,10 @@ also works from Command Prompt and continues to support PuTTY.
742
836
  | `Ctrl-U` | Uppercase selected SQL code |
743
837
  | `Ctrl-L` | Lowercase selected SQL code |
744
838
  | `Ctrl-C` | Copy selected text |
839
+ | `Ctrl-Shift-C` | Copy selected text internally only |
745
840
  | `Ctrl-X` | Cut selected text |
746
841
  | `Ctrl-V` | Paste clipboard text, expanding each tab to two spaces |
842
+ | `Ctrl-Shift-V` | Paste the alternate source (internal by default) |
747
843
  | Terminal paste | Paste text as one edit, expanding each tab to two spaces |
748
844
  | `Ctrl-Z` / `Ctrl-Y` | Undo / redo |
749
845
  | `Ctrl+=` | Reconnect |
@@ -783,8 +879,8 @@ recorded as one undoable edit. `Ctrl-N` and `Ctrl-P` repeat the last search with
783
879
  its case setting, forward or backward with wraparound.
784
880
 
785
881
  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;
882
+ text in one undoable edit. This applies to both configured paste shortcuts and
883
+ to native terminal paste while the editor is focused;
788
884
  clipboard contents themselves are not changed. Native paste requires a
789
885
  terminal that supports the standard bracketed-paste protocol, with `Ctrl-V`
790
886
  remaining available as the fallback.
@@ -831,6 +927,7 @@ Read-only mode is a client-side guardrail that rejects statements which the SQL
831
927
  | `Ctrl-Home` / `Ctrl-End` | Move to the first/last result-grid row |
832
928
  | `F8` | Toggle result grid / row-detail output |
833
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 |
834
931
  | `F10` | View or edit a mapped text cell in a ROWID-backed result |
835
932
  | `Enter` | Edit the selected ROWID-backed result cell when available |
836
933
  | `INS` | Prepare a draft insert row for ROWID-backed results |
@@ -1123,7 +1220,7 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1123
1220
  | `PageUp` / `PageDown` | Scroll cell text by page |
1124
1221
  | `Home` / `End` | Move to the first/last cell-viewer line |
1125
1222
  | `Ctrl-S` (editor) | Save the multiline edit |
1126
- | `Ctrl-V` / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1223
+ | `Ctrl-V` / `Ctrl-Shift-V` / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1127
1224
  | `Enter` (editor) | Insert a newline |
1128
1225
  | `F10` / `Esc` / `Ctrl-Q` (editor) | Cancel the multiline edit |
1129
1226
 
@@ -1132,7 +1229,7 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1132
1229
  | Key | Action |
1133
1230
  | --- | --- |
1134
1231
  | 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 |
1232
+ | `Ctrl-V` / `Ctrl-Shift-V` / terminal paste | Paste single-line text; tabs are preserved and multiline text is rejected |
1136
1233
  | `Backspace` | Delete before the prompt cursor or picker filter |
1137
1234
  | `Enter` | Accept the prompt or selected picker item |
1138
1235
  | `Esc` / `Ctrl-Q` | Cancel the prompt or picker |
@@ -1193,9 +1290,13 @@ for the exact manifest, source layout, validation, replacement, and trust rules.
1193
1290
  Install `plugins/packages/table-ddl-export-0.1.1.plwgn` with
1194
1291
  `plsqlwks plugin install` and restart. **Alt-O -> Database -> Export table DDL**
1195
1292
  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
1293
+ optionally remap them to another schema and prefix tables, indexes, constraints
1294
+ and triggers while updating static table references. It automatically includes related
1197
1295
  sequences and directly referencing packages, functions, procedures, and views, and follows
1198
- required source-schema tables and views recursively. Definitions, constraints, indexes,
1296
+ required source-schema tables, views, SQL types and program units recursively.
1297
+ Unreadable type or program definitions become named destination prerequisites.
1298
+ Types retain their names; prefixed copies in the source schema reuse existing types.
1299
+ Definitions, constraints, indexes,
1199
1300
  foreign keys and triggers are ordered by creation dependencies in a new
1200
1301
  unsaved SQL tab for review. Generation activates that tab and focuses its editor.
1201
1302
  See the [selection keys and remapping details](doc/PLUGIN_CATALOG.md#table-ddl-export).
@@ -499,7 +499,11 @@ After a successful quit, plsqlwks records the open file-backed tabs, active tab,
499
499
  Worksheet and configuration saves replace their destination atomically while
500
500
  preserving an existing file's POSIX permission bits. A
501
501
  file-backed worksheet also detects when its file was changed or deleted outside
502
- plsqlwks and asks whether to overwrite it, save under another name, or cancel.
502
+ plsqlwks and asks whether to overwrite it, reload the disk version, save under
503
+ another name, or cancel. Reload is available while the file exists, including
504
+ when a change is detected just before saving. It replaces the editor text
505
+ without writing to disk; Undo can restore local edits. If reading fails, the
506
+ local buffer stays intact.
503
507
  Undo and redo update the unsaved-change marker by comparing the current content
504
508
  with the last successful save.
505
509
 
@@ -579,9 +583,11 @@ Use left Alt for application shortcuts; AltGr remains available for characters
579
583
  on international keyboards. Shortcut digits and symbols refer to the character
580
584
  on the active Windows layout: for example, Czech top-row digits need Shift,
581
585
  so Alt-1 is typed with Alt-Shift-1. Use the layout's `+` or `=` character for
582
- autocomplete refresh. `Ctrl-C`, `Ctrl-X`, and `Ctrl-V` operate on the
583
- application/host clipboard with the existing internal fallback. SSH does not
584
- make that the Windows clipboard. Use PuTTY's native paste (`Shift-Insert` or
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
590
+ PuTTY's native paste (`Shift-Insert` or
585
591
  right-click) to insert Windows clipboard text as bracketed paste, and PuTTY
586
592
  mouse selection to copy to Windows. Leave plsqlwks' Ctrl-letter shortcuts
587
593
  available to the server when customizing PuTTY clipboard settings.
@@ -646,6 +652,94 @@ Run `tools\windows_keys.cmd -SelfTest` to check the helper without enabling it.
646
652
  The original `powershell.exe -NoProfile -File .\tools\putty_keys.ps1` command
647
653
  also works from Command Prompt and continues to support PuTTY.
648
654
 
655
+ ### Windows Terminal and WSL clipboard shortcuts
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.
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.
681
+
682
+ ```ini
683
+ [clipboard]
684
+ copy_to_windows = yes
685
+ copy_to_linux = no
686
+ ctrl_v_source = windows
687
+ ctrl_shift_v_source = internal
688
+ ```
689
+
690
+ Paste sources are `windows`, `internal`, or `linux`. Windows paste reads Windows
691
+ exclusively: failure or empty contents causes no insertion and explicit
692
+ 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,
695
+ then `clip.exe` on failure, and verifies contents by readback when a reader is
696
+ available. Copy-only Windows access is labelled unverified. Each Linux provider
697
+ is attempted when Linux copying is enabled. A Linux success does not conceal a
698
+ Windows failure.
699
+
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
+ entries to `actions`, keeping the other actions:
703
+
704
+ ```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": "\u0016" }, "id": "User.PlsqlwksPaste" },
708
+ { "command": { "action": "sendInput", "input": "\u001b[118;6u" }, "id": "User.PlsqlwksAlternatePaste" }
709
+ ```
710
+
711
+ Replace the existing copy/paste entries in `keybindings` with
712
+ the entries below, keeping the other keybindings:
713
+
714
+ ```json
715
+ { "id": "User.PlsqlwksCopy", "keys": "ctrl+c" },
716
+ { "id": "User.PlsqlwksInternalCopy", "keys": "ctrl+shift+c" },
717
+ { "id": "User.PlsqlwksPaste", "keys": "ctrl+v" },
718
+ { "id": "User.PlsqlwksAlternatePaste", "keys": "ctrl+shift+v" }
719
+ ```
720
+
721
+ This setting applies to every Windows Terminal profile and tab. Restart
722
+ plsqlwks after upgrading and reopen Windows Terminal if it retains old bindings.
723
+ 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
725
+ enabled for the active Windows terminal window.
726
+
727
+ Keyboard navigation, resizing and dialogs remain available while clipboard
728
+ commands run. Windows paste waits behind pending external copies. If you change
729
+ the paste target's text, cursor, selection or active tab before it finishes, the
730
+ pending paste is cancelled; repeated external paste requests for that target
731
+ are ignored. Requests retain the settings in effect when submitted.
732
+
733
+ For native Windows Terminal paste, wait until application copy reports that the
734
+ Windows clipboard has been updated. Native paste reads the Windows clipboard
735
+ independently and receives no internal fallback. Its bracketed paste payload is
736
+ inserted directly without a second clipboard lookup.
737
+
738
+ Windows Terminal's **Copy on select** setting can overwrite the clipboard when
739
+ you select terminal text with the mouse. Turn it off if you want only explicit
740
+ copy commands to change the Windows clipboard.
741
+ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/terminal/customize-settings/actions#send-input).
742
+
649
743
  ## Keys
650
744
 
651
745
  ### Global
@@ -708,8 +802,10 @@ also works from Command Prompt and continues to support PuTTY.
708
802
  | `Ctrl-U` | Uppercase selected SQL code |
709
803
  | `Ctrl-L` | Lowercase selected SQL code |
710
804
  | `Ctrl-C` | Copy selected text |
805
+ | `Ctrl-Shift-C` | Copy selected text internally only |
711
806
  | `Ctrl-X` | Cut selected text |
712
807
  | `Ctrl-V` | Paste clipboard text, expanding each tab to two spaces |
808
+ | `Ctrl-Shift-V` | Paste the alternate source (internal by default) |
713
809
  | Terminal paste | Paste text as one edit, expanding each tab to two spaces |
714
810
  | `Ctrl-Z` / `Ctrl-Y` | Undo / redo |
715
811
  | `Ctrl+=` | Reconnect |
@@ -749,8 +845,8 @@ recorded as one undoable edit. `Ctrl-N` and `Ctrl-P` repeat the last search with
749
845
  its case setting, forward or backward with wraparound.
750
846
 
751
847
  Editor paste expands every tab character to two spaces and keeps multiline
752
- text in one undoable edit. This applies to `Ctrl-V` from either the system or
753
- internal clipboard and to native terminal paste while the editor is focused;
848
+ text in one undoable edit. This applies to both configured paste shortcuts and
849
+ to native terminal paste while the editor is focused;
754
850
  clipboard contents themselves are not changed. Native paste requires a
755
851
  terminal that supports the standard bracketed-paste protocol, with `Ctrl-V`
756
852
  remaining available as the fallback.
@@ -797,6 +893,7 @@ Read-only mode is a client-side guardrail that rejects statements which the SQL
797
893
  | `Ctrl-Home` / `Ctrl-End` | Move to the first/last result-grid row |
798
894
  | `F8` | Toggle result grid / row-detail output |
799
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 |
800
897
  | `F10` | View or edit a mapped text cell in a ROWID-backed result |
801
898
  | `Enter` | Edit the selected ROWID-backed result cell when available |
802
899
  | `INS` | Prepare a draft insert row for ROWID-backed results |
@@ -1089,7 +1186,7 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1089
1186
  | `PageUp` / `PageDown` | Scroll cell text by page |
1090
1187
  | `Home` / `End` | Move to the first/last cell-viewer line |
1091
1188
  | `Ctrl-S` (editor) | Save the multiline edit |
1092
- | `Ctrl-V` / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1189
+ | `Ctrl-V` / `Ctrl-Shift-V` / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1093
1190
  | `Enter` (editor) | Insert a newline |
1094
1191
  | `F10` / `Esc` / `Ctrl-Q` (editor) | Cancel the multiline edit |
1095
1192
 
@@ -1098,7 +1195,7 @@ Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load
1098
1195
  | Key | Action |
1099
1196
  | --- | --- |
1100
1197
  | Printable text | Type into prompts or filter picker options |
1101
- | `Ctrl-V` / terminal paste | Paste single-line text; tabs are preserved and multiline text is rejected |
1198
+ | `Ctrl-V` / `Ctrl-Shift-V` / terminal paste | Paste single-line text; tabs are preserved and multiline text is rejected |
1102
1199
  | `Backspace` | Delete before the prompt cursor or picker filter |
1103
1200
  | `Enter` | Accept the prompt or selected picker item |
1104
1201
  | `Esc` / `Ctrl-Q` | Cancel the prompt or picker |
@@ -1159,9 +1256,13 @@ for the exact manifest, source layout, validation, replacement, and trust rules.
1159
1256
  Install `plugins/packages/table-ddl-export-0.1.1.plwgn` with
1160
1257
  `plsqlwks plugin install` and restart. **Alt-O -> Database -> Export table DDL**
1161
1258
  lets you choose a schema, filter table names as you type, select tables, and
1162
- optionally remap them to another schema. It automatically includes related
1259
+ optionally remap them to another schema and prefix tables, indexes, constraints
1260
+ and triggers while updating static table references. It automatically includes related
1163
1261
  sequences and directly referencing packages, functions, procedures, and views, and follows
1164
- required source-schema tables and views recursively. Definitions, constraints, indexes,
1262
+ required source-schema tables, views, SQL types and program units recursively.
1263
+ Unreadable type or program definitions become named destination prerequisites.
1264
+ Types retain their names; prefixed copies in the source schema reuse existing types.
1265
+ Definitions, constraints, indexes,
1165
1266
  foreign keys and triggers are ordered by creation dependencies in a new
1166
1267
  unsaved SQL tab for review. Generation activates that tab and focuses its editor.
1167
1268
  See the [selection keys and remapping details](doc/PLUGIN_CATALOG.md#table-ddl-export).
@@ -537,21 +537,40 @@ wording of either presentation is not part of the API.
537
537
 
538
538
  `PluginContext.start_table_ddl_export()` is an additive API-v1 capability.
539
539
  It starts a host-owned workflow to choose a source schema, filter and select
540
- tables, and choose a target schema. Sequences and source-schema packages,
540
+ tables, and choose a target schema and optional table prefix. The prefix renames
541
+ included source-schema tables, indexes, constraints and triggers, and updates
542
+ resolved static references, including foreign keys. Blank preserves original
543
+ names; `TEST` and `TEST_` both prepend `TEST_`. Quoted prefixes preserve exact
544
+ case. Views, routines, SQL types and standalone sequences keep their names.
545
+ Sequences and source-schema packages,
541
546
  functions, procedures, and views that directly reference the tables are included
542
547
  automatically, without a separate sequence picker. It returns immediately while the host
543
548
  reads metadata through the initiating tab's database worker. No connection,
544
549
  credentials, cursor, or arbitrary SQL capability crosses the plugin boundary.
545
550
 
546
- Required source-schema tables and views are followed recursively; tables include
551
+ Required source-schema tables, views, SQL types and program units are followed
552
+ recursively; tables include
547
553
  their constraints, indexes, triggers, and detected sequences. Selection of callers stays
548
554
  limited to direct references to the initially checked tables. Definitions are
549
555
  ordered by creation dependencies across object types; unresolved prerequisites
550
556
  and genuine dependency cycles are reported in the generated script. Discovery
551
557
  prefers ALL_* catalogs and supplements them with accessible DBA_* views.
558
+ Parenthesized static function/package calls in complete stored program source and
559
+ trigger bodies supplement recorded dependencies, while local bindings are excluded.
560
+ Required readable functions precede their callers without selecting unrelated
561
+ functions. Existing source compilation errors are reported with line/column positions;
562
+ export does not recompile source objects or create missing definitions.
552
563
  Cross-schema definitions use catalog rendering for supported objects and
553
564
  DBMS_METADATA fallback for advanced or incomplete metadata. Own-schema
554
- definitions retain DBMS_METADATA extraction.
565
+ definitions retain DBMS_METADATA extraction. Type specifications and bodies are
566
+ distinct dependency nodes; TYPE extraction omits source OIDs and combined bodies.
567
+ Complete stored type source is preferred to conservative catalog reconstruction
568
+ of ordinary object types and VARRAYs. Declared column types supplement dictionary
569
+ dependencies, and local/public type synonyms resolve to their canonical owners.
570
+ Unavailable or unsupported type/program definitions remain named prerequisites in
571
+ the destination schema. Unsupported table definitions, cancellation and connection
572
+ failures still abort generation. Same-schema prefixed exports reuse existing types
573
+ and bodies and report them as prerequisites.
555
574
 
556
575
  On success the host opens and activates a new unsaved tab containing the generated
557
576
  SQL, with keyboard focus in the editor. Cancellation,
@@ -47,6 +47,26 @@ UI command as force-disconnected, quarantines that worker, and closes the exact
47
47
  captured client connection on a best-effort control thread. No server-side kill
48
48
  or process termination is attempted, and other tab workers are unaffected.
49
49
 
50
+ System clipboard access uses a separate lazy worker in `ClipboardController`.
51
+ It processes copy/paste requests in FIFO order, runs only provider calls, and
52
+ returns results through a queue. The main loop and all modal input loops poll
53
+ that queue; while a clipboard request is pending their idle timeout is at most
54
+ 100 ms. Only the curses thread updates clipboard state, status and text models.
55
+ Copy and cut update internal text immediately and attempt all configured external
56
+ destinations. Requests capture copy targets or the chosen paste source from the
57
+ workspace's immutable clipboard preferences when submitted. Ctrl-Shift-C copies
58
+ internally only. Internal paste cancels the target's pending callback and uses
59
+ internal text directly; Windows paste waits for pending copies, reads Windows
60
+ exclusively, and reports failure without falling back. Windows writes retry
61
+ through clip.exe after PowerShell failure and use readback verification when
62
+ available; Linux successes cannot hide Windows failures.
63
+ External paste callbacks check the originating
64
+ buffer or modal model, revision, cursor, selection and active target before
65
+ applying one undoable edit. Closing a modal drops its pending callback.
66
+ Clipboard children use isolated pipes, noninteractive PowerShell and a two-second
67
+ provider timeout. Application shutdown cancels queued work and terminates the
68
+ active clipboard child without waiting for normal provider completion.
69
+
50
70
  ## Editor rendering
51
71
 
52
72
  The SQL document remains in memory, with a lazy `ViewportSyntax` cache owned by
@@ -72,6 +92,10 @@ invalidate the appropriate rows. The root screen and editor window compose via
72
92
  `noutrefresh()` and one `doupdate()`, restoring the active cursor after composition.
73
93
  Recomposing the retained editor also restores it after overlapping dialogs and
74
94
  external terminal use. No document-sized curses pad or rendering thread is used.
95
+ Modal backgrounds use the same active-view composition instead of refreshing
96
+ the root alone. Single-line prompts occupy a separate topmost curses window,
97
+ including when the editor fills the screen. Physical redraw invalidation keeps
98
+ the document and syntax cache intact.
75
99
 
76
100
  ## Transaction state
77
101
 
@@ -173,7 +173,9 @@ and configuration instructions are in the [catalog](PLUGIN_CATALOG.md#sqlplus-la
173
173
  `table-ddl-export-0.1.1.plwgn` adds **Database -> Export table DDL** through
174
174
  `PluginContext.start_table_ddl_export()`. The host supplies schema/table selection
175
175
  with filtering as you type, automatic dependent-object and directly referencing
176
- program-unit/view extraction, schema remapping, progress, and a new unsaved SQL tab.
176
+ program-unit/view extraction, recursive required SQL type and program-unit
177
+ extraction, schema remapping, optional prefixes for tables and
178
+ attached indexes/constraints/triggers, progress, and a new unsaved SQL tab.
177
179
  No extra dependencies are required. See the
178
180
  [catalog guide](PLUGIN_CATALOG.md#table-ddl-export) for installation and details.
179
181