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

Kyl*_*and 4 shell bash zsh

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

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

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

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

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

Ada*_*hon 5

在 中zsh,只要您的文本文件具有文件扩展名 ( file.ext),您就可以使用后缀别名。他们被定义alias -s name=value并运行为value text.name随时在命令行上匹配的第一个字text.name,其中text的任何非空字符串。

例如:

如果你定义

alias -s txt=vim
Run Code Online (Sandbox Code Playgroud)

然后打字

$ foo.txt
Run Code Online (Sandbox Code Playgroud)

在命令行上将运行

vim foo.txt
Run Code Online (Sandbox Code Playgroud)

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

$ *.txt
Run Code Online (Sandbox Code Playgroud)

会跑

vim *.txt
Run Code Online (Sandbox Code Playgroud)

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

$ foo.txt bar.c baz.vim
Run Code Online (Sandbox Code Playgroud)

会跑

vim foo.txt bar.c baz.vim
Run Code Online (Sandbox Code Playgroud)

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

alias -s sh=vim
Run Code Online (Sandbox Code Playgroud)

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

something.sh -p1 -p2 arg1 arg2
Run Code Online (Sandbox Code Playgroud)

它会运行

vim something.sh -p1 -p2 arg1 arg2
Run Code Online (Sandbox Code Playgroud)

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

command something.sh -p1 -p2 arg1 arg2
Run Code Online (Sandbox Code Playgroud)

明显的缺点是:

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

从积极的一面:

  • 它仅适用于具有文件扩展名的文件,因此大多数可执行文件/bin/usr/bin有保存由别名所取代。
  • 您可以定义任何扩展名(不同的)的别名,所以*.jpg还是*.o文件不会突然打开vim