Skip to content

Commit

Permalink
wip: use types for session, client, buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
kkga committed Sep 14, 2021
1 parent 594dc3f commit da4f0c3
Show file tree
Hide file tree
Showing 16 changed files with 180 additions and 94 deletions.
4 changes: 3 additions & 1 deletion cmd/attach.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ func (c *AttachCmd) Run() error {
return err
}

if err := kak.Connect(fp.Name, fp.Line, fp.Column, c.session); err != nil {
s := kak.Session{Name: c.session}

if err := kak.Connect(s, fp.Name, fp.Line, fp.Column); err != nil {
return err
}

Expand Down
7 changes: 6 additions & 1 deletion cmd/cat.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,12 @@ func (c *CatCmd) Run() error {
go kak.ReadTmp(f, ch)

sendCmd := fmt.Sprintf("write -force %s", f.Name())
if err := kak.Send(sendCmd, c.buffer, c.session, c.client); err != nil {

if err := kak.Send(
kak.Session{c.session},
kak.Client{c.client},
kak.Buffer{c.buffer},
sendCmd); err != nil {
return err
}

Expand Down
3 changes: 2 additions & 1 deletion cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ func (c *Cmd) Init(args []string) error {
}

c.fs.Usage = c.usage
c.session, c.client = env.Session, env.Client
c.session = env.Session
c.client = env.Client

if err := c.fs.Parse(args); err != nil {
return err
Expand Down
40 changes: 22 additions & 18 deletions cmd/edit.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,20 +43,29 @@ func (c *EditCmd) Run() error {
}

if gitDirName != "" {
if !sessionExists(gitDirName) {
sessionName, err := kak.Create(gitDirName)
gitDirSession := kak.Session{Name: gitDirName}
exists, err := gitDirSession.Exists()
if err != nil {
return err
}
if !exists {
sessionName, err := kak.Create(gitDirSession.Name)
if err != nil {
return err
}
fmt.Println("git-dir session started:", sessionName)
}
if err := kak.Connect(fp.Name, fp.Line, fp.Column, gitDirName); err != nil {
if err := kak.Connect(gitDirSession, fp.Name, fp.Line, fp.Column); err != nil {
return err
}
} else {
defaultSession := os.Getenv("KKS_DEFAULT_SESSION")
if defaultSession != "" && sessionExists(defaultSession) {
if err := kak.Connect(fp.Name, fp.Line, fp.Column, defaultSession); err != nil {
defaultSession := kak.Session{Name: os.Getenv("KKS_DEFAULT_SESSION")}
exists, err := defaultSession.Exists()
if err != nil {
return err
}
if exists {
if err := kak.Connect(defaultSession, fp.Name, fp.Line, fp.Column); err != nil {
return err
}
} else {
Expand All @@ -66,10 +75,11 @@ func (c *EditCmd) Run() error {
}
}
default:
session := kak.Session{Name: c.session}
switch c.client {
case "":
// if no client, attach to session with new client
if err := kak.Connect(fp.Name, fp.Line, fp.Column, c.session); err != nil {
if err := kak.Connect(session, fp.Name, fp.Line, fp.Column); err != nil {
return err
}
default:
Expand All @@ -83,7 +93,11 @@ func (c *EditCmd) Run() error {
sb.WriteString(fmt.Sprintf(" %d", fp.Column))
}

if err := kak.Send(sb.String(), "", c.session, c.client); err != nil {
if err := kak.Send(
kak.Session{c.session},
kak.Client{c.client},
kak.Buffer{c.buffer},
sb.String()); err != nil {
return err
}
}
Expand All @@ -99,13 +113,3 @@ func parseGitToplevel() string {
}
return strings.TrimSpace(strings.ReplaceAll(path.Base(string(gitOut)), ".", "-"))
}

func sessionExists(name string) bool {
sessions, _ := kak.List()
for _, s := range sessions {
if s.Name == name {
return true
}
}
return false
}
6 changes: 5 additions & 1 deletion cmd/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,11 @@ func (c *GetCmd) Run() error {
return err
}

resp, err := kak.Get(query, c.buffer, c.session, c.client)
resp, err := kak.Get(
kak.Session{c.session},
kak.Client{c.client},
kak.Buffer{c.buffer},
query)
if err != nil {
return err
}
Expand Down
18 changes: 13 additions & 5 deletions cmd/kill.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,29 @@ type KillCmd struct {
}

func (c *KillCmd) Run() error {
kakCmd := "kill"
sendCmd := "kill"

switch c.allSessions {
case false:
// TODO need to somehow trigger "no session" err
if err := kak.Send(kakCmd, "", c.session, ""); err != nil {
if err := kak.Send(
kak.Session{c.session},
kak.Client{c.client},
kak.Buffer{c.buffer},
sendCmd); err != nil {
return err
}
case true:
sessions, err := kak.List()
sessions, err := kak.Sessions()
if err != nil {
return err
}
for _, sess := range sessions {
if err := kak.Send(kakCmd, "", sess.Name, ""); err != nil {
for _, s := range sessions {
if err := kak.Send(
s,
kak.Client{c.client},
kak.Buffer{c.buffer},
sendCmd); err != nil {
return err
}
}
Expand Down
8 changes: 4 additions & 4 deletions cmd/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ func (c *ListCmd) Run() error {
w.Init(os.Stdout, 0, 8, 1, '\t', 0)

for _, s := range sessions {
if len(s.Clients) == 0 {
fmt.Fprintf(w, "%s\t: %s\t: %s\n", s.Name, " ", s.Dir)
if len(s.Clients()) == 0 {
fmt.Fprintf(w, "%s\t: %s\t: %s\n", s.Name, " ", s.Dir())
} else {
for _, cl := range s.Clients {
fmt.Fprintf(w, "%s\t: %s\t: %s\n", s.Name, cl, s.Dir)
for _, cl := range s.Clients() {
fmt.Fprintf(w, "%s\t: %s\t: %s\n", s.Name, cl, s.Dir())
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/new.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ type NewCmd struct {
func (c *NewCmd) Run() error {
c.name = c.fs.Arg(0)

sessions, err := kak.List()
sessions, err := kak.Sessions()
for _, s := range sessions {
if s.Name == c.name {
return errors.New(fmt.Sprintf("session already exists: %s", c.name))
Expand Down
16 changes: 10 additions & 6 deletions cmd/send.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,24 +27,28 @@ type SendCmd struct {

func (c *SendCmd) Run() error {
// TODO probably need to do some shell escaping here
kakCmd := strings.Join(c.fs.Args(), " ")
sendCmd := strings.Join(c.fs.Args(), " ")

switch c.allClients {
case true:
sessions, err := kak.List()
sessions, err := kak.Sessions()
if err != nil {
return err
}
for _, sess := range sessions {
for _, cl := range sess.Clients {
if err := kak.Send(kakCmd, "", sess.Name, cl); err != nil {
for _, s := range sessions {
for _, cl := range s.Clients() {
if err := kak.Send(s, cl, kak.Buffer{}, sendCmd); err != nil {
return err
}
}
}
case false:
// TODO: need to trigger "session not set" error
if err := kak.Send(kakCmd, c.buffer, c.session, c.client); err != nil {
if err := kak.Send(
kak.Session{c.session},
kak.Client{c.client},
kak.Buffer{c.buffer},
sendCmd); err != nil {
return err
}
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ require (
github.com/google/go-cmp v0.5.6
)

require golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3 // indirect
require golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
3 changes: 1 addition & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWp
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3 h1:3Ad41xy2WCESpufXwgs7NpDSu+vjxqLt2UFqUV+20bI=
golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
4 changes: 2 additions & 2 deletions kak/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ import (
"syscall"
)

func Connect(file string, line int, col int, sess string) error {
func Connect(session Session, file string, line int, col int) error {
kakBinary, err := exec.LookPath("kak")
if err != nil {
return err
}

kakExecArgs := []string{kakBinary}
kakExecArgs = append(kakExecArgs, "-c", sess)
kakExecArgs = append(kakExecArgs, "-c", session.Name)

if file != "" {
kakExecArgs = append(kakExecArgs, file)
Expand Down
6 changes: 3 additions & 3 deletions kak/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/fsnotify/fsnotify"
)

func Get(getStr, buf, session, client string) ([]string, error) {
func Get(session Session, client Client, buffer Buffer, query string) ([]string, error) {
// create a tmp file for kak to echo the value
f, err := os.CreateTemp("", "kks-tmp")
if err != nil {
Expand All @@ -21,8 +21,8 @@ func Get(getStr, buf, session, client string) ([]string, error) {
go ReadTmp(f, ch)

// tell kak to echo the requested state
sendCmd := fmt.Sprintf("echo -quoting kakoune -to-file %s %%{ %s }", f.Name(), getStr)
if err := Send(sendCmd, buf, session, client); err != nil {
sendCmd := fmt.Sprintf("echo -quoting kakoune -to-file %s %%{ %s }", f.Name(), query)
if err := Send(session, client, buffer, sendCmd); err != nil {
return nil, err
}

Expand Down
63 changes: 63 additions & 0 deletions kak/kak.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package kak

import (
"os/exec"
"strings"
)

type Session struct {
Name string
// clients []string
// dir string
}

type Client struct{ Name string }
type Buffer struct{ Name string }

func (s *Session) Exists() (bool, error) {
sessions, err := Sessions()
if err != nil {
return false, err
}

for _, session := range sessions {
if session.Name == s.Name {
return true, nil
}
}
return false, nil
}

func (s *Session) Clients() (clients []Client) {
cl, err := Get(*s, Client{}, Buffer{}, "%val{client_list}")
if err != nil {
return []Client{}
}

for _, c := range cl {
clients = append(clients, Client{c})
}

return clients
}

func (s *Session) Dir() string {
dir, err := Get(*s, Client{}, Buffer{}, "%sh{pwd}")
if err != nil {
return ""
}
return dir[0]
}

func Sessions() (sessions []Session, err error) {
output, err := exec.Command("kak", "-l").Output()
if err != nil {
return nil, err
}

for _, s := range strings.Split(strings.TrimSpace(string(output)), "\n") {
sessions = append(sessions, Session{Name: s})
}

return sessions, nil
}
Loading

0 comments on commit da4f0c3

Please sign in to comment.