wez / wezterm

A GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust
https://wezfurlong.org/wezterm/
Other
16.78k stars 751 forks source link

Long tab titles with runs of 2 or more consecutive spaces can overflow the tab bounds #2560

Open ninjarogue opened 1 year ago

ninjarogue commented 1 year ago

What Operating System(s) are you seeing this problem on?

macOS

Which Wayland compositor or X11 Window manager(s) are you using?

No response

WezTerm version

wezterm 20220927-071112-9be05951

Did you try the latest nightly build to see if the issue is better (or worse!) than your current version?

Yes, and I updated the version box above to show the version of the nightly that I tried

Describe the bug

The titles show the absolute path to the cwd or file. The text overlap each other if the path is too long.

To Reproduce

Just navigate to a directory with a long absolute path and check the title of the tab. You will need to open at least 2 or 3 tabs to reproduce this issue.

Configuration

local wezterm = require "wezterm";

return {
  -- font = wezterm.font("Dank Mono", { weight = "Regular" }),
  -- font_rules = {
  --   {
  --     italic = true,
  --     font = wezterm.font("Dank Mono Italic", { weight = "Italic", italic = true }),
  --   },
  --   {
  --     intensity = "Bold",
  --     font = wezterm.font("Dank Mono Bold", { weight = "Bold" }),
  --   }
  -- },
  color_scheme = "Whimsy",
  -- window_background_image = "./ash-edmonds.jpeg",
  --
  -- colors = {
  --   background = "#000000",
  -- },

  -- window_background_image_hsb = {
  --   -- Darken the background image by reducing it to 1/3rd
  --   brightness = 0.5,

  --   -- You can adjust the hue by scaling its value.
  --   -- a multiplier of 1.0 leaves the value unchanged.
  --   -- hue = 1.0,

  --   -- You can adjust the saturation also.
  --   -- saturation = 1.0,
  -- },
  font_size = 19.0,
  text_background_opacity = 0.8,
  window_background_opacity = 1.0,
  -- window_background_gradient = {
  --   -- Can be "Vertical" or "Horizontal".  Specifies the direction
  --   -- in which the color gradient varies.  The default is "Horizontal",
  --   -- with the gradient going from left-to-right.
  --   -- Radial gradients are also supported; see the other example below
  --   orientation = "Vertical",

  --   -- Specifies the set of colors that are interpolated in the gradient.
  --   -- Accepts CSS style color specs, from named colors, through rgb
  --   -- strings and more
  --   colors = {
  --     "#0f0c29",
  --     "#302b63",
  --     "#24243e"
  --   },

  --   -- Instead of specifying `colors`, you can use one of a number of
  --   -- predefined, preset gradients.
  --   -- A list of presets is shown in a section below.
    preset = "Warm",

  --   -- Specifies the interpolation style to be used.
  --   -- "Linear", "Basis" and "CatmullRom" as supported.
  --   -- The default is "Linear".
  --   interpolation = "Linear",

  --   -- How the colors are blended in the gradient.
  --   -- "Rgb", "LinearRgb", "Hsv" and "Oklab" are supported.
  --   -- The default is "Rgb".
  --   blend = "Rgb",

  --   -- To avoid vertical color banding for horizontal gradients, the
  --   -- gradient position is randomly shifted by up to the `noise` value
  --   -- for each pixel.
  --   -- Smaller values, or 0, will make bands more prominent.
  --   -- The default value is 64 which gives decent looking results
  --   -- on a retina macbook pro display.
  --   -- noise = 64,

  --   -- By default, the gradient smoothly transitions between the colors.
  --   -- You can adjust the sharpness by specifying the segment_size and
  --   -- segment_smoothness parameters.
  --   -- segment_size configures how many segments are present.
  --   -- segment_smoothness is how hard the edge is; 0.0 is a hard edge,
  --   -- 1.0 is a soft edge.

  --   -- segment_size = 11,
  --   -- segment_smoothness = 0.0,
  -- },
}

