我有一个工作流程,我希望用户能够编辑一些“自由格式”文本。如果这是在webform上,请想象这是<textarea>
。想象一下,例如,您正在填写用户个人资料。对于诸如“name”之类的字段,用户继续使用ENTER键的简单提示很棒。但对于像“生物”领域这样的东西,我们需要捕捉换行符。
一般如何做到这一点?
(理想情况下,我的工具将使用bash,Python,Ruby或Java,但让工作流变得友好比创建它的工具更重要。而且,我碰巧在Ubuntu环境中。)< / p>
更新
上下文是我将通过SSH登录系统并运行此工作流程。出于这个原因,我需要坚持使用外壳友好的工具。我很高兴使用任何必要的工具来完成工作。我不是在问什么问题。在执行提示/响应样式命令行应用程序的过程中,我根本不知道正确的术语或技术来推迟vim
之类的内容。
答案 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'
之类的内容也是可能的。