Zsh 别名​;按名称打开文件

Zsh 别名​;按名称打开文件,zsh,alias,Zsh,Alias,别名允许您只需在终端中键入文件名即可打开某些文件格式。例如,如果文件的类型为html、htm,它将在firefox中打开alias-s{html,htm}=firefox 我可以对文本文件做同样的操作,只列出我想要的类型,但是如果文件没有它们,比如~/.zshrc或/etc/fstab,该怎么办?如何按名称打开此类文件?对于经常编辑的常见文件,您可以为这些文件创建单独的别名。我有他的化名 alias hosts="sudo vi /etc/hosts" alias zshrc

别名允许您只需在终端中键入文件名即可打开某些文件格式。例如,如果文件的类型为html、htm,它将在firefox中打开
alias-s{html,htm}=firefox


我可以对文本文件做同样的操作,只列出我想要的类型,但是如果文件没有它们,比如~/.zshrc或/etc/fstab,该怎么办?如何按名称打开此类文件?

对于经常编辑的常见文件,您可以为这些文件创建单独的别名。我有他的化名

alias hosts="sudo vi /etc/hosts"
alias zshrc="vi ~/.zshrc"

此函数应执行您想要的操作(将其添加到
.zshrc
):

正如名称所示,只要zsh无法找到在shell中输入的命令,就会调用它。现在,如果找不到“command”,则将对该参数调用编辑器

-o interactive
测试应确保仅在您键入内容时调用编辑器;shell脚本中的无效命令仍将失败。
-w
测试检查可编辑文件

在使用此选项时,您可能会发现需要检查的其他条件


ETA:如评论中所述,这只适用于简单的文件名;如果指定了文件的路径,它将不起作用。

此操作的用例是什么?我只是好奇,因为我看不出能够键入“~/.zshrc”而不是例如“vi~/.zshrc”有什么好处。在这种情况下,我甚至可能会发现它令人困惑,因为按名称键入它可能会让我觉得我在做与“source~/.zshrc”相当的事情,只是想增加一点方便。我在系统上使用一个文本编辑器,我看不出不断指定如何打开文件有任何意义。我将为您选择的编辑器定义一个单字母别名,并将完成配置为使用您的编辑器完成别名。这可能比为命令行的第一个字配置完成来识别文件要容易或更干净,而不是为路径中的命令配置完成。@boxoc:如果文件是某个shell脚本,该怎么办。shell脚本当然是一个文本文件,但如果您输入它的名称,您可能不想编辑它,而是执行它。@user1934428:我总是以./script的形式运行脚本,也就是说,脚本名称从不包含./script,所以这不是问题。这不是最好的选择,因为我不能只列出所有可能的文件。对于所有其他文件,我将需要添加完整的命令来打开,这既不方便又耗时。如果我在文件所在的目录中,这一点就行了。如果我说
.config/mpv/mpv.conf
,我会得到
zsh:权限被拒绝:.config/mpv/mpv.conf
。我可以修复此问题以使函数与路径一起工作吗?@boxoc似乎没有类似的权限拒绝处理程序,因此这种情况可能没有简单的解决方案。您可以尝试类似的
TRAPZERR
函数,该函数是为任何非零返回代码调用的,但您可能需要进行更多检查,以确保它仅在需要时启动编辑器。@Gairfoll:只有当文件可写时,您的解决方案才会调用
vi
。也许你还应该做一个粗略的测试,看看它是否是一个文本文件(比如
$(file$1)=~text
)。@user1934428-这可能是一个好的补充。我将让积极使用和测试这个习语的人(即不是我)决定是否应该把它包括在主要答案中。
command_not_found_handler() {
if [[ -o interactive && -w $1 ]]; then
    vi $1
else
    echo zsh command_not_found_handler: command not found: $@ >&2
    return 1
fi
}