@@ -14,6 +14,7 @@ import (
14 "github.com/charlievieth/fastwalk"
14 "github.com/charlievieth/fastwalk"
15 "github.com/charmbracelet/crush/internal/csync"
15 "github.com/charmbracelet/crush/internal/csync"
16 "github.com/charmbracelet/crush/internal/home"
16 "github.com/charmbracelet/crush/internal/home"
17+ "github.com/charmbracelet/x/ansi"
19type FileInfo struct {
20type FileInfo struct {
@@ -204,7 +205,11 @@ func DirTrim(pwd string, lim int) string {
204 if i == len(dirs)-1 {
205 if i == len(dirs)-1 {
205 out = dirs[i]
206 out = dirs[i]
206 } else if i >= len(dirs)-lim {
207 } else if i >= len(dirs)-lim {
207− out = string(dirs[i][0]) + out
208+ // Keep the first grapheme cluster, not the first byte: CJK,
209+ // combining marks, and emoji can span multiple bytes and runes,
210+ // so a byte or single rune would render the wrong character.
211+ first, _ := ansi.FirstGraphemeCluster(dirs[i], ansi.GraphemeWidth)
209 out = "..." + out
214 out = "..." + out