命令行程序遵从默认文本编辑器

时间:2015-12-05 01:10:51

标签: java bash shell text-editor

我有一个工作流程,我希望用户能够编辑一些“自由格式”文本。如果这是在webform上,请想象这是<textarea>。想象一下,例如,您正在填写用户个人资料。对于诸如“name”之类的字段,用户继续使用ENTER键的简单提示很棒。但对于像“生物”领域这样的东西,我们需要捕捉换行符。

一般如何做到这一点?

(理想情况下,我的工具将使用bash,Python,Ruby或Java,但让工作流变得友好比创建它的工具更重要。而且,我碰巧在Ubuntu环境中。)< / p>

更新 上下文是我将通过SSH登录系统并运行此工作流程。出于这个原因,我需要坚持使用外壳友好的工具。我很高兴使用任何必要的工具来完成工作。我不是在问什么问题。在执行提示/响应样式命令行应用程序的过程中,我根本不知道正确的术语或技术来推迟vim之类的内容。

1 个答案:

答案 0 :(得分:2)

处理此问题的常用方法确实是代表他们启动用户最喜欢的(命令行)文本编辑器,等待他们完成编辑,然后使用用户输入继续您自己的业务。用于git commit的过程是一个非常着名的例子。

您的程序必须执行以下步骤。

  • 创建临时文件。您可以使用mktemp程序从shell脚本执行此操作。

    如果您的脚本在此过程中被杀死,请考虑使用trap来删除文件,这样您就不会丢失用户的文件系统。 (由于mktemp默认情况下会在/tmp/中创建文件,并且该目录中的所有内容通常都会定期清除,但无论如何都不是那么糟糕。)

  • 如果您不希望用户开始使用空文件但是为他们提供了一个模板,请立即将该文本写入文件。

  • 启动用户最喜欢的编辑器打开该文件。您的脚本将一直阻止,直到用户关闭编辑器。

    有趣的问题当然是如何决定推出什么计划。普遍认可的技术是按顺序尝试以下选项。

    • 环境变量PACKAGE_EDITOR中列出的任何命令,您可以用PACKAGE
    • 替换应用程序的名称
    • 环境变量EDITOR
    • 中列出的任何命令
    • vi
    • 这样的标准编辑器
    • 错误输出

    通过在通用EDITOR变量之前尝试特定于您的应用程序的环境变量,用户可以特殊情况下那些需要不同于默认编辑器的应用程序。

    正如chrylis在评论中指出的那样,您还可以检查名为VISUAL的环境变量(根据this thread)曾经用于提供使用更多内容的方法视频终端上的高级编辑器,能够运行它。

  • 回读文件的内容。考虑给用户提供在编辑期间中止该过程的选项。例如,Git将保存空文件解释为堕胎请求。

  • 删除临时文件。

不要忘记为用户正确记录环境变量的影响。

这是一个你可以玩的简单例子。

#! /bin/bash -eu

edit=
tempfile=

if [ "${EXAMPLE_EDITOR:+set}" = set ]
then
    edit="${EXAMPLE_EDITOR}"
elif [ "${EDITOR:+set}" = set ]
then
    edit="${EDITOR}"
else
    edit='vi'
fi

function cleanup {
    [ -z "${tempfile}" ] || rm -f "${tempfile}"
}

trap cleanup EXIT

tempfile="$(mktemp)"

cat <<EOF > "${tempfile}"
# Please edit this file to contain your list of noble wishes, then
# save and exit the editor.  If you decide to abort the process,
# delete everything and save an empty file.
EOF

${edit} "${tempfile}" || {
    echo "Editing command '${edit} ${tempfile}' is not working or" \
         "was aborted on purpose" >&2
    exit 1
}

if [ ! -s "${tempfile}" ]
then
    echo "Aborting due to empty wish list" >&2
    exit 1
fi

# Do something with the list of noble wishes...

请注意,我没有引用${edit}的扩展,因此EDITOR='emacs -nw'之类的内容也是可能的。