2015-12-05 46 views
2

我有一个工作流程,我希望用户能够编辑一些“自由格式”文本。如果这是在一个网络表单上,想象这是一个<textarea>。想象一下,例如你正在填写一个用户配置文件。对于诸如“名称”这样的字段,用户继续使用ENTER键的简单提示非常棒。但对于像“生物”领域这样的东西,我们需要捕捉线上突破。命令行程序按照默认文本编辑器

这一般怎么办? (理想情况下,我的工具可以是bash,Python,Ruby或Java,但让工作流变得友善比创建工具更重要,另外,我恰好在Ubuntu环境中)。

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

+0

我会用Java,因为任何带有JRE的操作系统都可以运行Java程序。然后你可以使用Swing或者JavaFX。如果您决定使用Swing,请查看[javax.swing.JTextArea](https://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html)或[JTextEditor/Pane] (https://docs.oracle.com/javase/tutorial/uiswing/components/editorpane.html)。此外,这个问题可能因“主要基于观点”而被封闭。 –

+0

“太宽泛”和“主要基于意见”。 – 4ae1e1

+0

我绝对不会问如何使一个文本区域的GUI。我在问如何在命令行程序的上下文中捕获多行输入。我会对这个问题进行一些修改来澄清。 – Larsenal

回答

2

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

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

    考虑将trap放在适当的位置,以便在过程中脚本被杀死时删除文件,以免乱丢用户的文件系统。 (由于mktemp将创建默认情况下并在该目录中的一切在/tmp/的文件通常在定期清洗,这不是说不好,反正。)

  • 如果你不希望用户有开始了空文件,但为他们提供一个模板,从现在开始写任何这样的文本到文件。

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

    有趣的问题当然是如何确定要启动的程序。普遍认可的技术是按照该顺序尝试以下选项。

    • ,你替换您的应用程序的名称为PACKAGE
    • 任何命令,在环境变量中列出的环境变量PACKAGE_EDITOR列出的任何命令EDITOR
    • 标准编辑器类似vi
    • 错误出

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

    由于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'也是可能的。

+0

你还应该检查'视觉'。 – chrylis

+0

@chrylis我从来没有见过。你能举一个使用它的应用程序的例子吗?是否仅在GUI可用时才使用? – 5gon12eder

+1

在其他程序中,普通的'visudo'确实如此。它不是用于GUI,而是用于全屏终端; “VISUAL”与CRT终端一起使用,而“EDITOR”用于实际行式打印机,甚至不能显示“vi”。 – chrylis