Expected Behavior

The text should not overlap and should show the entire path or just the file/directory name.

Logs

13:49:24.934 WARN env_bootstrap > setlocale(en_TW.UTF-8) failed, fall back to en_US.UTF-8 13:49:24.940 WARN wezterm_dynamic::error > preset is not a valid Config field. There are too many alternatives to list here; consult the documentation! 13:49:24.989 WARN wezterm_dynamic::error > preset is not a valid Config field. There are too many alternatives to list here; consult the documentation! 14:08:04.025 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "deleteToEndOfParagraph:" 14:09:58.498 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "deleteToEndOfParagraph:" 14:09:59.625 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "deleteToEndOfParagraph:" 14:10:22.906 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:10:23.105 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:10:51.938 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:10:52.189 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:10:52.221 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:10:52.255 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:10:52.289 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:10:52.323 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:10:52.357 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:10:52.391 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:10:52.425 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:11:26.306 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:11:26.514 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:11:26.714 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:11:26.906 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:11:27.106 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:12:21.643 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:12:21.857 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:12:22.258 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:12:22.425 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.147 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.399 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.438 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.471 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.504 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.537 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.570 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.604 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.637 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.671 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.704 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:30.883 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:31.134 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:31.173 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:31.204 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:31.238 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:31.269 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:31.304 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:31.338 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:31.372 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:31.405 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:31.439 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:56.868 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:57.211 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:58.155 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:59.708 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:59.959 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:13:59.993 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:00.026 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:00.061 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:00.095 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:00.128 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:00.162 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:00.196 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:00.229 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:05.924 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:06.188 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:06.436 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:06.756 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:06.996 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:07.246 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:07.285 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:07.312 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:07.349 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:14:07.383 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:16:20.094 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:16:20.717 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:16:20.908 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:16:21.108 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:18:51.863 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:20:33.031 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:12.500 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:12.750 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:12.790 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:12.822 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:12.856 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:12.888 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:12.923 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:12.955 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:12.989 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:14.851 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:15.379 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:17.483 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:47.900 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:48.091 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:48.275 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:48.483 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:48.667 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:25:48.859 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:01.645 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:01.924 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:02.116 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:02.308 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:04.572 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:04.748 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:04.999 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.040 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.071 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.104 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.139 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.172 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.206 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.372 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.623 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.661 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.692 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:27:05.725 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:32:49.590 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "centerSelectionInVisibleArea:" 14:34:32.026 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:34:32.256 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:" 14:34:33.209 WARN window::os::macos::window > UNHANDLED: IME: do_command_by_selector: "yank:"

Anything else?

Screen Shot 2022-09-28 at 2 33 07 PM
wez commented 1 year ago

It looks like the titles are set to very long strings with a lot of space padding, and I think that is confusing the layout calculation.

Please capture a terminal recording:

*** Finished recording to /var/tmp/wezterm-recording-sF6B3u.cast.txt

The file is an asciicast (compatible with https://asciinema.org/) and can also be replayed using wezterm replay.

The terminal recording allows me to replicate what is being sent to the terminal without requiring me to install the same applications as you and replicate your configuration for everything.

ninjarogue commented 1 year ago

@wez Okay, I followed your instructions and the results should be attached to this message. wezterm-recording-a9vnOY.cast.txt

wez commented 1 year ago

What's happening here is that the very long text is clustered into 2 clusters because of an optimization used in the main terminal display where it is cheaper (more cacheable) for a line like "hello<trailing whitespace>" to be shaped as "hello " and "<trailing whitespace>". In your scenario, we get "[Scratch] " and "<many spaces> 27/41 - nvim".

When two or more clusters are rendered in the context of the fancy tab renderer, the rendering logic doesn't know to account for the already printed width of the first cluster before printing the second, which causes it to overflow the tab bounds.

I'll need to think about how to resolve this.