Cannot use "Enter" in Ghostty [Fedora Linux]
Describe the bug
I cannot use enter key when trying to trust a folder, in Ghostty. Is find for other terminals
Affected version
0.0.354 Commit: 076bd172b
Steps to reproduce the behavior
Pressing Enter Key
Expected behavior
Should work
Additional context
• SYSTEM INFORMATION HOST - Aspire A315-58 (Acer) COMPUTER TYPE - Notebook (V1.31) CPU - 11th Gen Intel(R) Core(TM) i5-1135G7 (8) @ 4.20 GHz GPU - Intel Iris Xe Graphics @ 1.30 GHz [Integrated] MEMORY USED - 6.23 GiB / 11.45 GiB (54%) SWAP USED - 2.33 GiB / 8.00 GiB (29%) DISK - 214.39 GiB / 475.35 GiB (45%) - btrfs • SOFTWARE INFORMATION DISTRO - Fedora Linux 43 (Workstation Edition) x86_64 INSTALLED DATE - 2025-07-19 05:37:24 KERNEL - Linux 6.17.7-300.fc43.x86_64 PACKAGES - 2484 (rpm), 38 (flatpak), 32 (brew) UPTIME - 2 hours, 2 mins • DISPLAY INFORMATION LOGIN MANAGER - Wayland WM - niri (Wayland) MONITOR (BOE07CB) - 1920x1080 @ 60 Hz - 340x190 mm (15 inches, 144 ppi) • DESIGN INFORMATION KDE THEME - ICON THEME - FONT - Unknown TERMINAL FONT - JetBrainsMono NFM Bold (16pt) CURSOR - default (24px) • VARIOUS INFORMATION WEATHER - +16°C - Clear (Cape Town, South Africa) INFO - fastfetch 2.48.1 (x86_64)
FWIW, it works fine on EndeavourOS: Ghostty 1.2.3-arch2
@alexaandru with all due respect , how does you tell me that resolve my issue. I tested on 5 TERMINALS. It works for all but not Ghostty (niri). i dont care about the distro you use.
My intent was to provide additional information to developers to aid them with fixing this. The point was never to prove you wrong or anything like that.
I'm experiencing the same issue. I'm using arch liux & Ghostty
I experience same issue $ghostty --version
Ghostty 1.2.3-arch2
Version
- version: 1.2.3-arch2
- channel: tip Build Config
- Zig version : 0.14.1
- build mode : builtin.OptimizeMode.ReleaseFast
- app runtime : apprt.Runtime.gtk
- font engine : font.main.Backend.fontconfig_freetype
- renderer : renderer.generic.Renderer(renderer.OpenGL)
- libxev : io_uring
- kernel version: 6.17.5-arch1-1
- desktop env : other
- GTK version : build : 4.20.2 runtime : 4.20.2
- libadwaita : enabled build : 1.8.1 runtime : 1.8.1
- libX11 : enabled
- libwayland : enabled
$ copilot --version 0.0.354 Commit: 076bd172b
A workaround to make it work is to set
keybind = enter=text:\r
in $HOME/.config/ghosttty/config
I started using niri with ghostty over the weekend and can reproduce this if the team needs an internal repro :)
FYI @RyanHecht I was able to repro on MacOS 26.1. Issue appears larger than linux distros.
I don't use Copilot CLI (and don't have time to mess with it either), but someone opened a post[^1] in Ghostty's Discord's #help channel about this, and it was discovered that Copilot uses the Kitty keyboard protocol; the issue might be there (they confirmed it doesn't reproduce on GNOME Terminal (VTE), which doesn't support KKP).
The workaround above,
keybind = enter=text:\r
Is also quite suspect, as that essentially forces Ghostty to encode enter with the legacy encoding.
tested on 5 TERMINALS
Checking if it works fine on another terminal emulator supporting KKP (e.g.: Kitty, Foot, WezTerm, Alacritty) would help disprove this theory of course (though it could be some combination of KKP and Ghostty, such as with special-casing terminal emulators).
FWIW, it works fine on EndeavourOS: Ghostty 1.2.3-arch2
And KKP support was only introduced in v0.0.337, so it would presumably work on older versions if this is the issue (though to be fair that version is a month and a half old).
[^1]: You need to be in the Ghostty Discord for this link to work; you can join with https://discord.gg/ghostty.
FYI I checked with @patniko and he cannot reproduce it on Ghostty for macOS anymore. Right now it seems the issue has been reproduced only on:
- Fedora (+ niri) + Ghostty
- Arch Linux + Ghostty
I'll also mention that my ghostty config is the default DankMaterialShell config, but I can still reproduce it with a blank config too https://github.com/AvengeMedia/DankMaterialShell/blob/master/core/internal/config/embedded/ghostty.conf
The workaround above,
keybind = enter=text:\r
Is also quite suspect, as that essentially forces Ghostty to encode enter with the legacy encoding.
This workaround did not work for me.
Checking if it works fine on another terminal emulator supporting KKP (e.g.: Kitty, Foot, WezTerm, Alacritty) would help disprove this theory of course (though it could be some combination of KKP and Ghostty, such as with special-casing terminal emulators).
I can't reproduce the bug in Alacritty; it works fine there.
I tried to reproduce this in KDE Plasma and could not -- I only experience this issue in niri with ghostty.
@kevinnkansah Can you share your niri config?
@peterbartels, do you happen to be using niri as well?
I'm having this issue on hyprland
0.0.363
Commit: 66416ad
Ghostty 1.2.0-arch1
Version
- version: 1.2.0-arch1
- channel: tip
Build Config
- Zig version : 0.14.1
- build mode : builtin.OptimizeMode.ReleaseFast
- app runtime : apprt.Runtime.gtk
- font engine : font.main.Backend.fontconfig_freetype
- renderer : renderer.generic.Renderer(renderer.OpenGL)
- libxev : io_uring
- kernel version: 6.16.8-1-MANJARO
- desktop env : other
- GTK version :
build : 4.18.6
runtime : 4.18.6
- libadwaita : enabled
build : 1.7.7
runtime : 1.7.7
- libX11 : enabled
- libwayland : enabled
OS: Manjaro Linux x86_64
Host: Inspiron 5491 2n1
Kernel: 6.16.8-1-MANJARO
Uptime: 10 hours, 9 mins
Packages: 2199 (pacman), 98 (nix-user), 64 (nix-default), 91 (flatpak), 6 (snap)
Shell: zsh 5.9
Resolution: 1920x1080
DE: Hyprland
Theme: Adwaita [GTK2], adw-gtk3-dark [GTK3]
Icons: Adwaita [GTK2], Papirus-Dark-Maia [GTK3]
Terminal: ghostty
CPU: Intel i7-10510U (8) @ 4.900GHz
GPU: Intel CometLake-U GT2 [UHD Graphics]
Memory: 19984MiB / 31751MiB
I tried to reproduce this in KDE Plasma and could not -- I only experience this issue in niri with ghostty.
@kevinnkansah Can you share your niri config?
@peterbartels, do you happen to be using niri as well?
// This config is in the KDL format: https://kdl.dev
// "/-" comments out the following node.
// Check the wiki for a full description of the configuration:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction
config-notification {
disable-failed
}
// Outputs from existing configuration
/-output "eDP-1" {
// Uncomment this line to disable this output.
// off
// Resolution and, optionally, refresh rate of the output.
// The format is "<width>x<height>" or "<width>x<height>@<refresh rate>".
// If the refresh rate is omitted, niri will pick the highest refresh rate
// for the resolution.
// If the mode is omitted altogether or is invalid, niri will pick one automatically.
// Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.
mode "[email protected]"
// You can use integer or fractional scale, for example use 1.5 for 150% scale.
scale 2
// Transform allows to rotate the output counter-clockwise, valid values are:
// normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.
transform "normal"
// Position of the output in the global coordinate space.
// This affects directional monitor actions like "focus-monitor-left", and cursor movement.
// The cursor can only move between directly adjacent outputs.
// Output scale and rotation has to be taken into account for positioning:
// outputs are sized in logical, or scaled, pixels.
// For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080,
// so to put another output directly adjacent to it on the right, set its x to 1920.
// If the position is unset or results in an overlap, the output is instead placed
// automatically.
position x=1280 y=0
}
gestures {
hot-corners {
off
}
}
// Input device configuration.
// Find the full list of options on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Input
input {
keyboard {
xkb {
}
numlock
}
touchpad {
natural-scroll
tap
}
mouse {
}
trackpoint {
}
}
// You can configure outputs by their name, which you can find
// by running `niri msg outputs` while inside a niri instance.
// The built-in laptop monitor is usually called "eDP-1".
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs
// Remember to uncomment the node by removing "/-"!
// Settings that influence how windows are positioned and sized.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
layout {
// Set gaps around windows in logical pixels.
gaps 5
background-color "transparent"
// When to center a column when changing focus, options are:
// - "never", default behavior, focusing an off-screen column will keep at the left
// or right edge of the screen.
// - "always", the focused column will always be centered.
// - "on-overflow", focusing a column will center it if it doesn't fit
// together with the previously focused column.
center-focused-column "never"
// You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
preset-column-widths {
// Proportion sets the width as a fraction of the output width, taking gaps into account.
// For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
// The default preset widths are 1/3, 1/2 and 2/3 of the output.
proportion 0.33333
proportion 0.5
proportion 0.66667
// Fixed sets the width in logical pixels exactly.
// fixed 1920
}
// You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
// preset-window-heights { }
// You can change the default width of the new windows.
default-column-width { proportion 0.5; }
// If you leave the brackets empty, the windows themselves will decide their initial width.
// default-column-width {}
// By default focus ring and border are rendered as a solid background rectangle
// behind windows. That is, they will show up through semitransparent windows.
// This is because windows using client-side decorations can have an arbitrary shape.
//
// If you don't like that, you should uncomment `prefer-no-csd` below.
// Niri will draw focus ring and border *around* windows that agree to omit their
// client-side decorations.
//
// Alternatively, you can override it with a window rule called
// `draw-border-with-background`.
border {
off
width 4
active-color "#707070" // Neutral gray
inactive-color "#d0d0d0" // Light gray
urgent-color "#cc4444" // Softer red
}
focus-ring {
width 2
active-color "#808080" // Medium gray
inactive-color "#505050" // Dark gray
}
shadow {
softness 30
spread 5
offset x=0 y=5
color "#0007"
}
struts {
}
}
layer-rule {
match namespace="^quickshell$"
place-within-backdrop true
}
overview {
workspace-shadow {
off
}
}
// Add lines like this to spawn processes at startup.
// Note that running niri as a session supports xdg-desktop-autostart,
// which may be more convenient to use.
// See the binds section below for more spawn examples.
// This line starts waybar, a commonly used bar for Wayland compositors.
spawn-at-startup "bash" "-c" "wl-paste --watch cliphist store &"
spawn-at-startup "dms" "run"
spawn-at-startup "/usr/lib/mate-polkit/polkit-mate-authentication-agent-1"
environment {
XDG_CURRENT_DESKTOP "niri"
QT_QPA_PLATFORM "wayland"
ELECTRON_OZONE_PLATFORM_HINT "auto"
QT_QPA_PLATFORMTHEME "gtk3"
QT_QPA_PLATFORMTHEME_QT6 "gtk3"
TERMINAL "kitty"
}
hotkey-overlay {
skip-at-startup
}
prefer-no-csd
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
animations {
workspace-switch {
spring damping-ratio=0.80 stiffness=523 epsilon=0.0001
}
window-open {
duration-ms 500
curve "cubic-bezier" 0.28 0 0.02 1.02
}
window-close {
duration-ms 150
curve "ease-out-quad"
}
horizontal-view-movement {
spring damping-ratio=0.85 stiffness=423 epsilon=0.0001
}
window-movement {
spring damping-ratio=0.75 stiffness=323 epsilon=0.0001
}
window-resize {
spring damping-ratio=0.85 stiffness=423 epsilon=0.0001
}
config-notification-open-close {
spring damping-ratio=0.65 stiffness=923 epsilon=0.001
}
screenshot-ui-open {
duration-ms 200
curve "ease-out-quad"
}
overview-open-close {
spring damping-ratio=0.85 stiffness=800 epsilon=0.0001
}
}
// Window rules let you adjust behavior for individual windows.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
// Work around WezTerm's initial configure bug
// by setting an empty default-column-width.
window-rule {
// This regular expression is intentionally made as specific as possible,
// since this is the default config, and we want no false positives.
// You can get away with just app-id="wezterm" if you want.
match app-id=r#"^org\.wezfurlong\.wezterm$"#
default-column-width {}
}
window-rule {
match app-id=r#"^org\.gnome\."#
draw-border-with-background false
geometry-corner-radius 12
clip-to-geometry true
}
window-rule {
match app-id=r#"^gnome-control-center$"#
match app-id=r#"^pavucontrol$"#
match app-id=r#"^nm-connection-editor$"#
default-column-width { proportion 0.5; }
open-floating false
}
window-rule {
match app-id=r#"^gnome-calculator$"#
match app-id=r#"^galculator$"#
match app-id=r#"^blueman-manager$"#
match app-id=r#"^org\.gnome\.Nautilus$"#
match app-id=r#"^steam$"#
match app-id=r#"^xdg-desktop-portal$"#
match app-id=r#"^thunar$"#
open-floating true
}
window-rule {
match app-id=r#"^org\.wezfurlong\.wezterm$"#
match app-id="Alacritty"
match app-id="zen"
match app-id="com.mitchellh.ghostty"
match app-id="kitty"
draw-border-with-background false
}
window-rule {
match is-active=false
opacity 0.9
}
window-rule {
match app-id=r#"firefox$"# title="^Picture-in-Picture$"
match app-id="zoom"
open-floating true
}
window-rule {
geometry-corner-radius 12
clip-to-geometry true
}
window-rule {
match app-id="(?i)zed"
draw-border-with-background false
open-maximized true
}
window-rule {
match app-id="org.chromium.Chromium"
match app-id="org.prismlauncher.PrismLauncher"
open-maximized true
}
binds {
// === System & Overview ===
Mod+D { spawn "niri" "msg" "action" "toggle-overview"; }
Mod+O repeat=false { toggle-overview; }
Mod+Shift+Slash { show-hotkey-overlay; }
// === Application Launchers ===
Mod+Return hotkey-overlay-title="Open Terminal" { spawn "kitty"; }
Mod+Z hotkey-overlay-title="Open Zed" { spawn "/home/kevin/.local/bin/zed"; }
Mod+Space hotkey-overlay-title="Application Launcher" {
spawn "dms" "ipc" "call" "spotlight" "toggle";
}
Mod+T hotkey-overlay-title="Open File Manager" { spawn "thunar"; }
Mod+B hotkey-overlay-title="Open Browser" { spawn "xdg-open" "https://"; }
Mod+V hotkey-overlay-title="Clipboard Manager" {
spawn "dms" "ipc" "call" "clipboard" "toggle";
}
Mod+M hotkey-overlay-title="Task Manager" {
spawn "dms" "ipc" "call" "processlist" "toggle";
}
Mod+Comma hotkey-overlay-title="Settings" {
spawn "dms" "ipc" "call" "settings" "toggle";
}
Mod+N hotkey-overlay-title="Notification Center" { spawn "dms" "ipc" "call" "notifications" "toggle"; }
Mod+Shift+N hotkey-overlay-title="Notepad" { spawn "dms" "ipc" "call" "notepad" "toggle"; }
// === Security ===
Mod+Alt+L hotkey-overlay-title="Lock Screen" {
spawn "dms" "ipc" "call" "lock" "lock";
}
Mod+Shift+E { quit; }
Ctrl+Alt+Delete hotkey-overlay-title="Task Manager" {
spawn "dms" "ipc" "call" "processlist" "toggle";
}
// === Audio Controls ===
XF86AudioRaiseVolume allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "increment" "3";
}
XF86AudioLowerVolume allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "decrement" "3";
}
XF86AudioMute allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "mute";
}
XF86AudioMicMute allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "micmute";
}
XF86KbdBrightnessUp allow-when-locked=true {
spawn "kbdbrite.sh" "up";
}
XF86KbdBrightnessDown allow-when-locked=true {
spawn "kbdbrite.sh" "down";
}
// === Brightness Controls ===
XF86MonBrightnessUp allow-when-locked=true {
spawn "dms" "ipc" "call" "brightness" "increment" "5" "";
}
XF86MonBrightnessDown allow-when-locked=true {
spawn "dms" "ipc" "call" "brightness" "decrement" "5" "";
}
// === Window Management ===
Mod+Q repeat=false { close-window; }
Mod+F { maximize-column; }
Mod+Shift+F { fullscreen-window; }
Mod+Shift+T { toggle-window-floating; }
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
Mod+W { toggle-column-tabbed-display; }
// === Focus Navigation ===
Mod+Left { focus-column-left; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Right { focus-column-right; }
Mod+H { focus-column-left; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+L { focus-column-right; }
// === Window Movement ===
Mod+Shift+Left { move-column-left; }
Mod+Shift+Down { move-window-down; }
Mod+Shift+Up { move-window-up; }
Mod+Shift+Right { move-column-right; }
Mod+Shift+H { move-column-left; }
Mod+Shift+J { move-window-down; }
Mod+Shift+K { move-window-up; }
Mod+Shift+L { move-column-right; }
// === Column Navigation ===
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
// === Monitor Navigation ===
Mod+Ctrl+Left { focus-monitor-left; }
//Mod+Ctrl+Down { focus-monitor-down; }
//Mod+Ctrl+Up { focus-monitor-up; }
Mod+Ctrl+Right { focus-monitor-right; }
Mod+Ctrl+H { focus-monitor-left; }
Mod+Ctrl+J { focus-monitor-down; }
Mod+Ctrl+K { focus-monitor-up; }
Mod+Ctrl+L { focus-monitor-right; }
// === Move to Monitor ===
Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
// === Workspace Navigation ===
Mod+Page_Down { focus-workspace-down; }
Mod+Page_Up { focus-workspace-up; }
Mod+U { focus-workspace-down; }
Mod+I { focus-workspace-up; }
Mod+Ctrl+Down { move-column-to-workspace-down; }
Mod+Ctrl+Up { move-column-to-workspace-up; }
Mod+Ctrl+U { move-column-to-workspace-down; }
Mod+Ctrl+I { move-column-to-workspace-up; }
// === Move Workspaces ===
Mod+Shift+Page_Down { move-workspace-down; }
Mod+Shift+Page_Up { move-workspace-up; }
Mod+Shift+U { move-workspace-down; }
Mod+Shift+I { move-workspace-up; }
// === Mouse Wheel Navigation ===
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
Mod+Ctrl+WheelScrollRight { move-column-right; }
Mod+Ctrl+WheelScrollLeft { move-column-left; }
Mod+Shift+WheelScrollDown { focus-column-right; }
Mod+Shift+WheelScrollUp { focus-column-left; }
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
// === Numbered Workspaces ===
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace 5; }
Mod+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
// === Move to Numbered Workspaces ===
Mod+Shift+1 { move-column-to-workspace 1; }
Mod+Shift+2 { move-column-to-workspace 2; }
Mod+Shift+3 { move-column-to-workspace 3; }
Mod+Shift+4 { move-column-to-workspace 4; }
Mod+Shift+5 { move-column-to-workspace 5; }
Mod+Shift+6 { move-column-to-workspace 6; }
Mod+Shift+7 { move-column-to-workspace 7; }
Mod+Shift+8 { move-column-to-workspace 8; }
Mod+Shift+9 { move-column-to-workspace 9; }
// === Column Management ===
Mod+BracketLeft { consume-or-expel-window-left; }
Mod+BracketRight { consume-or-expel-window-right; }
Mod+Period { expel-window-from-column; }
// === Sizing & Layout ===
Mod+R { switch-preset-column-width; }
Mod+Shift+R { switch-preset-window-height; }
Mod+Ctrl+R { reset-window-height; }
Mod+Ctrl+F { expand-column-to-available-width; }
Mod+C { center-column; }
Mod+Ctrl+C { center-visible-columns; }
// === Manual Sizing ===
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
// === Screenshots ===
XF86Launch1 { screenshot; }
Ctrl+XF86Launch1 { screenshot-screen; }
Alt+XF86Launch1 { screenshot-window; }
Print { screenshot; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
// === System Controls ===
Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
Mod+Shift+P { power-off-monitors; }
}