diff --git a/src/tmux.go b/src/tmux.go index ac952f85..176c9f45 100644 --- a/src/tmux.go +++ b/src/tmux.go @@ -46,11 +46,11 @@ func tmuxFloatingPaneInfo() (int, int, bool) { return width, height, true } -// A lone ';' argument is a command separator to tmux, aborting the whole -// command at parse time +// tmux ends a command at an argument ending in ';', so a trailing one is +// escaped. Elsewhere it is not special func escapeTmuxSeparator(str string) string { - if str == ";" { - return `\;` + if strings.HasSuffix(str, ";") { + return str[:len(str)-1] + `\;` } return str } diff --git a/src/tmux_test.go b/src/tmux_test.go index 3d57acd5..de1f46cd 100644 --- a/src/tmux_test.go +++ b/src/tmux_test.go @@ -18,6 +18,7 @@ func TestEscapeTmuxFormat(t *testing.T) { {" C# notes #S ", " C## notes ##S "}, {";", `\;`}, {"; rm", "; rm"}, + {"C#;", `C##\;`}, } { if actual := escapeTmuxFormat(tc.given); actual != tc.expected { t.Errorf("expected %q, got %q", tc.expected, actual) @@ -35,10 +36,15 @@ func TestEscapeTmuxSeparator(t *testing.T) { {"#", "#"}, {"#{pane_id}", "#{pane_id}"}, {"100%", "100%"}, + // tmux drops a trailing ';' and everything after it, so only that + // one is escaped {";", `\;`}, + {"abc;", `abc\;`}, + {";;", `;\;`}, + {`foo\;`, `foo\\;`}, {"; rm", "; rm"}, {" ; ", " ; "}, - {";;", ";;"}, + {"a;b", "a;b"}, } { if actual := escapeTmuxSeparator(tc.given); actual != tc.expected { t.Errorf("expected %q, got %q", tc.expected, actual)