当我在没有某种编辑器命令的情况下不小心键入文本文件的名称,并且该文本文件不是 shell 脚本时,我会收到“权限被拒绝”错误*,因为该文件不可执行,并且文件中的第一个标记命令行被视为要执行的命令。
然而,这总是意味着我无意中忘记输入我的编辑器命令,所以如果 shell 能够以某种方式识别第一个标记是一个没有设置“执行”位的现存文本文件并自动打开它会很方便无论是$EDITOR
或$VISUAL
。
有没有办法在 Bash 或 Zsh 中实现这一点?(我使用 Bash,但无论如何我都在考虑切换。)这有点像 Bash 的autocd
选项,它会自动检测第一个标记是否是目录并尝试cd
进入它,而不是给出标准的“是目录”错误。
理想情况下,如果我给出文件列表(例如带有 glob)或任何其他参数集,所有这些参数都将传递给编辑器命令。
* 当然,如果我在当前目录中指定一个没有./
.
在 中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
归档时间: |
|
查看次数: |
2437 次 |
最近记录: |