我经常看到包含vim
或的说明nano
,意思是在您选择的文本编辑器中打开该步骤中的文件。是否有一个不可知的命令我可以用来代替特定程序,该程序将在用户默认的终端内文本编辑器中打开输入,无论是vim
、nano
还是其他东西?
我editor
在“类似问题”侧栏中看到提到过——这仍然仅限于基于 Debian 的发行版吗?还有其他选择吗?
答案1
您可以使用 $EDITOR
,只要它已定义:
$EDITOR filename.txt
但我认为大多数文档都使用它,nano
因为如果有人盲目跟随,那么使用它是一个安全的选择。如果用户决定他们实际上更喜欢一种编辑器而不是另一种编辑器,他们就会知道足够的知识来自行将其替换为vim
、emacs
等。
edit
可能在基于 Debian 的系统上运行良好,但在其他系统上它会调用ex
,这是不推荐的。
答案2
VISUAL
如果设置了环境变量,请使用它。
EDITOR
否则,如果设置了环境变量,请使用它。
否则,Unix 传统默认为vi
.这对用户来说一点也不友好——使用 vi 的人知道如何设置他们的系统来调用它,你的应用程序应该对那些不知道的用户友好。不幸的是,没有好的、可移植的方法来找到像样的编辑器。你可以试试xdg-mime query default
,但即使该实用程序可用,它也并不总是有效。在 Debian 和类 Debian 系统上,调用sensible-editor
,它为你做了所有这些事情——但我不知道其他 Unix 变体上有类似的东西。
这会产生类似的代码
#!/bin/sh
if [ -n "$VISUAL" ]; then
exec $VISUAL "$@"
elif [ -n "$EDITOR" ]; then
exec $EDITOR "$@"
elif type sensible-editor >/dev/null 2>/dev/null; then
exec sensible-editor "$@"
elif cmd=$(xdg-mime query default ) 2>/dev/null; [ -n "$cmd" ]; then
exec "$cmd" "$@"
else
editors='nano joe vi'
if [ -n "$DISPLAY" ]; then
editors="gedit kate $editors"
fi
for x in $editors; do
if type "$x" >/dev/null 2>/dev/null; then
exec "$x" "$@"
fi
done
fi
大多数程序都会在$VISUAL
和上进行空格分割$EDITOR
,但不是全部。
答案3
如果您使用的是 Bash,这是所有 Linux 发行版的默认终端语言(据我所知),有一种叫做环境变量的东西。其中许多变量是由您的发行版设置的,其中一些变量需要手动设置或“导出”。 $EDITOR 是特别之一(需要大写字母和美元符号)。美元符号表示正在调用的变量,大写字母表示它是一个环境变量。 $HOME 是一个公共环境。变量由 ~ 简写。
因此,为了简洁地回答您的问题,您将运行使用用户默认编辑器编辑 file.txt 的命令
$EDITOR file.txt
要将默认编辑器设置或导出到 vim,请将其放入用户的 $HOME/.bashrc 文件中:
export EDITOR=/bin/vim
然后运行:
source $HOME/.bashrc
如果未设置 $EDITOR 变量,则实际上没有默认编辑器。
就替代方案而言,别名有无数种:
Alias E="$EDITOR"
获取 .bashrc 文件后,我可以通过以下方式运行上面的第一个命令:
E text.vim
然而,不要对别名太着迷,因为它们可能是更高级的 bash 使用的主要障碍。
另一个有用且类似的环境变量是 $PAGER,它可用于打开默认程序进行文档查看。
$PAGER file.txt
此环境变量的通常默认值是“less”。
答案4
一个更简单的版本贾尔斯的回答可以内联以在一行脚本中启动编辑器,如下所示:
command ${VISUAL:-${EDITOR:-$(command -v vi)}} $file
(不过,这需要进行调整才能使其与默认编辑器参数一起使用,例如 when EDITOR="emacs -nw"
。exec
链接答案中的调用也有这个问题。 command
可能比 更安全exec
。)