hzDocs
hzDocs
文章 / 文档hedzr.com首页

cmdr series

介绍 cmdr

Guide

你的首个 CLI app更适合工程实践的版本
循序渐进
基本概念
命令命令:执行外部程序命令:预设参数命令:重定向命令:动态命令清单命令:在配置文件中定义别名清单命令:事件响应函数标志标志:必须项标志:可翻转组标志:枚举值标志:`Head -1` 风格标志:调用外部工具获得输入标志:自动否定标志:加号 `+` 前缀标志:事件响应函数解析结果内建命令和标志帮助子系统可共享共存的 app 实例辨析顶级函数WithOptsBackstage
如何……
Auto-close the ClosersRead config into structUsing is DetectorsUsing Store

References

What's New
Packages

Others

Examples
Blueprint
产品发布
产品发布之前
介绍 cmdr-cxx

Guide

cmdr supports

Intro

Guide

More features

References

Others

evendeep(-go)

Guide

Usagesdeepcopydeepdiffdeepequal
logg/slog(-go)

Guide

Guide

others

Components
trie-cxx

Guide

Guide

links

On Github

标志:调用外部工具获得输入

Using external editor

调用外部编辑器获取文字输入

git 命令行工具的 commit 支持 -m msg 方式来提供提交注释文字。同时,如果用户没有给出 msg 参数,那么 git 将会调用 Shell 的编辑器,通常是 vim 或者 nano(取决于环境变量 EDITOR指向谁)。

cmdr 支持同样的交互方案。

一个使用了 ExternalEditor(envVarName) 标注的标志将获得和 git -m 相同的交互表现。

提前指定的 envVarName 为要查询的 Shell 编辑器的预设环境变量名。

例如,如果你的环境变量中有 EDITOR=nano 的设置,那么 ExternalEditor("EDITOR") 将会选用 nano 作为 Shell 全屏编辑器,并在操作系统临时文件夹中建立一个临时文件来接受用户编辑输入。当用户存盘退出 nano 时,这个临时文件中的文本内容将被赋予该标志。

有时候,你也可能使用 envVarName 为 LESS, MAN 等等来达到特定效果。

一般来说,启用了 ExternalEditor(envVarName) 风格的标志必须具有字符串值的默认值。

定义

.ExternalEditor(envVarName) 可以为标志设置 External Editor 风格。

package main

import (
	"context"
	"os"

	"github.com/hedzr/cmdr/v2"
	"github.com/hedzr/cmdr/v2/cli"
	"github.com/hedzr/cmdr/v2/examples/common"
	logz "github.com/hedzr/logg/slog"
)

const (
	appName = "external-editor"
	desc    = `a sample to show u how to use external editor flag.`
	version = cmdr.Version
	author  = `The Example Authors`
)

func main() {
	app := cmdr.Create(appName, version, author, desc).
		With(func(app cli.App) {
			app.OnAction(func(ctx context.Context, cmd cli.Cmd, args []string) (err error) {
				msg := cmd.Store().MustString("message")
				println(`Hello, World.`, msg)
				return
			})
		}).
		WithBuilders(common.AddExternalEditorFlag).
		WithAdders().
		Build()

	ctx := context.Background()
	if err := app.Run(ctx); err != nil {
		logz.ErrorContext(ctx, "Application Error:", "err", err) // stacktrace if in debug mode/build
		os.Exit(app.SuggestRetCode())
	} else if rc := app.SuggestRetCode(); rc != 0 {
		os.Exit(rc)
	}
}
package examples

import (
	"github.com/hedzr/cmdr/v2/cli"
)

func AddExternalEditorFlag(c cli.CommandBuilder) { //nolint:revive
	c.Flg("message", "m", "msg").
		Default("").
		Description("the message requesting.", "").
		Group("External Editor").
		PlaceHolder("MESG").
		ExternalEditor(cli.ExternalToolEditor).
		Build()
}

运行时

上面的示例程序的运行时效果如同这样:

$ go run ./examples/external-editor -m 123
Hello, World. 123
$ go run ./examples/external-editor -m
(open nano and waiting for user's input...)
Hello, World. dsada

$

额外的话题

Required

Toggle Group

Valid Args

Head Like

External Tool

Plus Sign

Event Handlers

What is Next?

Components

Components

On Github

How is this guide?

最后更新于

目录

调用外部编辑器获取文字输入
定义
运行时
额外的话题