diff --git a/macos/Sources/AppDelegate.swift b/macos/Sources/AppDelegate.swift
index c582b4628..4415dbf3f 100644
--- a/macos/Sources/AppDelegate.swift
+++ b/macos/Sources/AppDelegate.swift
@@ -33,6 +33,7 @@ class AppDelegate: NSObject,
@IBOutlet private var menuCopy: NSMenuItem?
@IBOutlet private var menuPaste: NSMenuItem?
+ @IBOutlet private var menuSelectAll: NSMenuItem?
@IBOutlet private var menuToggleFullScreen: NSMenuItem?
@IBOutlet private var menuZoomSplit: NSMenuItem?
@@ -257,6 +258,7 @@ class AppDelegate: NSObject,
syncMenuShortcut(action: "copy_to_clipboard", menuItem: self.menuCopy)
syncMenuShortcut(action: "paste_from_clipboard", menuItem: self.menuPaste)
+ syncMenuShortcut(action: "select_all", menuItem: self.menuSelectAll)
syncMenuShortcut(action: "toggle_fullscreen", menuItem: self.menuToggleFullScreen)
syncMenuShortcut(action: "toggle_split_zoom", menuItem: self.menuZoomSplit)
diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift
index bd4a2b0a5..473a3a884 100644
--- a/macos/Sources/Ghostty/SurfaceView.swift
+++ b/macos/Sources/Ghostty/SurfaceView.swift
@@ -1011,6 +1011,7 @@ extension Ghostty {
AppDelegate.logger.warning("action failed action=\(action)")
}
}
+
@IBAction func pasteAsPlainText(_ sender: Any?) {
guard let surface = self.surface else { return }
@@ -1019,6 +1020,14 @@ extension Ghostty {
AppDelegate.logger.warning("action failed action=\(action)")
}
}
+
+ @IBAction override func selectAll(_ sender: Any?) {
+ guard let surface = self.surface else { return }
+ let action = "select_all"
+ if (!ghostty_surface_binding_action(surface, action, UInt(action.count))) {
+ AppDelegate.logger.warning("action failed action=\(action)")
+ }
+ }
// MARK: NSTextInputClient
diff --git a/macos/Sources/MainMenu.xib b/macos/Sources/MainMenu.xib
index 767bf7f8c..2e6041bed 100644
--- a/macos/Sources/MainMenu.xib
+++ b/macos/Sources/MainMenu.xib
@@ -35,6 +35,7 @@
+
@@ -169,6 +170,12 @@
+