forked from x/icebergs
opt tmux
This commit is contained in:
parent
5a05667a74
commit
fa802eabaa
@ -14,7 +14,6 @@ func _list_fields(m *ice.Message) []string {
|
||||
}
|
||||
func _list_inputs(m *ice.Message, prefix, chain string, field, value string) {
|
||||
list := map[string]int{}
|
||||
m.Debug("what %v %v", prefix, chain)
|
||||
m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) {
|
||||
if val = kit.GetMeta(val); kit.Format(val[kit.MDB_COUNT]) != "" {
|
||||
list[kit.Format(val[field])] = kit.Int(val[kit.MDB_COUNT])
|
||||
@ -74,6 +73,7 @@ func _list_export(m *ice.Message, prefix, chain, file string) {
|
||||
|
||||
count := 0
|
||||
head := kit.Split(m.OptionFields())
|
||||
m.Option(ice.CACHE_LIMIT, "-1")
|
||||
m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) {
|
||||
if val = kit.GetMeta(val); index == 0 {
|
||||
if len(head) == 0 || head[0] == "detail" { // 默认表头
|
||||
|
@ -281,11 +281,11 @@ func init() {
|
||||
f.ps1 = arg
|
||||
f.prompt(m)
|
||||
}},
|
||||
PRINTF: {Name: "printf run:button text:textarea", Help: "输出显示", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
PRINTF: {Name: "printf run:button text", Help: "输出显示", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
f := m.Optionv(FRAME).(*Frame)
|
||||
f.printf(m, arg[0])
|
||||
}},
|
||||
SCREEN: {Name: "screen run:button text:textarea", Help: "输出命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
SCREEN: {Name: "screen run:button text", Help: "输出命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
f := m.Optionv(FRAME).(*Frame)
|
||||
for _, line := range kit.Split(arg[0], ice.NL, ice.NL) {
|
||||
fmt.Fprintf(f.pipe, line+ice.NL)
|
||||
|
@ -96,7 +96,7 @@ const SCRIPT = "script"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Commands: map[string]*ice.Command{
|
||||
SCRIPT: {Name: "script name npage text:textarea auto create", Help: "脚本解析", Action: map[string]*ice.Action{
|
||||
SCRIPT: {Name: "script name npage text auto create", Help: "脚本解析", Action: map[string]*ice.Action{
|
||||
mdb.CREATE: {Name: "create name=shy text=etc/yac.txt", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(MATRIX, mdb.CREATE, m.Option(kit.MDB_NAME))
|
||||
if buf, err := ioutil.ReadFile(m.Option(kit.MDB_TEXT)); err == nil {
|
||||
|
2
conf.go
2
conf.go
@ -3,8 +3,10 @@ package ice
|
||||
const (
|
||||
TB = "\t"
|
||||
SP = " "
|
||||
DF = ":"
|
||||
PS = "/"
|
||||
PT = "."
|
||||
FS = ","
|
||||
NL = "\n"
|
||||
OF = " of "
|
||||
|
||||
|
@ -17,7 +17,7 @@ const PARSE = "parse"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Commands: map[string]*ice.Command{
|
||||
PARSE: {Name: "parse type=auto,base64,json,http,form,time,list auto text:textarea", Help: "解析", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
PARSE: {Name: "parse type=auto,base64,json,http,form,time,list auto text", Help: "解析", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) < 2 {
|
||||
return
|
||||
}
|
||||
|
6
misc.go
6
misc.go
@ -260,8 +260,12 @@ func (c *Context) split(name string) (list []interface{}) {
|
||||
ls := kit.Split(name, SP, ":=@")
|
||||
for i := 1; i < len(ls); i++ {
|
||||
switch ls[i] {
|
||||
case "run":
|
||||
item = kit.Dict(kit.MDB_TYPE, BUTTON, kit.MDB_NAME, "run")
|
||||
list = append(list, item)
|
||||
case "text":
|
||||
list = append(list, kit.List(kit.MDB_TYPE, TEXTAREA, kit.MDB_NAME, "text")...)
|
||||
item = kit.Dict(kit.MDB_TYPE, TEXTAREA, kit.MDB_NAME, "text")
|
||||
list = append(list, item)
|
||||
case "auto":
|
||||
list = append(list, kit.List(kit.MDB_TYPE, BUTTON, kit.MDB_NAME, "list", kit.MDB_ACTION, AUTO)...)
|
||||
list = append(list, kit.List(kit.MDB_TYPE, BUTTON, kit.MDB_NAME, "back")...)
|
||||
|
@ -10,9 +10,10 @@ import (
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
const TEXT = "text"
|
||||
|
||||
const BUFFER = "buffer"
|
||||
const (
|
||||
BUFFER = "buffer"
|
||||
TEXT = "text"
|
||||
)
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
@ -40,6 +41,7 @@ func init() {
|
||||
m.Config(mdb.LIST, "")
|
||||
m.Config(kit.MDB_COUNT, "0")
|
||||
|
||||
m.Option(ice.CACHE_LIMIT, "-1")
|
||||
m.Cmdy(mdb.IMPORT, m.PrefixKey(), "", mdb.LIST)
|
||||
m.Grows(m.PrefixKey(), "", "", "", func(index int, value map[string]interface{}) {
|
||||
m.Cmd(cli.SYSTEM, TMUX, "set-buffer", "-b", value[kit.MDB_NAME], value[kit.MDB_TEXT])
|
||||
@ -77,7 +79,6 @@ func init() {
|
||||
text := m.Cmdx(cli.SYSTEM, TMUX, "show-buffer")
|
||||
m.EchoQRCode(text)
|
||||
m.EchoScript(text)
|
||||
m.Render("")
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -6,12 +6,22 @@ import (
|
||||
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/cli"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
func _tmux_key(arg ...string) string {
|
||||
if len(arg) > 2 {
|
||||
return arg[0] + ice.DF + arg[1] + ice.PT + arg[2]
|
||||
} else if len(arg) > 1 {
|
||||
return arg[0] + ice.DF + arg[1]
|
||||
} else {
|
||||
return arg[0]
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
FORMAT = "format"
|
||||
FIELDS = "fields"
|
||||
@ -22,6 +32,7 @@ const (
|
||||
WINDOW = "window"
|
||||
PANE = "pane"
|
||||
VIEW = "view"
|
||||
CMD = "cmd"
|
||||
)
|
||||
|
||||
func init() {
|
||||
@ -35,21 +46,33 @@ func init() {
|
||||
FIELDS, "id,tag,window,panes,height,width",
|
||||
)},
|
||||
PANE: {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",
|
||||
FORMAT, "#{pane_id},#{pane_active},#{pane_index},#{pane_tty},#{pane_height},#{pane_width},#{pane_current_command}",
|
||||
FIELDS, "id,tag,pane,tty,height,width,cmd",
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
SESSION: {Name: "session session window pane cmd auto create script", Help: "会话管理", Action: map[string]*ice.Action{
|
||||
web.DREAM_CREATE: {Name: "dream.create type name", Help: "梦想", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(m.Prefix(SESSION), mdb.CREATE)
|
||||
if kit.IndexOf(m.Cmd(m.PrefixKey()).Appendv(SESSION), m.Option(kit.MDB_NAME)) == -1 {
|
||||
m.Cmd(m.PrefixKey(), mdb.CREATE)
|
||||
}
|
||||
}},
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(ctx.ACTION) == SCRIPT {
|
||||
m.Cmdy(SCRIPT, mdb.INPUTS, arg)
|
||||
return
|
||||
}
|
||||
switch arg[0] {
|
||||
case kit.MDB_NAME:
|
||||
m.Cmdy(web.DREAM).Cut("name,size,time")
|
||||
}
|
||||
}},
|
||||
mdb.CREATE: {Name: "create name", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Option(cli.CMD_ENV, TMUX, "")
|
||||
if m.Option(PANE) != "" {
|
||||
m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)+"."+m.Option(PANE))
|
||||
if m.Option(PANE) != "" { // 创建终端
|
||||
m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)))
|
||||
|
||||
} else if m.Option(WINDOW) != "" {
|
||||
m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", m.Option(SESSION)+":"+m.Option(WINDOW))
|
||||
} else if m.Option(WINDOW) != "" { // 创建终端
|
||||
m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW)))
|
||||
|
||||
} else if m.Option(SESSION) != "" { // 创建窗口
|
||||
m.Cmdy(cli.SYSTEM, TMUX, "new-window", "-t", m.Option(SESSION), "-dn", m.Option(kit.MDB_NAME))
|
||||
@ -60,7 +83,7 @@ func init() {
|
||||
name := ls[len(ls)-1]
|
||||
|
||||
m.Cmdy(cli.SYSTEM, TMUX, "new-session", "-ds", m.Option(kit.MDB_NAME), "-n", name)
|
||||
name = m.Option(kit.MDB_NAME) + ":" + ls[len(ls)-1]
|
||||
name = _tmux_key(m.Option(kit.MDB_NAME), ls[len(ls)-1])
|
||||
|
||||
m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", kit.Keys(name, "1"), "-p", "20")
|
||||
m.Cmdy(cli.SYSTEM, TMUX, "split-window", "-t", kit.Keys(name, "2"), "-h")
|
||||
@ -73,10 +96,21 @@ func init() {
|
||||
}
|
||||
m.ProcessRefresh30ms()
|
||||
}},
|
||||
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(PANE) != "" { // 删除终端
|
||||
m.Cmd(cli.SYSTEM, TMUX, "kill-pane", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)))
|
||||
|
||||
} else if m.Option(WINDOW) != "" { // 删除窗口
|
||||
m.Cmd(cli.SYSTEM, TMUX, "kill-window", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW)))
|
||||
|
||||
} else if m.Option(SESSION) != "" { // 删除会话
|
||||
m.Cmd(cli.SYSTEM, TMUX, "kill-session", "-t", m.Option(SESSION))
|
||||
}
|
||||
}},
|
||||
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch arg[0] {
|
||||
case WINDOW: // 重命名窗口
|
||||
m.Cmd(cli.SYSTEM, TMUX, "rename-window", "-t", m.Option(SESSION)+":"+m.Option(WINDOW), arg[1])
|
||||
m.Cmd(cli.SYSTEM, TMUX, "rename-window", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW)), arg[1])
|
||||
|
||||
case SESSION: // 重命名会话
|
||||
m.Cmd(cli.SYSTEM, TMUX, "rename-session", "-t", m.Option(SESSION), arg[1])
|
||||
@ -84,75 +118,54 @@ func init() {
|
||||
}},
|
||||
mdb.SELECT: {Name: "select", Help: "进入", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(cli.SYSTEM, TMUX, "switch-client", "-t", m.Option(SESSION))
|
||||
if m.Option(WINDOW) != "" {
|
||||
m.Cmd(cli.SYSTEM, TMUX, "select-window", "-t", m.Option(SESSION)+":"+m.Option(WINDOW))
|
||||
if m.Option(WINDOW) != "" { // 切换窗口
|
||||
m.Cmd(cli.SYSTEM, TMUX, "select-window", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW)))
|
||||
}
|
||||
if m.Option(PANE) != "" {
|
||||
m.Cmd(cli.SYSTEM, TMUX, "select-pane", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)+"."+m.Option(PANE))
|
||||
}
|
||||
}},
|
||||
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(PANE) != "" {
|
||||
m.Cmd(cli.SYSTEM, TMUX, "kill-pane", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)+"."+m.Option(PANE))
|
||||
|
||||
} else if m.Option(WINDOW) != "" {
|
||||
m.Cmd(cli.SYSTEM, TMUX, "kill-window", "-t", m.Option(SESSION)+":"+m.Option(WINDOW))
|
||||
|
||||
} else if m.Option(SESSION) != "" {
|
||||
m.Cmd(cli.SYSTEM, TMUX, "kill-session", "-t", m.Option(SESSION))
|
||||
}
|
||||
}},
|
||||
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch arg[0] {
|
||||
case kit.MDB_NAME:
|
||||
m.Option(nfs.DIR_ROOT, m.Conf(web.DREAM, kit.META_PATH))
|
||||
m.Cmdy(nfs.DIR, "./", "name size time")
|
||||
default:
|
||||
m.Option(mdb.FIELDS, "name,type,text")
|
||||
m.Cmdy(mdb.SELECT, SCRIPT, "", mdb.HASH)
|
||||
if m.Option(PANE) != "" { // 切换终端
|
||||
m.Cmd(cli.SYSTEM, TMUX, "select-pane", "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)))
|
||||
}
|
||||
}},
|
||||
|
||||
SCRIPT: {Name: "script name", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.SELECT, SCRIPT, "", mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME)).Table(func(index int, value map[string]string, head []string) {
|
||||
m.Cmd(SCRIPT, m.Option(kit.MDB_NAME)).Table(func(index int, value map[string]string, head []string) {
|
||||
switch value[kit.MDB_TYPE] {
|
||||
case "shell":
|
||||
for _, line := range kit.Split(value[kit.MDB_TEXT], "\n", "\n", "\n") {
|
||||
m.Cmd(cli.SYSTEM, TMUX, "send-keys", "-t", m.Option(SESSION)+":"+m.Option(WINDOW)+"."+m.Option(PANE), line, "Enter")
|
||||
}
|
||||
case "tmux":
|
||||
for _, line := range kit.Split(value[kit.MDB_TEXT], "\n", "\n", "\n") {
|
||||
m.Cmd(cli.SYSTEM, TMUX, line)
|
||||
for _, line := range kit.Split(value[kit.MDB_TEXT], ice.NL, ice.NL, ice.NL) {
|
||||
m.Cmd(CMD, _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)), line)
|
||||
}
|
||||
case "vim":
|
||||
for _, line := range kit.Split(value[kit.MDB_TEXT], ice.NL, ice.NL, ice.NL) {
|
||||
m.Cmd(CMD, _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE)), line)
|
||||
}
|
||||
case "tmux":
|
||||
for _, line := range kit.Split(value[kit.MDB_TEXT], ice.NL, ice.NL, ice.NL) {
|
||||
m.Cmd(cli.SYSTEM, TMUX, line)
|
||||
}
|
||||
}
|
||||
})
|
||||
m.Sleep("100ms")
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 3 { // 执行命令
|
||||
target := arg[0] + ":" + arg[1] + "." + arg[2]
|
||||
m.Cmd(cli.SYSTEM, TMUX, "send-keys", "-t", target, strings.Join(arg[3:], " "), "Enter")
|
||||
m.Sleep("100ms")
|
||||
m.Cmd(CMD, _tmux_key(arg[0], arg[1], arg[2]), arg[3:])
|
||||
}
|
||||
if len(arg) > 2 { // 终端内容
|
||||
target := arg[0] + ":" + arg[1] + "." + arg[2]
|
||||
m.Echo(strings.TrimSpace(m.Cmdx(VIEW, target)))
|
||||
m.Echo(strings.TrimSpace(m.Cmdx(VIEW, _tmux_key(arg[0], arg[1], arg[2]))))
|
||||
return
|
||||
}
|
||||
if len(arg) == 2 { // 终端列表
|
||||
m.Cmdy(PANE, arg[0]+":"+arg[1])
|
||||
if len(arg) > 1 { // 终端列表
|
||||
m.Cmdy(PANE, _tmux_key(arg[0], arg[1]))
|
||||
m.PushAction(mdb.SELECT, mdb.REMOVE)
|
||||
return
|
||||
}
|
||||
if len(arg) == 1 { // 窗口列表
|
||||
if len(arg) > 0 { // 窗口列表
|
||||
m.Cmdy(WINDOW, arg[0])
|
||||
m.PushAction(mdb.SELECT, mdb.REMOVE)
|
||||
return
|
||||
}
|
||||
|
||||
// 会话列表
|
||||
m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-session", "-F", m.Conf(m.Prefix(cmd), kit.Keym(FORMAT))), m.Conf(m.Prefix(cmd), kit.Keym(FIELDS)), ",", "\n")
|
||||
m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-session", "-F", m.Config(FORMAT)), m.Config(FIELDS), ice.FS, ice.NL)
|
||||
m.Table(func(index int, value map[string]string, head []string) {
|
||||
switch value["tag"] {
|
||||
case "1":
|
||||
@ -163,15 +176,17 @@ func init() {
|
||||
})
|
||||
}},
|
||||
WINDOW: {Name: "windows", Help: "窗口", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-windows", "-t", kit.Select("", arg, 0),
|
||||
"-F", m.Conf(m.Prefix(cmd), kit.Keym(FORMAT))), m.Conf(m.Prefix(cmd), kit.Keym(FIELDS)), ",", "\n")
|
||||
m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-windows", "-t", kit.Select("", arg, 0), "-F", m.Config(FORMAT)), m.Config(FIELDS), ice.FS, ice.NL)
|
||||
}},
|
||||
PANE: {Name: "panes", Help: "终端", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-panes", "-t", kit.Select("", arg, 0),
|
||||
"-F", m.Conf(m.Prefix(cmd), kit.Keym(FORMAT))), m.Conf(m.Prefix(cmd), kit.Keym(FIELDS)), ",", "\n")
|
||||
m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-panes", "-t", kit.Select("", arg, 0), "-F", m.Config(FORMAT)), m.Config(FIELDS), ice.FS, ice.NL)
|
||||
}},
|
||||
VIEW: {Name: "view", Help: "终端", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
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(ice.MSG_APPEND)
|
||||
}},
|
||||
CMD: {Name: "cmd", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmd(cli.SYSTEM, TMUX, "send-keys", "-t", arg[0], strings.Join(arg[1:], ice.SP), "Enter")
|
||||
m.Sleep("100ms")
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ var Index = &ice.Context{Name: TMUX, Help: "工作台", Configs: map[string]*ice
|
||||
cli.SOURCE, "http://mirrors.tencent.com/macports/distfiles/tmux/tmux-3.2.tar.gz",
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
TMUX: {Name: "tmux path auto start order build download", Help: "服务", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
TMUX: {Name: "tmux session window auto start order build download", Help: "服务", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
cli.START: {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Optionv(code.PREPARE, func(p string) []string {
|
||||
return []string{"-S", kit.Path(m.Option(cli.CMD_DIR, p), "tmux.socket"), "new-session", "-dn", "miss"}
|
||||
@ -23,7 +23,7 @@ var Index = &ice.Context{Name: TMUX, Help: "工作台", Configs: map[string]*ice
|
||||
m.Cmdy(code.INSTALL, cli.START, m.Config(cli.SOURCE), "bin/tmux")
|
||||
}},
|
||||
}, code.InstallAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy(code.INSTALL, cli.SOURCE, m.Config(cli.SOURCE), arg)
|
||||
m.Cmdy(SESSION, arg)
|
||||
}},
|
||||
}}
|
||||
|
||||
|
@ -6,8 +6,8 @@ refer `
|
||||
`
|
||||
|
||||
chapter "源码"
|
||||
field tmux web.code.tmux.tmux
|
||||
field tmux web.code.inner args `usr/install/tmux-3.2 cmd-bind-key.c`
|
||||
field "下载" web.code.tmux.tmux
|
||||
field "源码" web.code.inner args `usr/install/tmux-3.2/ cmd-bind-key.c`
|
||||
|
||||
section "构建"
|
||||
spark shell `
|
||||
|
Loading…
x
Reference in New Issue
Block a user