自动在编辑器中打开文本文件而不是尝试运行它们?

自动在编辑器中打开文本文件而不是尝试运行它们?

当我意外地在没有某种编辑器命令的情况下键入文本文件的名称,并且该文本文件不是 shell 脚本时,我收到“权限被拒绝”错误*,因为该文件不可执行,并且该文本文件中的第一个标记命令行被视为要执行的命令。

然而,这总是意味着我无意中忘记输入编辑器命令,因此如果 shell 能够以某种方式识别出第一个标记是一个没有设置“执行”位的现有文本文件并自动打开它,那就很方便了两者$EDITOR任一$VISUAL

有没有办法在 Bash 或 Zsh 中实现这一点? (我使用 Bash,但无论如何我都在考虑切换。)这有点像 Bash 的autocd选项,它会自动检测第一个标记是否是目录并尝试进入cd它,而不是给出标准的“是目录”错误。

理想情况下,如果我给出文件列表(例如带有 glob)或任何其他参数集,全部这些参数的一部分将被传递给编辑器命令。

* 当然,如果我在当前目录中指定一个没有./.

答案1

zsh,只要您的文本文件具有文件扩展名 ( file.ext),您就可以使用后缀别名。它们由命令行上的第一个单词与任何非空字符串匹配时alias -s name=value运行。value text.nametext.nametext

例如:

如果你定义

alias -s txt=vim

然后输入

$ foo.txt

在命令行上将运行

vim foo.txt

这适用于任何匹配的内容?*.txt,甚至是带有通配符的单词:

$ *.txt

会跑

vim *.txt

它还仅检查命令的第一个单词,但会将整个命令行作为参数传递,即使其他单词有后缀别名:

$ foo.txt bar.c baz.vim

会跑

vim foo.txt bar.c baz.vim

重要的:这也会影响具有匹配扩展名的任何命令,包括PATH.例如,您是否应该设置

alias -s sh=vim

并且您有一个名为的命令something.sh并且想要运行

something.sh -p1 -p2 arg1 arg2

它会运行

vim something.sh -p1 -p2 arg1 arg2

要为一个命令禁用此功能,只需添加command内置命令:

command something.sh -p1 -p2 arg1 arg2

明显的缺点是:

  • 它仅适用于具有文件扩展名的文件
  • 您必须为每个扩展显式定义别名

从积极的一面:

  • 它仅适用于具有文件扩展名的文件,因此/bin和中的大多数可执行文件/usr/bin都不会被别名替换。
  • 您可以为任何扩展名定义一个(不同的)别名,这样*.jpg文件*.o就不会突然被打开vim

相关内容