Detailed changes
  
  
    
    @@ -2,6 +2,8 @@ module github.com/charmbracelet/soft-serve
 
 go 1.17
 
+replace github.com/charmbracelet/glamour => ../glamour
+
 require (
 	github.com/alecthomas/chroma v0.10.0
 	github.com/caarlos0/env/v6 v6.9.1
@@ -22,7 +24,7 @@ require (
 )
 
 require (
-	github.com/aymanbagabas/go-osc52 v1.0.2
+	github.com/aymanbagabas/go-osc52 v1.0.3
 	github.com/charmbracelet/keygen v0.3.0
 	github.com/gobwas/glob v0.2.3
 	github.com/gogs/git-module v1.6.0
  
  
  
    
    @@ -17,10 +17,10 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
 github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
-github.com/aymanbagabas/go-osc52 v1.0.1 h1:juDXgeKhMfVnylcoA4S7p9E4q+9DErUZGkX8t2ZR2j8=
-github.com/aymanbagabas/go-osc52 v1.0.1/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4=
 github.com/aymanbagabas/go-osc52 v1.0.2 h1:tRqcFxSpoDFwHzgjjgU3rACsQHmKo7w7EJf+oCEFI6k=
 github.com/aymanbagabas/go-osc52 v1.0.2/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4=
+github.com/aymanbagabas/go-osc52 v1.0.3 h1:DTwqENW7X9arYimJrPeGZcV0ln14sGMt3pHZspWD+Mg=
+github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4=
 github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
 github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
 github.com/caarlos0/env/v6 v6.9.1 h1:zOkkjM0F6ltnQ5eBX6IPI41UP/KDGEK7rRPwGCNos8k=
@@ -32,8 +32,6 @@ github.com/charmbracelet/bubbles v0.10.4-0.20220412141214-292a1dd7ba97/go.mod h1
 github.com/charmbracelet/bubbletea v0.19.3/go.mod h1:VuXF2pToRxDUHcBUcPmCRUHRvFATM4Ckb/ql1rBl3KA=
 github.com/charmbracelet/bubbletea v0.20.0 h1:/b8LEPgCbNr7WWZ2LuE/BV1/r4t5PyYJtDb+J3vpwxc=
 github.com/charmbracelet/bubbletea v0.20.0/go.mod h1:zpkze1Rioo4rJELjRyGlm9T2YNou1Fm4LIJQSa5QMEM=
-github.com/charmbracelet/glamour v0.4.0 h1:scR+smyB7WdmrlIaff6IVlm48P48JaNM7JypM/VGl4k=
-github.com/charmbracelet/glamour v0.4.0/go.mod h1:9ZRtG19AUIzcTm7FGLGbq3D5WKQ5UyZBbQsMQN0XIqc=
 github.com/charmbracelet/harmonica v0.1.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
 github.com/charmbracelet/keygen v0.3.0 h1:mXpsQcH7DDlST5TddmXNXjS0L7ECk4/kLQYyBcsan2Y=
 github.com/charmbracelet/keygen v0.3.0/go.mod h1:1ukgO8806O25lUZ5s0IrNur+RlwTBERlezdgW71F5rM=
@@ -129,6 +127,7 @@ github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKt
 github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8=
 github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig=
 github.com/muesli/termenv v0.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtlyx2mBw=
+github.com/muesli/termenv v0.11.0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs=
 github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739 h1:QANkGiGr39l1EESqrE0gZw0/AJNYzIvoGLhIoVYtluI=
 github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
  
  
  
    
    @@ -70,17 +70,30 @@ func (r *Code) Init() tea.Cmd {
 	if err != nil {
 		return common.ErrorCmd(err)
 	}
-	// FIXME reset underline and color
+	// FIXME: this is a hack to reset formatting at the end of every line.
 	c = wrap.String(f, w)
-	r.viewport.Viewport.SetContent(c)
+	s := strings.Split(c, "\n")
+	for i, l := range s {
+		s[i] = l + "\x1b[0m"
+	}
+	r.viewport.Viewport.SetContent(strings.Join(s, "\n"))
 	return nil
 }
 
 // Update implements tea.Model.
 func (r *Code) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+	cmds := make([]tea.Cmd, 0)
+	switch msg.(type) {
+	case tea.WindowSizeMsg:
+		// Recalculate content width and line wrap.
+		cmds = append(cmds, r.Init())
+	}
 	v, cmd := r.viewport.Update(msg)
 	r.viewport = v.(*vp.ViewportBubble)
-	return r, cmd
+	if cmd != nil {
+		cmds = append(cmds, cmd)
+	}
+	return r, tea.Batch(cmds...)
 }
 
 // View implements tea.View.
  
  
  
    
    @@ -15,7 +15,7 @@ type Selector struct {
 	filterState list.FilterState
 }
 
-// IdentifiableItem is an item that can be identified by a string and extends list.Item.
+// IdentifiableItem is an item that can be identified by a string. Implements list.DefaultItem.
 type IdentifiableItem interface {
 	list.DefaultItem
 	ID() string
  
  
  
    
    @@ -70,10 +70,11 @@ func (s *Selection) ShortHelp() []key.Binding {
 	kb := make([]key.Binding, 0)
 	kb = append(kb,
 		s.common.Keymap.UpDown,
-		s.common.Keymap.Select,
+		s.common.Keymap.Section,
 	)
 	if s.activeBox == selectorBox {
 		kb = append(kb,
+			s.common.Keymap.Select,
 			k.Filter,
 			k.ClearFilter,
 		)