VIM 使用 STDIN 中的语法高亮打开 YAML

VIM open YAML with syntax highlighting from STDIN

将内容传送到 vim -R 时如何指定语法类型?

因为 vim 有一个 vim.yalm 插件,这会正确地突出显示文件的内容

vim -R foo.yaml

但是,使用管道时不检测语法

cat foo.yaml | vim -R - 

解决方法是在文件打开后输入:set syntax=yaml

我希望能够做这样的事情:

cat foo.yaml | vim -R - --syntax=yaml

有没有办法通过语法高亮将文件内容通过管道传输到 vim -R

推理

我希望能够在将 kubernetes 配置文件应用到集群之前预览它们。我希望预览有颜色。

helm template foo | vim -R -

sops --decrypt foo.yaml | vim -R -
sops --decrypt foo.yaml | kubectl apply -f -

如另一个堆栈溢出站点所示,可以使用 -c

pass options 到 vim

例如vim -R -c 'set syntax=yaml' -

将其包装在 bash 函数中可以得到我正在寻找的东西

function vaml() {
  vim -R -c 'set syntax=yaml' -;
}

所以现在我可以做

cat foo.yaml | vaml

是的,有办法:

cat foo.yml | vim -c "doautocmd BufRead x.yml" -R -

这告诉 Vim,它应该像加载名为 x.yml 的文件一样执行 autocmd。这包括文件类型检测和语法。名称x.yml仅用于识别运行的命令,不用于任何其他用途。

也可能:

cat foo.yml | vim -c "doautocmd Filetype yaml" -R -

这告诉 Vim 在检测到文件类型 yaml 时执行属于 运行 的 autocmd

基于上面的 autocmd 答案:将以下内容添加到您的 .vimrc.vim/ftdetect/k8s-yaml.vim:

" file detection of kubernetes yamls
function! DetectYaml()
   if getline(1) =~ 'apiVersion:'
     setfiletype yaml
   endif
   if getline(1) =~ '---'
     setfiletype yaml
   endif
endfunction

augroup filetypedetect
  au StdinReadPost * call DetectYaml()
augroup END

这样您就可以将输出通过管道传输到 vim -。该检测是针对以 --- (helm) 或 apiVersion: (kubectl)

开头的 Kuberntes 和 helm Yaml 文件量身定制的