Merge branch 'main' into ko_kr
commit
9aa2383e05
|
|
@ -165,6 +165,7 @@
|
|||
/po/ca_ES.UTF-8.po @ghostty-org/ca_ES
|
||||
/po/de_DE.UTF-8.po @ghostty-org/de_DE
|
||||
/po/es_BO.UTF-8.po @ghostty-org/es_BO
|
||||
/po/es_AR.UTF-8.po @ghostty-org/es_AR
|
||||
/po/fr_FR.UTF-8.po @ghostty-org/fr_FR
|
||||
/po/id_ID.UTF-8.po @ghostty-org/id_ID
|
||||
/po/ja_JP.UTF-8.po @ghostty-org/ja_JP
|
||||
|
|
@ -177,7 +178,9 @@
|
|||
/po/tr_TR.UTF-8.po @ghostty-org/tr_TR
|
||||
/po/uk_UA.UTF-8.po @ghostty-org/uk_UA
|
||||
/po/zh_CN.UTF-8.po @ghostty-org/zh_CN
|
||||
/po/ga_IE.UTF-8.po @ghostty-org/ga_IE
|
||||
/po/ko_KR.UTF-8.po @ghostty-org/ko_KR
|
||||
|
||||
|
||||
# Packaging - Snap
|
||||
/snap/ @ghostty-org/snap
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@
|
|||
|
||||
.libxev = .{
|
||||
// mitchellh/libxev
|
||||
.url = "https://github.com/mitchellh/libxev/archive/9bc52324d4f0c036a3b244e992680a9fb217bbd3.tar.gz",
|
||||
.hash = "libxev-0.0.0-86vtc5b1EgB7vFmt9Tk7ySteR5AeEHW7xcR6gK9dMUD3",
|
||||
.url = "https://github.com/mitchellh/libxev/archive/75a10d0fb374e8eb84948dcfc68d865e755e59c2.tar.gz",
|
||||
.hash = "libxev-0.0.0-86vtcyMBEwA-UpcjfOICyI2GYG8o6MiRbinS1_8g1_rw",
|
||||
.lazy = true,
|
||||
},
|
||||
.vaxis = .{
|
||||
|
|
@ -103,8 +103,8 @@
|
|||
// Other
|
||||
.apple_sdk = .{ .path = "./pkg/apple-sdk" },
|
||||
.iterm2_themes = .{
|
||||
.url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/e436898274ecb89c055da476a8188aa4f79ffb17.tar.gz",
|
||||
.hash = "N-V-__8AAHncWgThrlpsuJJ2BIINQ6L7SO6SUOT1pEL8UQaX",
|
||||
.url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/6fa671fdc1daf1fcfa025cb960ffa3e7373a2ed8.tar.gz",
|
||||
.hash = "N-V-__8AAGHcWgTaKLjwmFkxToNT4jgz5VXUHR7hz8TQ2_AS",
|
||||
.lazy = true,
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -54,20 +54,20 @@
|
|||
"url": "https://deps.files.ghostty.org/imgui-1220bc6b9daceaf7c8c60f3c3998058045ba0c5c5f48ae255ff97776d9cd8bfc6402.tar.gz",
|
||||
"hash": "sha256-oF/QHgTPEat4Hig4fGIdLkIPHmBEyOJ6JeYD6pnveGA="
|
||||
},
|
||||
"N-V-__8AAHncWgThrlpsuJJ2BIINQ6L7SO6SUOT1pEL8UQaX": {
|
||||
"N-V-__8AAGHcWgTaKLjwmFkxToNT4jgz5VXUHR7hz8TQ2_AS": {
|
||||
"name": "iterm2_themes",
|
||||
"url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/e436898274ecb89c055da476a8188aa4f79ffb17.tar.gz",
|
||||
"hash": "sha256-C93MSyNgyB+uhvzMQETDXr7839hFyX7NfTMp4HUKs3U="
|
||||
"url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/6fa671fdc1daf1fcfa025cb960ffa3e7373a2ed8.tar.gz",
|
||||
"hash": "sha256-g9o2CIc/TfWYoUS/l/HP5KZECD7qNsdQUlFruaKkVz4="
|
||||
},
|
||||
"N-V-__8AAJrvXQCqAT8Mg9o_tk6m0yf5Fz-gCNEOKLyTSerD": {
|
||||
"name": "libpng",
|
||||
"url": "https://deps.files.ghostty.org/libpng-1220aa013f0c83da3fb64ea6d327f9173fa008d10e28bc9349eac3463457723b1c66.tar.gz",
|
||||
"hash": "sha256-/syVtGzwXo4/yKQUdQ4LparQDYnp/fF16U/wQcrxoDo="
|
||||
},
|
||||
"libxev-0.0.0-86vtc5b1EgB7vFmt9Tk7ySteR5AeEHW7xcR6gK9dMUD3": {
|
||||
"libxev-0.0.0-86vtcyMBEwA-UpcjfOICyI2GYG8o6MiRbinS1_8g1_rw": {
|
||||
"name": "libxev",
|
||||
"url": "https://github.com/mitchellh/libxev/archive/9bc52324d4f0c036a3b244e992680a9fb217bbd3.tar.gz",
|
||||
"hash": "sha256-VwFByDoptqiN5UkolFQ7TbRhwMERReD9Er2pjxTCYIU="
|
||||
"url": "https://github.com/mitchellh/libxev/archive/75a10d0fb374e8eb84948dcfc68d865e755e59c2.tar.gz",
|
||||
"hash": "sha256-/CSKSuZZfn0aIQlVZ0O8ch5O4gCajYBTTuoetRdo0n4="
|
||||
},
|
||||
"N-V-__8AAG3RoQEyRC2Vw7Qoro5SYBf62IHn3HjqtNVY6aWK": {
|
||||
"name": "libxml2",
|
||||
|
|
|
|||
|
|
@ -170,11 +170,11 @@ in
|
|||
};
|
||||
}
|
||||
{
|
||||
name = "N-V-__8AAHncWgThrlpsuJJ2BIINQ6L7SO6SUOT1pEL8UQaX";
|
||||
name = "N-V-__8AAGHcWgTaKLjwmFkxToNT4jgz5VXUHR7hz8TQ2_AS";
|
||||
path = fetchZigArtifact {
|
||||
name = "iterm2_themes";
|
||||
url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/e436898274ecb89c055da476a8188aa4f79ffb17.tar.gz";
|
||||
hash = "sha256-C93MSyNgyB+uhvzMQETDXr7839hFyX7NfTMp4HUKs3U=";
|
||||
url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/6fa671fdc1daf1fcfa025cb960ffa3e7373a2ed8.tar.gz";
|
||||
hash = "sha256-g9o2CIc/TfWYoUS/l/HP5KZECD7qNsdQUlFruaKkVz4=";
|
||||
};
|
||||
}
|
||||
{
|
||||
|
|
@ -186,11 +186,11 @@ in
|
|||
};
|
||||
}
|
||||
{
|
||||
name = "libxev-0.0.0-86vtc5b1EgB7vFmt9Tk7ySteR5AeEHW7xcR6gK9dMUD3";
|
||||
name = "libxev-0.0.0-86vtcyMBEwA-UpcjfOICyI2GYG8o6MiRbinS1_8g1_rw";
|
||||
path = fetchZigArtifact {
|
||||
name = "libxev";
|
||||
url = "https://github.com/mitchellh/libxev/archive/9bc52324d4f0c036a3b244e992680a9fb217bbd3.tar.gz";
|
||||
hash = "sha256-VwFByDoptqiN5UkolFQ7TbRhwMERReD9Er2pjxTCYIU=";
|
||||
url = "https://github.com/mitchellh/libxev/archive/75a10d0fb374e8eb84948dcfc68d865e755e59c2.tar.gz";
|
||||
hash = "sha256-/CSKSuZZfn0aIQlVZ0O8ch5O4gCajYBTTuoetRdo0n4=";
|
||||
};
|
||||
}
|
||||
{
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ https://deps.files.ghostty.org/ziglyph-b89d43d1e3fb01b6074bc1f7fc980324b04d26a5.
|
|||
https://deps.files.ghostty.org/zlib-1220fed0c74e1019b3ee29edae2051788b080cd96e90d56836eea857b0b966742efb.tar.gz
|
||||
https://github.com/glfw/glfw/archive/e7ea71be039836da3a98cea55ae5569cb5eb885c.tar.gz
|
||||
https://github.com/jcollie/ghostty-gobject/releases/download/0.14.0-2025-03-18-21-1/ghostty-gobject-0.14.0-2025-03-18-21-1.tar.zst
|
||||
https://github.com/mbadolato/iTerm2-Color-Schemes/archive/e436898274ecb89c055da476a8188aa4f79ffb17.tar.gz
|
||||
https://github.com/mitchellh/libxev/archive/9bc52324d4f0c036a3b244e992680a9fb217bbd3.tar.gz
|
||||
https://github.com/mbadolato/iTerm2-Color-Schemes/archive/6fa671fdc1daf1fcfa025cb960ffa3e7373a2ed8.tar.gz
|
||||
https://github.com/mitchellh/libxev/archive/75a10d0fb374e8eb84948dcfc68d865e755e59c2.tar.gz
|
||||
https://github.com/mitchellh/zig-objc/archive/3ab0d37c7d6b933d6ded1b3a35b6b60f05590a98.tar.gz
|
||||
https://github.com/natecraddock/zf/archive/7aacbe6d155d64d15937ca95ca6c014905eb531f.tar.gz
|
||||
https://github.com/vancluever/z2d/archive/1bf4bc81819385f4b24596445c9a7cf3b3592b08.tar.gz
|
||||
|
|
|
|||
|
|
@ -67,9 +67,9 @@
|
|||
},
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/e436898274ecb89c055da476a8188aa4f79ffb17.tar.gz",
|
||||
"dest": "vendor/p/N-V-__8AAHncWgThrlpsuJJ2BIINQ6L7SO6SUOT1pEL8UQaX",
|
||||
"sha256": "0bddcc4b2360c81fae86fccc4044c35ebefcdfd845c97ecd7d3329e0750ab375"
|
||||
"url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/6fa671fdc1daf1fcfa025cb960ffa3e7373a2ed8.tar.gz",
|
||||
"dest": "vendor/p/N-V-__8AAGHcWgTaKLjwmFkxToNT4jgz5VXUHR7hz8TQ2_AS",
|
||||
"sha256": "83da3608873f4df598a144bf97f1cfe4a644083eea36c75052516bb9a2a4573e"
|
||||
},
|
||||
{
|
||||
"type": "archive",
|
||||
|
|
@ -79,9 +79,9 @@
|
|||
},
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://github.com/mitchellh/libxev/archive/9bc52324d4f0c036a3b244e992680a9fb217bbd3.tar.gz",
|
||||
"dest": "vendor/p/libxev-0.0.0-86vtc5b1EgB7vFmt9Tk7ySteR5AeEHW7xcR6gK9dMUD3",
|
||||
"sha256": "570141c83a29b6a88de5492894543b4db461c0c11145e0fd12bda98f14c26085"
|
||||
"url": "https://github.com/mitchellh/libxev/archive/75a10d0fb374e8eb84948dcfc68d865e755e59c2.tar.gz",
|
||||
"dest": "vendor/p/libxev-0.0.0-86vtcyMBEwA-UpcjfOICyI2GYG8o6MiRbinS1_8g1_rw",
|
||||
"sha256": "fc248a4ae6597e7d1a2109556743bc721e4ee2009a8d80534eea1eb51768d27e"
|
||||
},
|
||||
{
|
||||
"type": "archive",
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Mitchell Hashimoto, Ghostty contributors
|
||||
# Copyright (C) YEAR "Mitchell Hashimoto, Ghostty contributors"
|
||||
# This file is distributed under the same license as the com.mitchellh.ghostty package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: com.mitchellh.ghostty\n"
|
||||
"Report-Msgid-Bugs-To: m@mitchellh.com\n"
|
||||
"POT-Creation-Date: 2025-04-23 16:58+0800\n"
|
||||
"POT-Creation-Date: 2025-06-28 17:01+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
|
@ -26,7 +26,8 @@ msgid "Leave blank to restore the default title."
|
|||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:9
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:10 src/apprt/gtk/CloseDialog.zig:44
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:10 src/apprt/gtk/ui/1.2/ccw-paste.blp:10
|
||||
#: src/apprt/gtk/CloseDialog.zig:44
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -35,22 +36,26 @@ msgid "OK"
|
|||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:5
|
||||
#: src/apprt/gtk/ui/1.2/config-errors-dialog.blp:5
|
||||
msgid "Configuration Errors"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:6
|
||||
#: src/apprt/gtk/ui/1.2/config-errors-dialog.blp:6
|
||||
msgid ""
|
||||
"One or more configuration errors were found. Please review the errors below, "
|
||||
"and either reload your configuration or ignore these errors."
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:9
|
||||
#: src/apprt/gtk/ui/1.2/config-errors-dialog.blp:9
|
||||
msgid "Ignore"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:10
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:97
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:100
|
||||
#: src/apprt/gtk/ui/1.2/config-errors-dialog.blp:10
|
||||
msgid "Reload Configuration"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -89,7 +94,7 @@ msgstr ""
|
|||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:11
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:11
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:11
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:11 src/apprt/gtk/ui/1.2/ccw-paste.blp:11
|
||||
msgid "Paste"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -119,7 +124,7 @@ msgstr ""
|
|||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:62
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:30
|
||||
#: src/apprt/gtk/Window.zig:255
|
||||
#: src/apprt/gtk/Window.zig:263
|
||||
msgid "New Tab"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -160,7 +165,7 @@ msgid "Terminal Inspector"
|
|||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:107
|
||||
#: src/apprt/gtk/Window.zig:1024
|
||||
#: src/apprt/gtk/Window.zig:1036
|
||||
msgid "About Ghostty"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -170,10 +175,13 @@ msgstr ""
|
|||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:6
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:6
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-read.blp:6
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-write.blp:6
|
||||
msgid "Authorize Clipboard Access"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:7
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-read.blp:7
|
||||
msgid ""
|
||||
"An application is attempting to read from the clipboard. The current "
|
||||
"clipboard contents are shown below."
|
||||
|
|
@ -181,52 +189,67 @@ msgstr ""
|
|||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:10
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:10
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-read.blp:10
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-write.blp:10
|
||||
msgid "Deny"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:11
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:11
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-read.blp:11
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-write.blp:11
|
||||
msgid "Allow"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:81
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:77
|
||||
msgid "Remember choice for this split"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:82
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:78
|
||||
msgid "Reload configuration to show this prompt again"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:7
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-write.blp:7
|
||||
msgid ""
|
||||
"An application is attempting to write to the clipboard. The current "
|
||||
"clipboard contents are shown below."
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:6
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:6 src/apprt/gtk/ui/1.2/ccw-paste.blp:6
|
||||
msgid "Warning: Potentially Unsafe Paste"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:7
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:7 src/apprt/gtk/ui/1.2/ccw-paste.blp:7
|
||||
msgid ""
|
||||
"Pasting this text into the terminal may be dangerous as it looks like some "
|
||||
"commands may be executed."
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/Window.zig:208
|
||||
#: src/apprt/gtk/Window.zig:216
|
||||
msgid "Main Menu"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/Window.zig:229
|
||||
#: src/apprt/gtk/Window.zig:238
|
||||
msgid "View Open Tabs"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/Window.zig:256
|
||||
#: src/apprt/gtk/Window.zig:264
|
||||
msgid "New Split"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/Window.zig:319
|
||||
#: src/apprt/gtk/Window.zig:327
|
||||
msgid ""
|
||||
"⚠️ You're running a debug build of Ghostty! Performance will be degraded."
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/Window.zig:765
|
||||
#: src/apprt/gtk/Window.zig:773
|
||||
msgid "Reloaded the configuration"
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/Window.zig:1005
|
||||
#: src/apprt/gtk/Window.zig:1017
|
||||
msgid "Ghostty Developers"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -270,6 +293,6 @@ msgstr ""
|
|||
msgid "The currently running process in this split will be terminated."
|
||||
msgstr ""
|
||||
|
||||
#: src/apprt/gtk/Surface.zig:1243
|
||||
#: src/apprt/gtk/Surface.zig:1257
|
||||
msgid "Copied to clipboard"
|
||||
msgstr ""
|
||||
|
|
|
|||
|
|
@ -0,0 +1,285 @@
|
|||
# Spanish translations for com.mitchellh.ghostty package.
|
||||
# Copyright (C) 2025 Mitchell Hashimoto
|
||||
# This file is distributed under the same license as the com.mitchellh.ghostty package.
|
||||
# Alan Moyano <alanmoyano203@gmail.com>, 2025.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: com.mitchellh.ghostty\n"
|
||||
"Report-Msgid-Bugs-To: m@mitchellh.com\n"
|
||||
"POT-Creation-Date: 2025-04-23 16:58+0800\n"
|
||||
"PO-Revision-Date: 2025-05-19 20:17-0300\n"
|
||||
"Last-Translator: Alan Moyano <alanmoyano203@gmail.com>\n"
|
||||
"Language-Team: Argentinian <es@tp.org.es>\n"
|
||||
"Language: es_AR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:5
|
||||
msgid "Change Terminal Title"
|
||||
msgstr "Cambiar el título de la terminal"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:6
|
||||
msgid "Leave blank to restore the default title."
|
||||
msgstr "Dejar en blanco para restaurar el título predeterminado."
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:9
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:10 src/apprt/gtk/CloseDialog.zig:44
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:10
|
||||
msgid "OK"
|
||||
msgstr "Aceptar"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:5
|
||||
msgid "Configuration Errors"
|
||||
msgstr "Errores de configuración"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:6
|
||||
msgid ""
|
||||
"One or more configuration errors were found. Please review the errors below, "
|
||||
"and either reload your configuration or ignore these errors."
|
||||
msgstr ""
|
||||
"Se encontraron uno o más errores de configuración. Por favor revisá los "
|
||||
"errores a continuación, y recargá tu configuración o ignorá estos errores."
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:9
|
||||
msgid "Ignore"
|
||||
msgstr "Ignorar"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:10
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:97
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:100
|
||||
msgid "Reload Configuration"
|
||||
msgstr "Recargar configuración"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:6
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:38
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:50
|
||||
msgid "Split Up"
|
||||
msgstr "Dividir arriba"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:11
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:43
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:55
|
||||
msgid "Split Down"
|
||||
msgstr "Dividir abajo"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:16
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:48
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:60
|
||||
msgid "Split Left"
|
||||
msgstr "Dividir a la izquierda"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:21
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:53
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:65
|
||||
msgid "Split Right"
|
||||
msgstr "Dividir a la derecha"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/command-palette.blp:16
|
||||
msgid "Execute a command…"
|
||||
msgstr "Ejecutar un comando…"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:6
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:6
|
||||
msgid "Copy"
|
||||
msgstr "Copiar"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:11
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:11
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:11
|
||||
msgid "Paste"
|
||||
msgstr "Pegar"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:18
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:73
|
||||
msgid "Clear"
|
||||
msgstr "Limpiar"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:23
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:78
|
||||
msgid "Reset"
|
||||
msgstr "Reiniciar"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:30
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:42
|
||||
msgid "Split"
|
||||
msgstr "Dividir"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:33
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:45
|
||||
msgid "Change Title…"
|
||||
msgstr "Cambiar título…"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:59
|
||||
msgid "Tab"
|
||||
msgstr "Pestaña"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:62
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:30
|
||||
#: src/apprt/gtk/Window.zig:255
|
||||
msgid "New Tab"
|
||||
msgstr "Nueva pestaña"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:67
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:35
|
||||
msgid "Close Tab"
|
||||
msgstr "Cerrar pestaña"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:73
|
||||
msgid "Window"
|
||||
msgstr "Ventana"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:76
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:18
|
||||
msgid "New Window"
|
||||
msgstr "Nueva ventana"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:81
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:23
|
||||
msgid "Close Window"
|
||||
msgstr "Cerrar ventana"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:89
|
||||
msgid "Config"
|
||||
msgstr "Configuración"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:92
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:95
|
||||
msgid "Open Configuration"
|
||||
msgstr "Abrir configuración"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:85
|
||||
msgid "Command Palette"
|
||||
msgstr "Paleta de comandos"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:90
|
||||
msgid "Terminal Inspector"
|
||||
msgstr "Inspector de la terminal"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:107
|
||||
#: src/apprt/gtk/Window.zig:1024
|
||||
msgid "About Ghostty"
|
||||
msgstr "Acerca de Ghostty"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:112
|
||||
msgid "Quit"
|
||||
msgstr "Salir"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:6
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:6
|
||||
msgid "Authorize Clipboard Access"
|
||||
msgstr "Autorizar acceso al portapapeles"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:7
|
||||
msgid ""
|
||||
"An application is attempting to read from the clipboard. The current "
|
||||
"clipboard contents are shown below."
|
||||
msgstr ""
|
||||
"Una aplicación está intentando leer desde el portapapeles. El contenido "
|
||||
"actual del portapapeles se muestra a continuación."
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:10
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:10
|
||||
msgid "Deny"
|
||||
msgstr "Denegar"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:11
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:11
|
||||
msgid "Allow"
|
||||
msgstr "Permitir"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:7
|
||||
msgid ""
|
||||
"An application is attempting to write to the clipboard. The current "
|
||||
"clipboard contents are shown below."
|
||||
msgstr ""
|
||||
"Una aplicación está intentando escribir en el portapapeles. El contenido "
|
||||
"actual del portapapeles se muestra a continuación."
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:6
|
||||
msgid "Warning: Potentially Unsafe Paste"
|
||||
msgstr "Advertencia: Pegado potencialmente inseguro"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:7
|
||||
msgid ""
|
||||
"Pasting this text into the terminal may be dangerous as it looks like some "
|
||||
"commands may be executed."
|
||||
msgstr ""
|
||||
"Pegar este texto en la terminal puede ser peligroso ya que parece que "
|
||||
"algunos comandos podrían ejecutarse."
|
||||
|
||||
#: src/apprt/gtk/Window.zig:208
|
||||
msgid "Main Menu"
|
||||
msgstr "Menú principal"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:229
|
||||
msgid "View Open Tabs"
|
||||
msgstr "Ver pestañas abiertas"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:256
|
||||
msgid "New Split"
|
||||
msgstr "Nueva división"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:319
|
||||
msgid ""
|
||||
"⚠️ You're running a debug build of Ghostty! Performance will be degraded."
|
||||
msgstr ""
|
||||
"⚠️ Estás ejecutando una versión de depuración de Ghostty. El rendimiento no "
|
||||
"será óptimo."
|
||||
|
||||
#: src/apprt/gtk/Window.zig:765
|
||||
msgid "Reloaded the configuration"
|
||||
msgstr "Configuración recargada"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:1005
|
||||
msgid "Ghostty Developers"
|
||||
msgstr "Desarrolladores de Ghostty"
|
||||
|
||||
#: src/apprt/gtk/inspector.zig:144
|
||||
msgid "Ghostty: Terminal Inspector"
|
||||
msgstr "Ghostty: Inspector de la terminal"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:47
|
||||
msgid "Close"
|
||||
msgstr "Cerrar"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:87
|
||||
msgid "Quit Ghostty?"
|
||||
msgstr "¿Salir de Ghostty?"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:88
|
||||
msgid "Close Window?"
|
||||
msgstr "¿Cerrar ventana?"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:89
|
||||
msgid "Close Tab?"
|
||||
msgstr "¿Cerrar pestaña?"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:90
|
||||
msgid "Close Split?"
|
||||
msgstr "¿Cerrar división?"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:96
|
||||
msgid "All terminal sessions will be terminated."
|
||||
msgstr "Todas las sesiones de terminal serán terminadas."
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:97
|
||||
msgid "All terminal sessions in this window will be terminated."
|
||||
msgstr "Todas las sesiones de terminal en esta ventana serán terminadas."
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:98
|
||||
msgid "All terminal sessions in this tab will be terminated."
|
||||
msgstr "Todas las sesiones de terminal en esta pestaña serán terminadas."
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:99
|
||||
msgid "The currently running process in this split will be terminated."
|
||||
msgstr "El proceso actualmente en ejecución en esta división será terminado."
|
||||
|
||||
#: src/apprt/gtk/Surface.zig:1243
|
||||
msgid "Copied to clipboard"
|
||||
msgstr "Copiado al portapapeles"
|
||||
|
|
@ -0,0 +1,286 @@
|
|||
# Irish translations for com.mitchellh.ghostty package.
|
||||
# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors
|
||||
# This file is distributed under the same license as the com.mitchellh.ghostty package.
|
||||
# Aindriú Mac Giolla Eoin <aindriu80@gmail.com>, 2025.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: com.mitchellh.ghostty\n"
|
||||
"Report-Msgid-Bugs-To: m@mitchellh.com\n"
|
||||
"POT-Creation-Date: 2025-04-23 16:58+0800\n"
|
||||
"PO-Revision-Date: 2025-06-29 21:15+0100\n"
|
||||
"Last-Translator: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>\n"
|
||||
"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
|
||||
"Language: ga\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n"
|
||||
"X-Generator: Poedit 3.4.4\n"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:5
|
||||
msgid "Change Terminal Title"
|
||||
msgstr "Athraigh teideal teirminéil"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:6
|
||||
msgid "Leave blank to restore the default title."
|
||||
msgstr "Fág bán chun an teideal réamhshocraithe a athbhunú."
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:9
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:10 src/apprt/gtk/CloseDialog.zig:44
|
||||
msgid "Cancel"
|
||||
msgstr "Cealaigh"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:10
|
||||
msgid "OK"
|
||||
msgstr "Ceart go leor"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:5
|
||||
msgid "Configuration Errors"
|
||||
msgstr "Earráidí cumraíochta"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:6
|
||||
msgid ""
|
||||
"One or more configuration errors were found. Please review the errors below, "
|
||||
"and either reload your configuration or ignore these errors."
|
||||
msgstr ""
|
||||
"Fuarthas earráid chumraíochta amháin nó níos mó. Athbhreithnigh na hearráidí "
|
||||
"thíos, agus athlódáil do chumraíocht nó déan neamhaird de na hearráidí seo."
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:9
|
||||
msgid "Ignore"
|
||||
msgstr "Déan neamhaird de"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:10
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:97
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:100
|
||||
msgid "Reload Configuration"
|
||||
msgstr "Athlódáil cumraíocht"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:6
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:38
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:50
|
||||
msgid "Split Up"
|
||||
msgstr "Scoilt suas"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:11
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:43
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:55
|
||||
msgid "Split Down"
|
||||
msgstr "Scoilt síos"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:16
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:48
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:60
|
||||
msgid "Split Left"
|
||||
msgstr "Scoilt ar chlé"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:21
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:53
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:65
|
||||
msgid "Split Right"
|
||||
msgstr "Scoilt ar dheis"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/command-palette.blp:16
|
||||
msgid "Execute a command…"
|
||||
msgstr "Rith ordú…"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:6
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:6
|
||||
msgid "Copy"
|
||||
msgstr "Cóipeáil"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:11
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:11
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:11
|
||||
msgid "Paste"
|
||||
msgstr "Greamaigh"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:18
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:73
|
||||
msgid "Clear"
|
||||
msgstr "Glan"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:23
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:78
|
||||
msgid "Reset"
|
||||
msgstr "Athshocraigh"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:30
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:42
|
||||
msgid "Split"
|
||||
msgstr "Scoilt"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:33
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:45
|
||||
msgid "Change Title…"
|
||||
msgstr "Athraigh teideal…"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:59
|
||||
msgid "Tab"
|
||||
msgstr "Táb"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:62
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:30
|
||||
#: src/apprt/gtk/Window.zig:255
|
||||
msgid "New Tab"
|
||||
msgstr "Táb nua"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:67
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:35
|
||||
msgid "Close Tab"
|
||||
msgstr "Dún táb"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:73
|
||||
msgid "Window"
|
||||
msgstr "Fuinneog"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:76
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:18
|
||||
msgid "New Window"
|
||||
msgstr "Fuinneog nua"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:81
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:23
|
||||
msgid "Close Window"
|
||||
msgstr "Dún fuinneog"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:89
|
||||
msgid "Config"
|
||||
msgstr "Cumraíocht"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:92
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:95
|
||||
msgid "Open Configuration"
|
||||
msgstr "Oscail cumraíocht"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:85
|
||||
msgid "Command Palette"
|
||||
msgstr "Pailéad ordaithe"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:90
|
||||
msgid "Terminal Inspector"
|
||||
msgstr "Cigire teirminéil"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:107
|
||||
#: src/apprt/gtk/Window.zig:1024
|
||||
msgid "About Ghostty"
|
||||
msgstr "Maidir le Ghostty"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:112
|
||||
msgid "Quit"
|
||||
msgstr "Scoir"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:6
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:6
|
||||
msgid "Authorize Clipboard Access"
|
||||
msgstr "Údarú rochtain ar an ngearrthaisce"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:7
|
||||
msgid ""
|
||||
"An application is attempting to read from the clipboard. The current "
|
||||
"clipboard contents are shown below."
|
||||
msgstr ""
|
||||
"Tá feidhmchlár ag iarraidh léamh ón ngearrthaisce. Taispeántar ábhar reatha "
|
||||
"an ghearrthaisce thíos."
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:10
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:10
|
||||
msgid "Deny"
|
||||
msgstr "Diúltaigh"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:11
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:11
|
||||
msgid "Allow"
|
||||
msgstr "Ceadaigh"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:7
|
||||
msgid ""
|
||||
"An application is attempting to write to the clipboard. The current "
|
||||
"clipboard contents are shown below."
|
||||
msgstr ""
|
||||
"Tá feidhmchlár ag iarraidh scríobh chuig an ngearrthaisce. Taispeántar ábhar "
|
||||
"reatha an ghearrthaisce thíos."
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:6
|
||||
msgid "Warning: Potentially Unsafe Paste"
|
||||
msgstr "Rabhadh: Greamaigh a d'fhéadfadh a bheith neamhshábháilte"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:7
|
||||
msgid ""
|
||||
"Pasting this text into the terminal may be dangerous as it looks like some "
|
||||
"commands may be executed."
|
||||
msgstr ""
|
||||
"D’fhéadfadh sé a bheith contúirteach an téacs seo a ghreamú isteach sa "
|
||||
"teirminéal, toisc go d'fhéadfadh roinnt orduithe a fhorghníomhú."
|
||||
|
||||
#: src/apprt/gtk/Window.zig:208
|
||||
msgid "Main Menu"
|
||||
msgstr "Príomh-Roghchlár"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:229
|
||||
msgid "View Open Tabs"
|
||||
msgstr "Féach ar na táib oscailte"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:256
|
||||
msgid "New Split"
|
||||
msgstr "Scoilt nua"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:319
|
||||
msgid ""
|
||||
"⚠️ You're running a debug build of Ghostty! Performance will be degraded."
|
||||
msgstr ""
|
||||
"⚠️ Tá leagan dífhabhtaithe de Ghostty á rith agat! Laghdófar an fheidhmíocht."
|
||||
|
||||
#: src/apprt/gtk/Window.zig:765
|
||||
msgid "Reloaded the configuration"
|
||||
msgstr "Tá an chumraíocht athlódáilte"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:1005
|
||||
msgid "Ghostty Developers"
|
||||
msgstr "Forbróirí Ghostty"
|
||||
|
||||
#: src/apprt/gtk/inspector.zig:144
|
||||
msgid "Ghostty: Terminal Inspector"
|
||||
msgstr "Ghostty: Cigire teirminéil"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:47
|
||||
msgid "Close"
|
||||
msgstr "Dún"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:87
|
||||
msgid "Quit Ghostty?"
|
||||
msgstr "Scoir Ghostty?"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:88
|
||||
msgid "Close Window?"
|
||||
msgstr "Dún fuinneog?"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:89
|
||||
msgid "Close Tab?"
|
||||
msgstr "Dún táb?"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:90
|
||||
msgid "Close Split?"
|
||||
msgstr "Dún an scoilt?"
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:96
|
||||
msgid "All terminal sessions will be terminated."
|
||||
msgstr "Cuirfear deireadh le gach seisiún teirminéil."
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:97
|
||||
msgid "All terminal sessions in this window will be terminated."
|
||||
msgstr "Cuirfear deireadh le gach seisiún teirminéil san fhuinneog seo."
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:98
|
||||
msgid "All terminal sessions in this tab will be terminated."
|
||||
msgstr "Cuirfear deireadh le gach seisiún teirminéil sa táb seo."
|
||||
|
||||
#: src/apprt/gtk/CloseDialog.zig:99
|
||||
msgid "The currently running process in this split will be terminated."
|
||||
msgstr ""
|
||||
"Cuirfear deireadh leis an bpróiseas atá ar siúl faoi láthair sa scoilt seo."
|
||||
|
||||
#: src/apprt/gtk/Surface.zig:1243
|
||||
msgid "Copied to clipboard"
|
||||
msgstr "Cóipeáilte chuig an ghearrthaisce"
|
||||
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: com.mitchellh.ghostty\n"
|
||||
"Report-Msgid-Bugs-To: m@mitchellh.com\n"
|
||||
"POT-Creation-Date: 2025-04-23 16:58+0800\n"
|
||||
"POT-Creation-Date: 2025-06-28 17:01+0200\n"
|
||||
"PO-Revision-Date: 2025-02-27 09:16+0100\n"
|
||||
"Last-Translator: Leah <hi@pluie.me>\n"
|
||||
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
|
||||
|
|
@ -26,7 +26,8 @@ msgid "Leave blank to restore the default title."
|
|||
msgstr "留空以重置至默认标题。"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:9
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:10 src/apprt/gtk/CloseDialog.zig:44
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:10 src/apprt/gtk/ui/1.2/ccw-paste.blp:10
|
||||
#: src/apprt/gtk/CloseDialog.zig:44
|
||||
msgid "Cancel"
|
||||
msgstr "取消"
|
||||
|
||||
|
|
@ -35,10 +36,12 @@ msgid "OK"
|
|||
msgstr "确认"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:5
|
||||
#: src/apprt/gtk/ui/1.2/config-errors-dialog.blp:5
|
||||
msgid "Configuration Errors"
|
||||
msgstr "配置错误"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:6
|
||||
#: src/apprt/gtk/ui/1.2/config-errors-dialog.blp:6
|
||||
msgid ""
|
||||
"One or more configuration errors were found. Please review the errors below, "
|
||||
"and either reload your configuration or ignore these errors."
|
||||
|
|
@ -46,12 +49,14 @@ msgstr ""
|
|||
"加载配置时发现了以下错误。请仔细阅读错误信息,并选择忽略或重新加载配置文件。"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:9
|
||||
#: src/apprt/gtk/ui/1.2/config-errors-dialog.blp:9
|
||||
msgid "Ignore"
|
||||
msgstr "忽略"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/config-errors-dialog.blp:10
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:97
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:100
|
||||
#: src/apprt/gtk/ui/1.2/config-errors-dialog.blp:10
|
||||
msgid "Reload Configuration"
|
||||
msgstr "重新加载配置"
|
||||
|
||||
|
|
@ -90,7 +95,7 @@ msgstr "复制"
|
|||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:11
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:11
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:11
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:11 src/apprt/gtk/ui/1.2/ccw-paste.blp:11
|
||||
msgid "Paste"
|
||||
msgstr "粘贴"
|
||||
|
||||
|
|
@ -120,7 +125,7 @@ msgstr "标签页"
|
|||
|
||||
#: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:62
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:30
|
||||
#: src/apprt/gtk/Window.zig:255
|
||||
#: src/apprt/gtk/Window.zig:263
|
||||
msgid "New Tab"
|
||||
msgstr "新建标签页"
|
||||
|
||||
|
|
@ -161,7 +166,7 @@ msgid "Terminal Inspector"
|
|||
msgstr "终端调试器"
|
||||
|
||||
#: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:107
|
||||
#: src/apprt/gtk/Window.zig:1024
|
||||
#: src/apprt/gtk/Window.zig:1036
|
||||
msgid "About Ghostty"
|
||||
msgstr "关于 Ghostty"
|
||||
|
||||
|
|
@ -171,10 +176,13 @@ msgstr "退出"
|
|||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:6
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:6
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-read.blp:6
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-write.blp:6
|
||||
msgid "Authorize Clipboard Access"
|
||||
msgstr "剪贴板访问授权"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:7
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-read.blp:7
|
||||
msgid ""
|
||||
"An application is attempting to read from the clipboard. The current "
|
||||
"clipboard contents are shown below."
|
||||
|
|
@ -182,52 +190,67 @@ msgstr "一个应用正在试图从剪贴板读取内容。剪贴板目前的内
|
|||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:10
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:10
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-read.blp:10
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-write.blp:10
|
||||
msgid "Deny"
|
||||
msgstr "拒绝"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:11
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:11
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-read.blp:11
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-write.blp:11
|
||||
msgid "Allow"
|
||||
msgstr "允许"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:81
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:77
|
||||
msgid "Remember choice for this split"
|
||||
msgstr "为本分屏记住当前选择"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:82
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:78
|
||||
msgid "Reload configuration to show this prompt again"
|
||||
msgstr "本提示将在重载配置后再次出现"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:7
|
||||
#: src/apprt/gtk/ui/1.2/ccw-osc-52-write.blp:7
|
||||
msgid ""
|
||||
"An application is attempting to write to the clipboard. The current "
|
||||
"clipboard contents are shown below."
|
||||
msgstr "一个应用正在试图向剪贴板写入内容。剪贴板目前的内容如下:"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:6
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:6 src/apprt/gtk/ui/1.2/ccw-paste.blp:6
|
||||
msgid "Warning: Potentially Unsafe Paste"
|
||||
msgstr "警告:粘贴内容可能不安全"
|
||||
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:7
|
||||
#: src/apprt/gtk/ui/1.5/ccw-paste.blp:7 src/apprt/gtk/ui/1.2/ccw-paste.blp:7
|
||||
msgid ""
|
||||
"Pasting this text into the terminal may be dangerous as it looks like some "
|
||||
"commands may be executed."
|
||||
msgstr "将以下内容粘贴至终端内将可能执行有害命令。"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:208
|
||||
#: src/apprt/gtk/Window.zig:216
|
||||
msgid "Main Menu"
|
||||
msgstr "主菜单"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:229
|
||||
#: src/apprt/gtk/Window.zig:238
|
||||
msgid "View Open Tabs"
|
||||
msgstr "浏览标签页"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:256
|
||||
#: src/apprt/gtk/Window.zig:264
|
||||
msgid "New Split"
|
||||
msgstr "新建分屏"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:319
|
||||
#: src/apprt/gtk/Window.zig:327
|
||||
msgid ""
|
||||
"⚠️ You're running a debug build of Ghostty! Performance will be degraded."
|
||||
msgstr "⚠️ Ghostty 正在以调试模式运行!性能将大打折扣。"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:765
|
||||
#: src/apprt/gtk/Window.zig:773
|
||||
msgid "Reloaded the configuration"
|
||||
msgstr "已重新加载配置"
|
||||
|
||||
#: src/apprt/gtk/Window.zig:1005
|
||||
#: src/apprt/gtk/Window.zig:1017
|
||||
msgid "Ghostty Developers"
|
||||
msgstr "Ghostty 开发团队"
|
||||
|
||||
|
|
@ -271,6 +294,6 @@ msgstr "标签页内所有运行中的进程将被终止。"
|
|||
msgid "The currently running process in this split will be terminated."
|
||||
msgstr "分屏内正在运行中的进程将被终止。"
|
||||
|
||||
#: src/apprt/gtk/Surface.zig:1243
|
||||
#: src/apprt/gtk/Surface.zig:1257
|
||||
msgid "Copied to clipboard"
|
||||
msgstr "已复制至剪贴板"
|
||||
|
|
|
|||
|
|
@ -4845,6 +4845,11 @@ fn writeScreenFile(
|
|||
const path = try tmp_dir.dir.realpath(filename, &path_buf);
|
||||
|
||||
switch (write_action) {
|
||||
.copy => {
|
||||
const pathZ = try self.alloc.dupeZ(u8, path);
|
||||
defer self.alloc.free(pathZ);
|
||||
try self.rt_surface.setClipboardString(pathZ, .standard, false);
|
||||
},
|
||||
.open => try internal_os.open(self.alloc, .text, path),
|
||||
.paste => self.io.queueMessage(try termio.Message.writeReq(
|
||||
self.alloc,
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ const adw_version = @import("adw_version.zig");
|
|||
|
||||
const log = std.log.scoped(.gtk);
|
||||
|
||||
const DialogType = if (adw_version.atLeast(1, 5, 0)) adw.AlertDialog else adw.MessageDialog;
|
||||
const DialogType = if (adw_version.supportsDialogs()) adw.AlertDialog else adw.MessageDialog;
|
||||
|
||||
app: *App,
|
||||
dialog: *DialogType,
|
||||
|
|
@ -28,6 +28,7 @@ text_view: *gtk.TextView,
|
|||
text_view_scroll: *gtk.ScrolledWindow,
|
||||
reveal_button: *gtk.Button,
|
||||
hide_button: *gtk.Button,
|
||||
remember_choice: if (adw_version.supportsSwitchRow()) ?*adw.SwitchRow else ?*anyopaque,
|
||||
|
||||
pub fn create(
|
||||
app: *App,
|
||||
|
|
@ -89,6 +90,10 @@ fn init(
|
|||
const reveal_button = builder.getObject(gtk.Button, "reveal_button").?;
|
||||
const hide_button = builder.getObject(gtk.Button, "hide_button").?;
|
||||
const text_view_scroll = builder.getObject(gtk.ScrolledWindow, "text_view_scroll").?;
|
||||
const remember_choice = if (adw_version.supportsSwitchRow())
|
||||
builder.getObject(adw.SwitchRow, "remember_choice")
|
||||
else
|
||||
null;
|
||||
|
||||
const copy = try app.core_app.alloc.dupeZ(u8, data);
|
||||
errdefer app.core_app.alloc.free(copy);
|
||||
|
|
@ -102,6 +107,7 @@ fn init(
|
|||
.text_view_scroll = text_view_scroll,
|
||||
.reveal_button = reveal_button,
|
||||
.hide_button = hide_button,
|
||||
.remember_choice = remember_choice,
|
||||
};
|
||||
|
||||
const buffer = gtk.TextBuffer.new(null);
|
||||
|
|
@ -152,8 +158,10 @@ fn init(
|
|||
}
|
||||
}
|
||||
|
||||
fn gtkResponse(_: *DialogType, response: [*:0]u8, self: *ClipboardConfirmation) callconv(.c) void {
|
||||
if (std.mem.orderZ(u8, response, "ok") == .eq) {
|
||||
fn handleResponse(self: *ClipboardConfirmation, response: [*:0]const u8) void {
|
||||
const is_ok = std.mem.orderZ(u8, response, "ok") == .eq;
|
||||
|
||||
if (is_ok) {
|
||||
self.core_surface.completeClipboardRequest(
|
||||
self.pending_req,
|
||||
self.data,
|
||||
|
|
@ -162,8 +170,30 @@ fn gtkResponse(_: *DialogType, response: [*:0]u8, self: *ClipboardConfirmation)
|
|||
log.err("Failed to requeue clipboard request: {}", .{err});
|
||||
};
|
||||
}
|
||||
|
||||
if (self.remember_choice) |remember| remember: {
|
||||
if (!adw_version.supportsSwitchRow()) break :remember;
|
||||
if (remember.getActive() == 0) break :remember;
|
||||
|
||||
switch (self.pending_req) {
|
||||
.osc_52_read => self.core_surface.config.clipboard_read = if (is_ok) .allow else .deny,
|
||||
.osc_52_write => self.core_surface.config.clipboard_write = if (is_ok) .allow else .deny,
|
||||
.paste => {},
|
||||
}
|
||||
}
|
||||
|
||||
self.destroy();
|
||||
}
|
||||
fn gtkChoose(dialog_: ?*gobject.Object, result: *gio.AsyncResult, ud: ?*anyopaque) callconv(.C) void {
|
||||
const dialog = gobject.ext.cast(DialogType, dialog_.?).?;
|
||||
const self: *ClipboardConfirmation = @ptrCast(@alignCast(ud.?));
|
||||
const response = dialog.chooseFinish(result);
|
||||
self.handleResponse(response);
|
||||
}
|
||||
|
||||
fn gtkResponse(_: *DialogType, response: [*:0]u8, self: *ClipboardConfirmation) callconv(.C) void {
|
||||
self.handleResponse(response);
|
||||
}
|
||||
|
||||
fn gtkRevealButtonClicked(_: *gtk.Button, self: *ClipboardConfirmation) callconv(.c) void {
|
||||
self.text_view_scroll.as(gtk.Widget).setSensitive(@intFromBool(true));
|
||||
|
|
|
|||
|
|
@ -109,6 +109,10 @@ pub inline fn supportsTabOverview() bool {
|
|||
return atLeast(1, 4, 0);
|
||||
}
|
||||
|
||||
pub inline fn supportsSwitchRow() bool {
|
||||
return atLeast(1, 4, 0);
|
||||
}
|
||||
|
||||
pub inline fn supportsToolbarView() bool {
|
||||
return atLeast(1, 4, 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,14 +64,18 @@ window.ssd.no-border-radius {
|
|||
padding: 0;
|
||||
}
|
||||
|
||||
.clipboard-overlay {
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.clipboard-content-view {
|
||||
filter: blur(0px);
|
||||
transition: filter 0.3s ease;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.clipboard-content-view.blurred {
|
||||
filter: blur(5px);
|
||||
transition: filter 0.3s ease;
|
||||
}
|
||||
|
||||
.command-palette-search {
|
||||
|
|
|
|||
|
|
@ -14,58 +14,72 @@ Adw.AlertDialog clipboard_confirmation_window {
|
|||
default-response: "cancel";
|
||||
close-response: "cancel";
|
||||
|
||||
extra-child: Overlay {
|
||||
extra-child: ListBox {
|
||||
selection-mode: none;
|
||||
|
||||
styles [
|
||||
"osd",
|
||||
"boxed-list-separate",
|
||||
]
|
||||
|
||||
ScrolledWindow text_view_scroll {
|
||||
width-request: 500;
|
||||
height-request: 250;
|
||||
|
||||
TextView text_view {
|
||||
cursor-visible: false;
|
||||
editable: false;
|
||||
monospace: true;
|
||||
top-margin: 8;
|
||||
left-margin: 8;
|
||||
bottom-margin: 8;
|
||||
right-margin: 8;
|
||||
|
||||
styles [
|
||||
"clipboard-content-view",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[overlay]
|
||||
Button reveal_button {
|
||||
visible: false;
|
||||
halign: end;
|
||||
valign: start;
|
||||
margin-end: 12;
|
||||
margin-top: 12;
|
||||
|
||||
Image {
|
||||
icon-name: "view-reveal-symbolic";
|
||||
}
|
||||
}
|
||||
|
||||
[overlay]
|
||||
Button hide_button {
|
||||
visible: false;
|
||||
halign: end;
|
||||
valign: start;
|
||||
margin-end: 12;
|
||||
margin-top: 12;
|
||||
|
||||
Overlay {
|
||||
styles [
|
||||
"opaque",
|
||||
"osd",
|
||||
"clipboard-overlay",
|
||||
]
|
||||
|
||||
Image {
|
||||
icon-name: "view-conceal-symbolic";
|
||||
ScrolledWindow text_view_scroll {
|
||||
width-request: 500;
|
||||
height-request: 200;
|
||||
|
||||
TextView text_view {
|
||||
cursor-visible: false;
|
||||
editable: false;
|
||||
monospace: true;
|
||||
top-margin: 8;
|
||||
left-margin: 8;
|
||||
bottom-margin: 8;
|
||||
right-margin: 8;
|
||||
|
||||
styles [
|
||||
"clipboard-content-view",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[overlay]
|
||||
Button reveal_button {
|
||||
visible: false;
|
||||
halign: end;
|
||||
valign: start;
|
||||
margin-end: 12;
|
||||
margin-top: 12;
|
||||
|
||||
Image {
|
||||
icon-name: "view-reveal-symbolic";
|
||||
}
|
||||
}
|
||||
|
||||
[overlay]
|
||||
Button hide_button {
|
||||
visible: false;
|
||||
halign: end;
|
||||
valign: start;
|
||||
margin-end: 12;
|
||||
margin-top: 12;
|
||||
|
||||
styles [
|
||||
"opaque",
|
||||
]
|
||||
|
||||
Image {
|
||||
icon-name: "view-conceal-symbolic";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Adw.SwitchRow remember_choice {
|
||||
title: _("Remember choice for this split");
|
||||
subtitle: _("Reload configuration to show this prompt again");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,58 +14,68 @@ Adw.AlertDialog clipboard_confirmation_window {
|
|||
default-response: "cancel";
|
||||
close-response: "cancel";
|
||||
|
||||
extra-child: Overlay {
|
||||
extra-child: ListBox {
|
||||
selection-mode: none;
|
||||
|
||||
styles [
|
||||
"osd",
|
||||
"boxed-list-separate",
|
||||
]
|
||||
|
||||
ScrolledWindow text_view_scroll {
|
||||
width-request: 500;
|
||||
height-request: 250;
|
||||
Overlay {
|
||||
styles [
|
||||
"osd",
|
||||
"clipboard-overlay",
|
||||
]
|
||||
|
||||
TextView text_view {
|
||||
cursor-visible: false;
|
||||
editable: false;
|
||||
monospace: true;
|
||||
top-margin: 8;
|
||||
left-margin: 8;
|
||||
bottom-margin: 8;
|
||||
right-margin: 8;
|
||||
ScrolledWindow text_view_scroll {
|
||||
width-request: 500;
|
||||
height-request: 200;
|
||||
|
||||
TextView text_view {
|
||||
cursor-visible: false;
|
||||
editable: false;
|
||||
monospace: true;
|
||||
top-margin: 8;
|
||||
left-margin: 8;
|
||||
bottom-margin: 8;
|
||||
right-margin: 8;
|
||||
|
||||
styles [
|
||||
"clipboard-content-view",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[overlay]
|
||||
Button reveal_button {
|
||||
visible: false;
|
||||
halign: end;
|
||||
valign: start;
|
||||
margin-end: 12;
|
||||
margin-top: 12;
|
||||
|
||||
Image {
|
||||
icon-name: "view-reveal-symbolic";
|
||||
}
|
||||
}
|
||||
|
||||
[overlay]
|
||||
Button hide_button {
|
||||
visible: false;
|
||||
halign: end;
|
||||
valign: start;
|
||||
margin-end: 12;
|
||||
margin-top: 12;
|
||||
|
||||
styles [
|
||||
"clipboard-content-view",
|
||||
"opaque",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
[overlay]
|
||||
Button reveal_button {
|
||||
visible: false;
|
||||
halign: end;
|
||||
valign: start;
|
||||
margin-end: 12;
|
||||
margin-top: 12;
|
||||
|
||||
Image {
|
||||
icon-name: "view-reveal-symbolic";
|
||||
}
|
||||
}
|
||||
|
||||
[overlay]
|
||||
Button hide_button {
|
||||
visible: false;
|
||||
halign: end;
|
||||
valign: start;
|
||||
margin-end: 12;
|
||||
margin-top: 12;
|
||||
|
||||
styles [
|
||||
"opaque",
|
||||
]
|
||||
|
||||
Image {
|
||||
icon-name: "view-conceal-symbolic";
|
||||
}
|
||||
Adw.SwitchRow remember_choice {
|
||||
title: _("Remember choice for this split");
|
||||
subtitle: _("Reload configuration to show this prompt again");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@ const diags = @import("cli/diagnostics.zig");
|
|||
|
||||
pub const args = @import("cli/args.zig");
|
||||
pub const Action = @import("cli/action.zig").Action;
|
||||
pub const CompatibilityHandler = args.CompatibilityHandler;
|
||||
pub const compatibilityRenamed = args.compatibilityRenamed;
|
||||
pub const DiagnosticList = diags.DiagnosticList;
|
||||
pub const Diagnostic = diags.Diagnostic;
|
||||
pub const Location = diags.Location;
|
||||
|
|
|
|||
200
src/cli/args.zig
200
src/cli/args.zig
|
|
@ -40,11 +40,14 @@ pub const Error = error{
|
|||
/// "DiagnosticList" and any diagnostic messages will be added to that list.
|
||||
/// When diagnostics are present, only allocation errors will be returned.
|
||||
///
|
||||
/// If the destination type has a decl "renamed", it must be of type
|
||||
/// std.StaticStringMap([]const u8) and contains a mapping from the old
|
||||
/// field name to the new field name. This is used to allow renaming fields
|
||||
/// while still supporting the old name. If a renamed field is set, parsing
|
||||
/// will automatically set the new field name.
|
||||
/// If the destination type has a decl "compatibility", it must be of type
|
||||
/// std.StaticStringMap(CompatibilityHandler(T)), and it will be used to
|
||||
/// handle backwards compatibility for fields with the given name. The
|
||||
/// field name doesn't need to exist (so you can setup compatibility for
|
||||
/// removed fields). The value is a function that will be called when
|
||||
/// all other parsing fails for that field. If a field changes such that
|
||||
/// the old values would NOT error, then the caller should handle that
|
||||
/// downstream after parsing is done, not through this method.
|
||||
///
|
||||
/// Note: If the arena is already non-null, then it will be used. In this
|
||||
/// case, in the case of an error some memory might be leaked into the arena.
|
||||
|
|
@ -57,24 +60,6 @@ pub fn parse(
|
|||
const info = @typeInfo(T);
|
||||
assert(info == .@"struct");
|
||||
|
||||
comptime {
|
||||
// Verify all renamed fields are valid (source does not exist,
|
||||
// destination does exist).
|
||||
if (@hasDecl(T, "renamed")) {
|
||||
for (T.renamed.keys(), T.renamed.values()) |key, value| {
|
||||
if (@hasField(T, key)) {
|
||||
@compileLog(key);
|
||||
@compileError("renamed field source exists");
|
||||
}
|
||||
|
||||
if (!@hasField(T, value)) {
|
||||
@compileLog(value);
|
||||
@compileError("renamed field destination does not exist");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Make an arena for all our allocations if we support it. Otherwise,
|
||||
// use an allocator that always fails. If the arena is already set on
|
||||
// the config, then we reuse that. See memory note in parse docs.
|
||||
|
|
@ -147,7 +132,23 @@ pub fn parse(
|
|||
break :value null;
|
||||
};
|
||||
|
||||
parseIntoField(T, arena_alloc, dst, key, value) catch |err| {
|
||||
parseIntoField(T, arena_alloc, dst, key, value) catch |err| err: {
|
||||
// If we get an error parsing a field, then we try to fall
|
||||
// back to compatibility handlers if able.
|
||||
if (@hasDecl(T, "compatibility")) {
|
||||
// If we have a compatibility handler for this key, then
|
||||
// we call it and see if it handles the error.
|
||||
if (T.compatibility.get(key)) |handler| {
|
||||
if (handler(dst, arena_alloc, key, value)) {
|
||||
log.info(
|
||||
"compatibility handler for {s} handled error, you may be using a deprecated field: {}",
|
||||
.{ key, err },
|
||||
);
|
||||
break :err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (comptime !canTrackDiags(T)) return err;
|
||||
|
||||
// The error set is dependent on comptime T, so we always add
|
||||
|
|
@ -177,6 +178,58 @@ pub fn parse(
|
|||
}
|
||||
}
|
||||
|
||||
/// The function type for a compatibility handler. The compatibility
|
||||
/// handler is documented in the `parse` function documentation.
|
||||
///
|
||||
/// The function type should return bool if the compatibility was
|
||||
/// handled, and false otherwise. If false is returned then the
|
||||
/// naturally occurring error will continue to be processed as if
|
||||
/// this compatibility handler was not present.
|
||||
///
|
||||
/// Compatibility handlers aren't allowed to return errors because
|
||||
/// they're generally only called in error cases, so we already have
|
||||
/// an error message to show users. If there is an error in handling
|
||||
/// the compatibility, then the handler should return false.
|
||||
pub fn CompatibilityHandler(comptime T: type) type {
|
||||
return *const fn (
|
||||
dst: *T,
|
||||
alloc: Allocator,
|
||||
key: []const u8,
|
||||
value: ?[]const u8,
|
||||
) bool;
|
||||
}
|
||||
|
||||
/// Convenience function to create a compatibility handler that
|
||||
/// renames a field from `from` to `to`.
|
||||
pub fn compatibilityRenamed(
|
||||
comptime T: type,
|
||||
comptime to: []const u8,
|
||||
) CompatibilityHandler(T) {
|
||||
comptime assert(@hasField(T, to));
|
||||
|
||||
return (struct {
|
||||
fn compat(
|
||||
dst: *T,
|
||||
alloc: Allocator,
|
||||
key: []const u8,
|
||||
value: ?[]const u8,
|
||||
) bool {
|
||||
_ = key;
|
||||
|
||||
parseIntoField(T, alloc, dst, to, value) catch |err| {
|
||||
log.warn("error parsing renamed field {s}: {}", .{
|
||||
to,
|
||||
err,
|
||||
});
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
return true;
|
||||
}
|
||||
}).compat;
|
||||
}
|
||||
|
||||
fn formatValueRequired(
|
||||
comptime T: type,
|
||||
arena_alloc: std.mem.Allocator,
|
||||
|
|
@ -401,16 +454,6 @@ pub fn parseIntoField(
|
|||
}
|
||||
}
|
||||
|
||||
// Unknown field, is the field renamed?
|
||||
if (@hasDecl(T, "renamed")) {
|
||||
for (T.renamed.keys(), T.renamed.values()) |old, new| {
|
||||
if (mem.eql(u8, old, key)) {
|
||||
try parseIntoField(T, alloc, dst, new, value);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return error.InvalidField;
|
||||
}
|
||||
|
||||
|
|
@ -752,6 +795,77 @@ test "parse: diagnostic location" {
|
|||
}
|
||||
}
|
||||
|
||||
test "parse: compatibility handler" {
|
||||
const testing = std.testing;
|
||||
|
||||
var data: struct {
|
||||
a: bool = false,
|
||||
_arena: ?ArenaAllocator = null,
|
||||
|
||||
pub const compatibility: std.StaticStringMap(
|
||||
CompatibilityHandler(@This()),
|
||||
) = .initComptime(&.{
|
||||
.{ "a", compat },
|
||||
});
|
||||
|
||||
fn compat(
|
||||
self: *@This(),
|
||||
alloc: Allocator,
|
||||
key: []const u8,
|
||||
value: ?[]const u8,
|
||||
) bool {
|
||||
_ = alloc;
|
||||
if (std.mem.eql(u8, key, "a")) {
|
||||
if (value) |v| {
|
||||
if (mem.eql(u8, v, "yuh")) {
|
||||
self.a = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
} = .{};
|
||||
defer if (data._arena) |arena| arena.deinit();
|
||||
|
||||
var iter = try std.process.ArgIteratorGeneral(.{}).init(
|
||||
testing.allocator,
|
||||
"--a=yuh",
|
||||
);
|
||||
defer iter.deinit();
|
||||
try parse(@TypeOf(data), testing.allocator, &data, &iter);
|
||||
try testing.expect(data._arena != null);
|
||||
try testing.expect(data.a);
|
||||
}
|
||||
|
||||
test "parse: compatibility renamed" {
|
||||
const testing = std.testing;
|
||||
|
||||
var data: struct {
|
||||
a: bool = false,
|
||||
b: bool = false,
|
||||
_arena: ?ArenaAllocator = null,
|
||||
|
||||
pub const compatibility: std.StaticStringMap(
|
||||
CompatibilityHandler(@This()),
|
||||
) = .initComptime(&.{
|
||||
.{ "old", compatibilityRenamed(@This(), "a") },
|
||||
});
|
||||
} = .{};
|
||||
defer if (data._arena) |arena| arena.deinit();
|
||||
|
||||
var iter = try std.process.ArgIteratorGeneral(.{}).init(
|
||||
testing.allocator,
|
||||
"--old=true --b=true",
|
||||
);
|
||||
defer iter.deinit();
|
||||
try parse(@TypeOf(data), testing.allocator, &data, &iter);
|
||||
try testing.expect(data._arena != null);
|
||||
try testing.expect(data.a);
|
||||
try testing.expect(data.b);
|
||||
}
|
||||
|
||||
test "parseIntoField: ignore underscore-prefixed fields" {
|
||||
const testing = std.testing;
|
||||
var arena = ArenaAllocator.init(testing.allocator);
|
||||
|
|
@ -1176,24 +1290,6 @@ test "parseIntoField: tagged union missing tag" {
|
|||
);
|
||||
}
|
||||
|
||||
test "parseIntoField: renamed field" {
|
||||
const testing = std.testing;
|
||||
var arena = ArenaAllocator.init(testing.allocator);
|
||||
defer arena.deinit();
|
||||
const alloc = arena.allocator();
|
||||
|
||||
var data: struct {
|
||||
a: []const u8,
|
||||
|
||||
const renamed = std.StaticStringMap([]const u8).initComptime(&.{
|
||||
.{ "old", "a" },
|
||||
});
|
||||
} = undefined;
|
||||
|
||||
try parseIntoField(@TypeOf(data), alloc, &data, "old", "42");
|
||||
try testing.expectEqualStrings("42", data.a);
|
||||
}
|
||||
|
||||
/// An iterator that considers its location to be CLI args. It
|
||||
/// iterates through an underlying iterator and increments a counter
|
||||
/// to track the current CLI arg index.
|
||||
|
|
|
|||
|
|
@ -46,14 +46,22 @@ const c = @cImport({
|
|||
@cInclude("unistd.h");
|
||||
});
|
||||
|
||||
/// Renamed fields, used by cli.parse
|
||||
pub const renamed = std.StaticStringMap([]const u8).initComptime(&.{
|
||||
pub const compatibility = std.StaticStringMap(
|
||||
cli.CompatibilityHandler(Config),
|
||||
).initComptime(&.{
|
||||
// Ghostty 1.1 introduced background-blur support for Linux which
|
||||
// doesn't support a specific radius value. The renaming is to let
|
||||
// one field be used for both platforms (macOS retained the ability
|
||||
// to set a radius).
|
||||
.{ "background-blur-radius", "background-blur" },
|
||||
.{ "adw-toolbar-style", "gtk-toolbar-style" },
|
||||
.{ "background-blur-radius", cli.compatibilityRenamed(Config, "background-blur") },
|
||||
|
||||
// Ghostty 1.2 renamed all our adw options to gtk because we now have
|
||||
// a hard dependency on libadwaita.
|
||||
.{ "adw-toolbar-style", cli.compatibilityRenamed(Config, "gtk-toolbar-style") },
|
||||
|
||||
// Ghostty 1.2 removed the `hidden` value from `gtk-tabs-location` and
|
||||
// moved it to `window-show-tab-bar`.
|
||||
.{ "gtk-tabs-location", compatGtkTabsLocation },
|
||||
});
|
||||
|
||||
/// The font families to use.
|
||||
|
|
@ -3792,6 +3800,27 @@ pub fn parseManuallyHook(
|
|||
return true;
|
||||
}
|
||||
|
||||
/// parseFieldManuallyFallback is a fallback called only when
|
||||
/// parsing the field directly failed. It can be used to implement
|
||||
/// backward compatibility. Since this is only called when parsing
|
||||
/// fails, it doesn't impact happy-path performance.
|
||||
fn compatGtkTabsLocation(
|
||||
self: *Config,
|
||||
alloc: Allocator,
|
||||
key: []const u8,
|
||||
value: ?[]const u8,
|
||||
) bool {
|
||||
_ = alloc;
|
||||
assert(std.mem.eql(u8, key, "gtk-tabs-location"));
|
||||
|
||||
if (std.mem.eql(u8, value orelse "", "hidden")) {
|
||||
self.@"window-show-tab-bar" = .never;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Create a shallow copy of this config. This will share all the memory
|
||||
/// allocated with the previous config but will have a new arena for
|
||||
/// any changes or new allocations. The config should have `deinit`
|
||||
|
|
@ -5003,6 +5032,12 @@ pub const Keybinds = struct {
|
|||
.{ .reset_font_size = {} },
|
||||
);
|
||||
|
||||
try self.set.put(
|
||||
alloc,
|
||||
.{ .key = .{ .unicode = 'j' }, .mods = .{ .shift = true, .ctrl = true, .super = true } },
|
||||
.{ .write_screen_file = .copy },
|
||||
);
|
||||
|
||||
try self.set.put(
|
||||
alloc,
|
||||
.{ .key = .{ .unicode = 'j' }, .mods = inputpkg.ctrlOrSuper(.{ .shift = true }) },
|
||||
|
|
|
|||
|
|
@ -379,6 +379,10 @@ pub const Action = union(enum) {
|
|||
///
|
||||
/// Valid actions are:
|
||||
///
|
||||
/// - `copy`
|
||||
///
|
||||
/// Copy the file path into the clipboard.
|
||||
///
|
||||
/// - `paste`
|
||||
///
|
||||
/// Paste the file path into the terminal.
|
||||
|
|
@ -813,6 +817,7 @@ pub const Action = union(enum) {
|
|||
};
|
||||
|
||||
pub const WriteScreenAction = enum {
|
||||
copy,
|
||||
paste,
|
||||
open,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -204,6 +204,11 @@ fn actionCommands(action: Action.Key) []const Command {
|
|||
}},
|
||||
|
||||
.write_screen_file => comptime &.{
|
||||
.{
|
||||
.action = .{ .write_screen_file = .copy },
|
||||
.title = "Copy Screen to Temporary File and Copy Path",
|
||||
.description = "Copy the screen contents to a temporary file and copy the path to the clipboard.",
|
||||
},
|
||||
.{
|
||||
.action = .{ .write_screen_file = .paste },
|
||||
.title = "Copy Screen to Temporary File and Paste Path",
|
||||
|
|
@ -217,6 +222,11 @@ fn actionCommands(action: Action.Key) []const Command {
|
|||
},
|
||||
|
||||
.write_selection_file => comptime &.{
|
||||
.{
|
||||
.action = .{ .write_selection_file = .copy },
|
||||
.title = "Copy Selection to Temporary File and Copy Path",
|
||||
.description = "Copy the selection contents to a temporary file and copy the path to the clipboard.",
|
||||
},
|
||||
.{
|
||||
.action = .{ .write_selection_file = .paste },
|
||||
.title = "Copy Selection to Temporary File and Paste Path",
|
||||
|
|
|
|||
|
|
@ -44,8 +44,10 @@ pub const locales = [_][:0]const u8{
|
|||
"tr_TR.UTF-8",
|
||||
"id_ID.UTF-8",
|
||||
"es_BO.UTF-8",
|
||||
"es_AR.UTF-8",
|
||||
"pt_BR.UTF-8",
|
||||
"ca_ES.UTF-8",
|
||||
"ga_IE.UTF-8",
|
||||
};
|
||||
|
||||
/// Set for faster membership lookup of locales.
|
||||
|
|
|
|||
|
|
@ -3068,6 +3068,29 @@ pub fn testWriteString(self: *Screen, text: []const u8) !void {
|
|||
}
|
||||
}
|
||||
|
||||
/// Write text that's marked as a semantic prompt.
|
||||
fn testWriteSemanticString(self: *Screen, text: []const u8, semantic_prompt: Row.SemanticPrompt) !void {
|
||||
// Determine the first row using the cursor position. If we know that our
|
||||
// first write is going to start on the next line because of a pending
|
||||
// wrap, we'll proactively start there.
|
||||
const start_y = if (self.cursor.pending_wrap) self.cursor.y + 1 else self.cursor.y;
|
||||
|
||||
try self.testWriteString(text);
|
||||
|
||||
// Determine the last row that we actually wrote by inspecting the cursor's
|
||||
// position. If we're in the first column, we haven't actually written any
|
||||
// characters to it, so we end at the preceding row instead.
|
||||
const end_y = if (self.cursor.x > 0) self.cursor.y else self.cursor.y - 1;
|
||||
|
||||
// Mark the full range of written rows with our semantic prompt.
|
||||
var y = start_y;
|
||||
while (y <= end_y) {
|
||||
const pin = self.pages.pin(.{ .active = .{ .y = y } }).?;
|
||||
pin.rowAndCell().row.semantic_prompt = semantic_prompt;
|
||||
y += 1;
|
||||
}
|
||||
}
|
||||
|
||||
test "Screen read and write" {
|
||||
const testing = std.testing;
|
||||
const alloc = testing.allocator;
|
||||
|
|
@ -3686,16 +3709,11 @@ test "Screen: clearPrompt" {
|
|||
|
||||
var s = try init(alloc, 5, 3, 0);
|
||||
defer s.deinit();
|
||||
const str = "1ABCD\n2EFGH\n3IJKL";
|
||||
try s.testWriteString(str);
|
||||
|
||||
// Set one of the rows to be a prompt
|
||||
{
|
||||
s.cursorAbsolute(0, 1);
|
||||
s.cursor.page_row.semantic_prompt = .prompt;
|
||||
s.cursorAbsolute(0, 2);
|
||||
s.cursor.page_row.semantic_prompt = .input;
|
||||
}
|
||||
try s.testWriteSemanticString("1ABCD\n", .unknown);
|
||||
try s.testWriteSemanticString("2EFGH\n", .prompt);
|
||||
try s.testWriteSemanticString("3IJKL", .input);
|
||||
|
||||
s.clearPrompt();
|
||||
|
||||
|
|
@ -3712,18 +3730,12 @@ test "Screen: clearPrompt continuation" {
|
|||
|
||||
var s = try init(alloc, 5, 4, 0);
|
||||
defer s.deinit();
|
||||
const str = "1ABCD\n2EFGH\n3IJKL\n4MNOP";
|
||||
try s.testWriteString(str);
|
||||
|
||||
// Set one of the rows to be a prompt followed by a continuation row
|
||||
{
|
||||
s.cursorAbsolute(0, 1);
|
||||
s.cursor.page_row.semantic_prompt = .prompt;
|
||||
s.cursorAbsolute(0, 2);
|
||||
s.cursor.page_row.semantic_prompt = .prompt_continuation;
|
||||
s.cursorAbsolute(0, 3);
|
||||
s.cursor.page_row.semantic_prompt = .input;
|
||||
}
|
||||
try s.testWriteSemanticString("1ABCD\n", .unknown);
|
||||
try s.testWriteSemanticString("2EFGH\n", .prompt);
|
||||
try s.testWriteSemanticString("3IJKL\n", .prompt_continuation);
|
||||
try s.testWriteSemanticString("4MNOP", .input);
|
||||
|
||||
s.clearPrompt();
|
||||
|
||||
|
|
@ -3734,22 +3746,17 @@ test "Screen: clearPrompt continuation" {
|
|||
}
|
||||
}
|
||||
|
||||
test "Screen: clearPrompt consecutive prompts" {
|
||||
test "Screen: clearPrompt consecutive inputs" {
|
||||
const testing = std.testing;
|
||||
const alloc = testing.allocator;
|
||||
|
||||
var s = try init(alloc, 5, 3, 0);
|
||||
defer s.deinit();
|
||||
const str = "1ABCD\n2EFGH\n3IJKL";
|
||||
try s.testWriteString(str);
|
||||
|
||||
// Set both rows to be prompts
|
||||
{
|
||||
s.cursorAbsolute(0, 1);
|
||||
s.cursor.page_row.semantic_prompt = .input;
|
||||
s.cursorAbsolute(0, 2);
|
||||
s.cursor.page_row.semantic_prompt = .input;
|
||||
}
|
||||
// Set both rows to be inputs
|
||||
try s.testWriteSemanticString("1ABCD\n", .unknown);
|
||||
try s.testWriteSemanticString("2EFGH\n", .input);
|
||||
try s.testWriteSemanticString("3IJKL", .input);
|
||||
|
||||
s.clearPrompt();
|
||||
|
||||
|
|
@ -6057,26 +6064,24 @@ test "Screen: resize more cols no reflow preserves semantic prompt" {
|
|||
|
||||
var s = try init(alloc, 5, 3, 0);
|
||||
defer s.deinit();
|
||||
const str = "1ABCD\n2EFGH\n3IJKL";
|
||||
try s.testWriteString(str);
|
||||
|
||||
// Set one of the rows to be a prompt
|
||||
{
|
||||
s.cursorAbsolute(0, 1);
|
||||
s.cursor.page_row.semantic_prompt = .prompt;
|
||||
}
|
||||
try s.testWriteSemanticString("1ABCD\n", .unknown);
|
||||
try s.testWriteSemanticString("2EFGH\n", .prompt);
|
||||
try s.testWriteSemanticString("3IJKL", .unknown);
|
||||
|
||||
try s.resize(10, 3);
|
||||
|
||||
const expected = "1ABCD\n2EFGH\n3IJKL";
|
||||
{
|
||||
const contents = try s.dumpStringAlloc(alloc, .{ .viewport = .{} });
|
||||
defer alloc.free(contents);
|
||||
try testing.expectEqualStrings(str, contents);
|
||||
try testing.expectEqualStrings(expected, contents);
|
||||
}
|
||||
{
|
||||
const contents = try s.dumpStringAlloc(alloc, .{ .screen = .{} });
|
||||
defer alloc.free(contents);
|
||||
try testing.expectEqualStrings(str, contents);
|
||||
try testing.expectEqualStrings(expected, contents);
|
||||
}
|
||||
|
||||
// Our one row should still be a semantic prompt, the others should not.
|
||||
|
|
@ -7507,7 +7512,9 @@ test "Screen: selectLine semantic prompt boundary" {
|
|||
|
||||
var s = try init(alloc, 5, 10, 0);
|
||||
defer s.deinit();
|
||||
try s.testWriteString("ABCDE\nA > ");
|
||||
try s.testWriteSemanticString("ABCDE\n", .unknown);
|
||||
try s.testWriteSemanticString("A ", .prompt);
|
||||
try s.testWriteSemanticString("> ", .unknown);
|
||||
|
||||
{
|
||||
const contents = try s.dumpStringAlloc(alloc, .{ .screen = .{} });
|
||||
|
|
@ -7515,12 +7522,6 @@ test "Screen: selectLine semantic prompt boundary" {
|
|||
try testing.expectEqualStrings("ABCDE\nA \n> ", contents);
|
||||
}
|
||||
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 1 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .prompt;
|
||||
}
|
||||
|
||||
// Selecting output stops at the prompt even if soft-wrapped
|
||||
{
|
||||
var sel = s.selectLine(.{ .pin = s.pages.pin(.{ .active = .{
|
||||
|
|
@ -7905,55 +7906,23 @@ test "Screen: selectOutput" {
|
|||
// zig fmt: off
|
||||
{
|
||||
// line number:
|
||||
try s.testWriteString("output1\n"); // 0
|
||||
try s.testWriteString("output1\n"); // 1
|
||||
try s.testWriteString("prompt2\n"); // 2
|
||||
try s.testWriteString("input2\n"); // 3
|
||||
try s.testWriteString("output2output2output2output2\n"); // 4, 5, 6 due to overflow
|
||||
try s.testWriteString("output2\n"); // 7
|
||||
try s.testWriteString("$ input3\n"); // 8
|
||||
try s.testWriteString("output3\n"); // 9
|
||||
try s.testWriteString("output3\n"); // 10
|
||||
try s.testWriteString("output3"); // 11
|
||||
try s.testWriteSemanticString("output1\n", .command); // 0
|
||||
try s.testWriteSemanticString("output1\n", .command); // 1
|
||||
try s.testWriteSemanticString("prompt2\n", .prompt); // 2
|
||||
try s.testWriteSemanticString("input2\n", .input); // 3
|
||||
try s.testWriteSemanticString( //
|
||||
"output2output2output2output2\n", // 4, 5, 6 due to overflow
|
||||
.command, //
|
||||
); //
|
||||
try s.testWriteSemanticString("output2\n", .command); // 7
|
||||
try s.testWriteSemanticString("$ ", .prompt); // 8 prompt
|
||||
try s.testWriteSemanticString("input3\n", .input); // 8 input
|
||||
try s.testWriteSemanticString("output3\n", .command); // 9
|
||||
try s.testWriteSemanticString("output3\n", .command); // 10
|
||||
try s.testWriteSemanticString("output3", .command); // 11
|
||||
}
|
||||
// zig fmt: on
|
||||
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 2 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .prompt;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 3 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .input;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 4 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .command;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 5 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .command;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 6 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .command;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 8 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .input;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 9 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .command;
|
||||
}
|
||||
|
||||
// No start marker, should select from the beginning
|
||||
{
|
||||
var sel = s.selectOutput(s.pages.pin(.{ .active = .{
|
||||
|
|
@ -8006,19 +7975,10 @@ test "Screen: selectOutput" {
|
|||
{
|
||||
s.deinit();
|
||||
s = try init(alloc, 10, 5, 0);
|
||||
try s.testWriteString("$ input1\n");
|
||||
try s.testWriteString("output1\n");
|
||||
try s.testWriteString("prompt2\n");
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 0 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .input;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 1 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .command;
|
||||
}
|
||||
try s.testWriteSemanticString("$ ", .prompt);
|
||||
try s.testWriteSemanticString("input1\n", .input);
|
||||
try s.testWriteSemanticString("output1\n", .command);
|
||||
try s.testWriteSemanticString("prompt2\n", .prompt);
|
||||
try testing.expect(s.selectOutput(s.pages.pin(.{ .active = .{
|
||||
.x = 2,
|
||||
.y = 0,
|
||||
|
|
@ -8035,46 +7995,21 @@ test "Screen: selectPrompt basics" {
|
|||
|
||||
// zig fmt: off
|
||||
{
|
||||
// line number:
|
||||
try s.testWriteString("output1\n"); // 0
|
||||
try s.testWriteString("output1\n"); // 1
|
||||
try s.testWriteString("prompt2\n"); // 2
|
||||
try s.testWriteString("input2\n"); // 3
|
||||
try s.testWriteString("output2\n"); // 4
|
||||
try s.testWriteString("output2\n"); // 5
|
||||
try s.testWriteString("$ input3\n"); // 6
|
||||
try s.testWriteString("output3\n"); // 7
|
||||
try s.testWriteString("output3\n"); // 8
|
||||
try s.testWriteString("output3"); // 9
|
||||
// line number:
|
||||
try s.testWriteSemanticString("output1\n", .command); // 0
|
||||
try s.testWriteSemanticString("output1\n", .command); // 1
|
||||
try s.testWriteSemanticString("prompt2\n", .prompt); // 2
|
||||
try s.testWriteSemanticString("input2\n", .input); // 3
|
||||
try s.testWriteSemanticString("output2\n", .command); // 4
|
||||
try s.testWriteSemanticString("output2\n", .command); // 5
|
||||
try s.testWriteSemanticString("$ ", .prompt); // 6 prompt
|
||||
try s.testWriteSemanticString("input3\n", .input); // 6 input
|
||||
try s.testWriteSemanticString("output3\n", .command); // 7
|
||||
try s.testWriteSemanticString("output3\n", .command); // 8
|
||||
try s.testWriteSemanticString("output3", .command); // 9
|
||||
}
|
||||
// zig fmt: on
|
||||
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 2 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .prompt;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 3 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .input;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 4 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .command;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 6 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .input;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 7 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .command;
|
||||
}
|
||||
|
||||
// Not at a prompt
|
||||
{
|
||||
const sel = s.selectPrompt(s.pages.pin(.{ .active = .{
|
||||
|
|
@ -8135,30 +8070,14 @@ test "Screen: selectPrompt prompt at start" {
|
|||
|
||||
// zig fmt: off
|
||||
{
|
||||
// line number:
|
||||
try s.testWriteString("prompt1\n"); // 0
|
||||
try s.testWriteString("input1\n"); // 1
|
||||
try s.testWriteString("output2\n"); // 2
|
||||
try s.testWriteString("output2\n"); // 3
|
||||
// line number:
|
||||
try s.testWriteSemanticString("prompt1\n", .prompt); // 0
|
||||
try s.testWriteSemanticString("input1\n", .input); // 1
|
||||
try s.testWriteSemanticString("output2\n", .command); // 2
|
||||
try s.testWriteSemanticString("output2\n", .command); // 3
|
||||
}
|
||||
// zig fmt: on
|
||||
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 0 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .prompt;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 1 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .input;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 2 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .command;
|
||||
}
|
||||
|
||||
// Not at a prompt
|
||||
{
|
||||
const sel = s.selectPrompt(s.pages.pin(.{ .active = .{
|
||||
|
|
@ -8195,25 +8114,14 @@ test "Screen: selectPrompt prompt at end" {
|
|||
|
||||
// zig fmt: off
|
||||
{
|
||||
// line number:
|
||||
try s.testWriteString("output2\n"); // 0
|
||||
try s.testWriteString("output2\n"); // 1
|
||||
try s.testWriteString("prompt1\n"); // 2
|
||||
try s.testWriteString("input1\n"); // 3
|
||||
// line number:
|
||||
try s.testWriteSemanticString("output2\n", .command); // 0
|
||||
try s.testWriteSemanticString("output2\n", .command); // 1
|
||||
try s.testWriteSemanticString("prompt1\n", .prompt); // 2
|
||||
try s.testWriteSemanticString("input1\n", .input); // 3
|
||||
}
|
||||
// zig fmt: on
|
||||
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 2 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .prompt;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 3 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .input;
|
||||
}
|
||||
|
||||
// Not at a prompt
|
||||
{
|
||||
const sel = s.selectPrompt(s.pages.pin(.{ .active = .{
|
||||
|
|
@ -8250,46 +8158,21 @@ test "Screen: promptPath" {
|
|||
|
||||
// zig fmt: off
|
||||
{
|
||||
// line number:
|
||||
try s.testWriteString("output1\n"); // 0
|
||||
try s.testWriteString("output1\n"); // 1
|
||||
try s.testWriteString("prompt2\n"); // 2
|
||||
try s.testWriteString("input2\n"); // 3
|
||||
try s.testWriteString("output2\n"); // 4
|
||||
try s.testWriteString("output2\n"); // 5
|
||||
try s.testWriteString("$ input3\n"); // 6
|
||||
try s.testWriteString("output3\n"); // 7
|
||||
try s.testWriteString("output3\n"); // 8
|
||||
try s.testWriteString("output3"); // 9
|
||||
// line number:
|
||||
try s.testWriteSemanticString("output1\n", .command); // 0
|
||||
try s.testWriteSemanticString("output1\n", .command); // 1
|
||||
try s.testWriteSemanticString("prompt2\n", .prompt); // 2
|
||||
try s.testWriteSemanticString("input2\n", .input); // 3
|
||||
try s.testWriteSemanticString("output2\n", .command); // 4
|
||||
try s.testWriteSemanticString("output2\n", .command); // 5
|
||||
try s.testWriteSemanticString("$ ", .prompt); // 6 prompt
|
||||
try s.testWriteSemanticString("input3\n", .input); // 6 input
|
||||
try s.testWriteSemanticString("output3\n", .command); // 7
|
||||
try s.testWriteSemanticString("output3\n", .command); // 8
|
||||
try s.testWriteSemanticString("output3", .command); // 9
|
||||
}
|
||||
// zig fmt: on
|
||||
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 2 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .prompt;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 3 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .input;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 4 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .command;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 6 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .input;
|
||||
}
|
||||
{
|
||||
const pin = s.pages.pin(.{ .screen = .{ .y = 7 } }).?;
|
||||
const row = pin.rowAndCell().row;
|
||||
row.semantic_prompt = .command;
|
||||
}
|
||||
|
||||
// From is not in the prompt
|
||||
{
|
||||
const path = s.promptPath(
|
||||
|
|
|
|||
|
|
@ -168,6 +168,7 @@ pub const DerivedConfig = struct {
|
|||
foreground: configpkg.Config.Color,
|
||||
background: configpkg.Config.Color,
|
||||
osc_color_report_format: configpkg.Config.OSCColorReportFormat,
|
||||
clipboard_write: configpkg.ClipboardAccess,
|
||||
enquiry_response: []const u8,
|
||||
|
||||
pub fn init(
|
||||
|
|
@ -188,6 +189,7 @@ pub const DerivedConfig = struct {
|
|||
.foreground = config.foreground,
|
||||
.background = config.background,
|
||||
.osc_color_report_format = config.@"osc-color-report-format",
|
||||
.clipboard_write = config.@"clipboard-write",
|
||||
.enquiry_response = try alloc.dupe(u8, config.@"enquiry-response"),
|
||||
|
||||
// This has to be last so that we copy AFTER the arena allocations
|
||||
|
|
@ -278,6 +280,7 @@ pub fn init(self: *Termio, alloc: Allocator, opts: termio.Options) !void {
|
|||
.size = &self.size,
|
||||
.terminal = &self.terminal,
|
||||
.osc_color_report_format = opts.config.osc_color_report_format,
|
||||
.clipboard_write = opts.config.clipboard_write,
|
||||
.enquiry_response = opts.config.enquiry_response,
|
||||
.default_foreground_color = opts.config.foreground.toTerminalRGB(),
|
||||
.default_background_color = opts.config.background.toTerminalRGB(),
|
||||
|
|
|
|||
|
|
@ -74,6 +74,9 @@ pub const StreamHandler = struct {
|
|||
/// The color reporting format for OSC requests.
|
||||
osc_color_report_format: configpkg.Config.OSCColorReportFormat,
|
||||
|
||||
/// The clipboard write access configuration.
|
||||
clipboard_write: configpkg.ClipboardAccess,
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Internal state
|
||||
|
||||
|
|
@ -112,6 +115,7 @@ pub const StreamHandler = struct {
|
|||
/// Change the configuration for this handler.
|
||||
pub fn changeConfig(self: *StreamHandler, config: *termio.DerivedConfig) void {
|
||||
self.osc_color_report_format = config.osc_color_report_format;
|
||||
self.clipboard_write = config.clipboard_write;
|
||||
self.enquiry_response = config.enquiry_response;
|
||||
self.default_foreground_color = config.foreground.toTerminalRGB();
|
||||
self.default_background_color = config.background.toTerminalRGB();
|
||||
|
|
@ -723,7 +727,13 @@ pub const StreamHandler = struct {
|
|||
// a 420 because we don't support DCS sequences.
|
||||
switch (req) {
|
||||
.primary => self.messageWriter(.{
|
||||
.write_stable = "\x1B[?62;22c",
|
||||
// 62 = Level 2 conformance
|
||||
// 22 = Color text
|
||||
// 52 = Clipboard access
|
||||
.write_stable = if (self.clipboard_write != .deny)
|
||||
"\x1B[?62;22;52c"
|
||||
else
|
||||
"\x1B[?62;22c",
|
||||
}),
|
||||
|
||||
.secondary => self.messageWriter(.{
|
||||
|
|
|
|||
Loading…
Reference in New Issue