diff --git a/Sources/Crow/App/AppDelegate.swift b/Sources/Crow/App/AppDelegate.swift index 5cc4868..7395898 100644 --- a/Sources/Crow/App/AppDelegate.swift +++ b/Sources/Crow/App/AppDelegate.swift @@ -1080,6 +1080,23 @@ final class AppDelegate: NSObject, NSApplicationDelegate { appMenuItem.submenu = appMenu mainMenu.addItem(appMenuItem) + // Edit menu — registers the standard cut/copy/paste/select-all/undo + // selectors on the responder chain so ⌘V and dictation work in SwiftUI + // text fields (Settings). Routed to the first responder (target nil). + // The terminal is unaffected: GhosttySurfaceView.performKeyEquivalent + // intercepts ⌘V/⌘C at the view level before the main menu sees them. (#512) + let editMenuItem = NSMenuItem() + let editMenu = NSMenu(title: "Edit") + editMenu.addItem(withTitle: "Undo", action: Selector(("undo:")), keyEquivalent: "z") + editMenu.addItem(withTitle: "Redo", action: Selector(("redo:")), keyEquivalent: "Z") + editMenu.addItem(.separator()) + editMenu.addItem(withTitle: "Cut", action: #selector(NSText.cut(_:)), keyEquivalent: "x") + editMenu.addItem(withTitle: "Copy", action: #selector(NSText.copy(_:)), keyEquivalent: "c") + editMenu.addItem(withTitle: "Paste", action: #selector(NSText.paste(_:)), keyEquivalent: "v") + editMenu.addItem(withTitle: "Select All", action: #selector(NSText.selectAll(_:)), keyEquivalent: "a") + editMenuItem.submenu = editMenu + mainMenu.addItem(editMenuItem) + NSApp.mainMenu = mainMenu }