mirror of
https://shylinux.com/x/icebergs
synced 2025-06-26 10:27:31 +08:00
add tmux.go
This commit is contained in:
parent
e27c4c3502
commit
a8646cb75e
1
core/chat/conf.go
Normal file
1
core/chat/conf.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
package chat
|
31
core/wiki/template.go
Normal file
31
core/wiki/template.go
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package wiki
|
||||||
|
|
||||||
|
var title = `<span class="story" data-type="{{.Option "type"}}" data-name="{{.Option "prefix"}}" data-text="{{.Option "text"}}">{{.Option "prefix"}}{{.Option "content"}}</span>`
|
||||||
|
|
||||||
|
var shell = `<div class="story code" data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "input"}}">$ {{.Option "input"}}
|
||||||
|
{{.Option "output"}}</div>`
|
||||||
|
|
||||||
|
var order = `<ul class="story"
|
||||||
|
data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}">
|
||||||
|
{{range $index, $value := .Optionv "list"}}<li>{{$value}}</li>{{end}}</ul>`
|
||||||
|
|
||||||
|
var table = `<table class="story"
|
||||||
|
data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}">
|
||||||
|
<tr>{{range $i, $v := .Optionv "head"}}<th>{{$v}}</th>{{end}}</tr>
|
||||||
|
{{range $index, $value := .Optionv "list"}}
|
||||||
|
<tr>{{range $i, $v := $value}}<td>{{$v}}</td>{{end}}</tr>
|
||||||
|
{{end}}
|
||||||
|
</table>`
|
||||||
|
|
||||||
|
var prefix = `<svg class="story" vertion="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
data-type="{{.Option "type"}}" data-name="{{.Option "name"}}" data-text="{{.Option "text"}}"
|
||||||
|
width="{{.Option "width"}}" height="{{.Option "height"}}" style="{{.Option "style"}}"
|
||||||
|
>`
|
||||||
|
|
||||||
|
var premenu = `<ul class="story premenu"></ul>`
|
||||||
|
var endmenu = `<ul class="story endmenu">
|
||||||
|
{{$menu := .Optionv "menu"}}
|
||||||
|
{{range $index, $value := Value $menu "list"}}
|
||||||
|
<li>{{Value $value "prefix"}} {{Value $value "content"}}</li>
|
||||||
|
{{end}}
|
||||||
|
</ul>`
|
5
misc/shy.go
Normal file
5
misc/shy.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package misc
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/shylinux/icebergs/misc/tmux"
|
||||||
|
)
|
202
misc/tmux/tmux.go
Normal file
202
misc/tmux/tmux.go
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
package tmux
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/shylinux/icebergs"
|
||||||
|
"github.com/shylinux/icebergs/base/cli"
|
||||||
|
"github.com/shylinux/toolkits"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Frame struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Frame) Spawn(m *ice.Message, c *ice.Context, arg ...string) ice.Server {
|
||||||
|
return &Frame{}
|
||||||
|
}
|
||||||
|
func (f *Frame) Begin(m *ice.Message, arg ...string) ice.Server {
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
func (f *Frame) Start(m *ice.Message, arg ...string) bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
func (f *Frame) Close(m *ice.Message, arg ...string) bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
var Index = &ice.Context{Name: "tmux", Help: "终端模块",
|
||||||
|
Caches: map[string]*ice.Cache{},
|
||||||
|
Configs: map[string]*ice.Config{
|
||||||
|
"buffer": {Name: "buffer", Help: "缓存", Value: kit.Data()},
|
||||||
|
"session": {Name: "session", Help: "会话", Value: kit.Data(
|
||||||
|
"format", "#{session_id},#{session_attached},#{session_name},#{session_windows},#{session_height},#{session_width}",
|
||||||
|
"fields", "id,tag,session,windows,height,width",
|
||||||
|
"cmd", []interface{}{"cli.system", "tmux", "list-session"},
|
||||||
|
)},
|
||||||
|
"windows": {Name: "window", Help: "窗口", Value: kit.Data(
|
||||||
|
"format", "#{window_id},#{window_active},#{window_name},#{window_panes},#{window_height},#{window_width}",
|
||||||
|
"fields", "id,tag,window,panes,height,width",
|
||||||
|
"cmd", []interface{}{"cli.system", "tmux", "list-windows"},
|
||||||
|
)},
|
||||||
|
"panes": {Name: "pane", Help: "终端", Value: kit.Data(
|
||||||
|
"format", "#{pane_id},#{pane_active},#{pane_index},#{pane_tty},#{pane_height},#{pane_width}",
|
||||||
|
"fields", "id,tag,pane,tty,height,width",
|
||||||
|
"cmd", []interface{}{"cli.system", "tmux", "list-panes"},
|
||||||
|
)},
|
||||||
|
"view": {Name: "pane", Help: "终端", Value: kit.Data(
|
||||||
|
"format", "#{pane_id},#{pane_active},#{pane_index},#{pane_tty},#{pane_height},#{pane_width}",
|
||||||
|
"fields", "id,tag,pane,tty,height,width",
|
||||||
|
"cmd", []interface{}{"cli.system", "tmux", "list-panes"},
|
||||||
|
)},
|
||||||
|
},
|
||||||
|
Commands: map[string]*ice.Command{
|
||||||
|
ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
|
m.Cmd(ice.GDB_EVENT, "listen", "miss.start", "cli.tmux.session")
|
||||||
|
}},
|
||||||
|
ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
|
}},
|
||||||
|
"buffer": {Name: "buffer", Help: "终端",
|
||||||
|
List: kit.List(
|
||||||
|
kit.MDB_TYPE, "text", "name", "buffer", "action", "auto",
|
||||||
|
kit.MDB_TYPE, "text", "name", "value",
|
||||||
|
kit.MDB_TYPE, "button", "value", "查看", "action", "auto",
|
||||||
|
kit.MDB_TYPE, "button", "value", "返回", "cb", "Last",
|
||||||
|
),
|
||||||
|
Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
|
if len(arg) == 0 {
|
||||||
|
// 缓存列表
|
||||||
|
for i, v := range kit.Split(m.Cmdx("cli.system", "tmux", "list-buffers"), "\n") {
|
||||||
|
ls := strings.SplitN(v, ": ", 3)
|
||||||
|
m.Push("buffer", ls[0])
|
||||||
|
m.Push("size", ls[1])
|
||||||
|
if i < 3 {
|
||||||
|
m.Push("text", m.Cmdx("cli.system", "tmux", "show-buffer", "-b", ls[0]))
|
||||||
|
} else {
|
||||||
|
m.Push("text", ls[2][1:])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(arg) > 1 {
|
||||||
|
// 设置缓存
|
||||||
|
m.Cmd("cli.system", "tmux", "set-buffer", "-b", arg[0], arg[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查看缓存
|
||||||
|
m.Cmdy("cli.system", "tmux", "show-buffer", "-b", arg[0]).Set("append")
|
||||||
|
}},
|
||||||
|
"session": {Name: "session", Help: "会话", List: kit.List(
|
||||||
|
kit.MDB_TYPE, "text", "name", "session", "action", "auto",
|
||||||
|
kit.MDB_TYPE, "text", "name", "window", "action", "auto",
|
||||||
|
kit.MDB_TYPE, "text", "name", "pane", "action", "auto",
|
||||||
|
kit.MDB_TYPE, "button", "value", "查看", "action", "auto",
|
||||||
|
kit.MDB_TYPE, "button", "value", "返回", "cb", "Last",
|
||||||
|
), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
|
prefix := []string{"cli.system", "tmux"}
|
||||||
|
if len(arg) > 3 {
|
||||||
|
switch arg[1] {
|
||||||
|
case "select":
|
||||||
|
if arg[2] == "session" {
|
||||||
|
// 选择会话
|
||||||
|
m.Cmd(prefix, "switch-client", "-t", arg[3])
|
||||||
|
arg = arg[:0]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.Cmd(prefix, "switch-client", "-t", m.Option("session")); arg[2] == "window" {
|
||||||
|
// 选择窗口
|
||||||
|
m.Cmd(prefix, "select-window", "-t", m.Option("session")+":"+arg[3])
|
||||||
|
arg = []string{m.Option("session")}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.Cmd(prefix, "select-window", "-t", m.Option("session")+":"+m.Option("window")); arg[2] == "pane" {
|
||||||
|
// 选择终端
|
||||||
|
m.Cmd(prefix, "select-pane", "-t", m.Option("session")+":"+m.Option("window")+"."+arg[3])
|
||||||
|
arg = []string{m.Option("session"), m.Option("window")}
|
||||||
|
}
|
||||||
|
case "modify":
|
||||||
|
switch arg[2] {
|
||||||
|
case "session":
|
||||||
|
// 重命名会话
|
||||||
|
m.Cmd(prefix, "rename-session", "-t", arg[4], arg[3])
|
||||||
|
arg = arg[:0]
|
||||||
|
case "window":
|
||||||
|
// 重命名窗口
|
||||||
|
m.Cmd(prefix, "rename-window", "-t", m.Option("session")+":"+arg[4], arg[3])
|
||||||
|
arg = []string{m.Option("session")}
|
||||||
|
}
|
||||||
|
case "delete":
|
||||||
|
switch arg[2] {
|
||||||
|
case "session":
|
||||||
|
// 删除会话
|
||||||
|
m.Cmd(prefix, "kill-session", "-t", arg[3])
|
||||||
|
arg = arg[:0]
|
||||||
|
case "window":
|
||||||
|
// 删除窗口
|
||||||
|
m.Cmd(prefix, "kill-window", "-t", m.Option("session")+":"+arg[3])
|
||||||
|
arg = []string{m.Option("session")}
|
||||||
|
case "pane":
|
||||||
|
// 删除终端
|
||||||
|
m.Cmd(prefix, "kill-pane", "-t", m.Option("session")+":"+m.Option("window")+"."+arg[3])
|
||||||
|
arg = []string{m.Option("session"), m.Option("window")}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(arg) == 0 {
|
||||||
|
// 会话列表
|
||||||
|
m.Split(m.Cmdx(m.Confv(cmd, "meta.cmd"),
|
||||||
|
"-F", m.Conf(cmd, "meta.format")), m.Conf(cmd, "meta.fields"), ",", "\n")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
target := arg[0]
|
||||||
|
if m.Cmd(prefix, "has-session", "-t", target).Append("code") != "0" {
|
||||||
|
// 创建会话
|
||||||
|
m.Cmd(prefix, "new-session", "-ds", arg[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(arg) == 1 {
|
||||||
|
// 窗口列表
|
||||||
|
m.Cmdy("windows", target)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if target = arg[0] + ":" + arg[1]; m.Cmd(prefix, "rename-window", "-t", target, arg[1]).Append("code") != "0" {
|
||||||
|
// 创建窗口
|
||||||
|
m.Cmd(prefix, "switch-client", "-t", arg[0])
|
||||||
|
m.Cmd(prefix, "new-window", "-t", arg[0], "-dn", arg[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(arg) == 2 {
|
||||||
|
// 终端列表
|
||||||
|
m.Cmdy("panes", target)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if target = arg[0] + ":" + arg[1] + "." + arg[2]; len(arg) > 3 {
|
||||||
|
// 执行命令
|
||||||
|
m.Cmd(prefix, "send-keys", "-t", target, strings.Join(arg[3:], " "), "Enter")
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 终端内容
|
||||||
|
m.Cmdy("view", target)
|
||||||
|
}},
|
||||||
|
"windows": {Name: "window", Help: "窗口", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
|
m.Split(m.Cmdx(m.Confv(cmd, "meta.cmd"), "-t", kit.Select("", arg, 0),
|
||||||
|
"-F", m.Conf(cmd, "meta.format")), m.Conf(cmd, "meta.fields"), ",", "\n")
|
||||||
|
}},
|
||||||
|
"panes": {Name: "pane", Help: "终端", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
|
m.Split(m.Cmdx(m.Confv(cmd, "meta.cmd"), "-t", kit.Select("", arg, 0),
|
||||||
|
"-F", m.Conf(cmd, "meta.format")), m.Conf(cmd, "meta.fields"), ",", "\n")
|
||||||
|
}},
|
||||||
|
"view": {Name: "view", Help: "终端", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||||
|
m.Cmdy("cli.system", "tmux", "capture-pane", "-pt", kit.Select("", arg, 0)).Set("append")
|
||||||
|
}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { cli.Index.Register(Index, &Frame{}) }
|
Loading…
x
Reference in New Issue
Block a user