VIM打开YAML,并从STDIN

时间:2019-01-30 17:00:32

标签: vim syntax-highlighting

在将内容传递到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 -

3 个答案:

答案 0 :(得分:2)

是的,有一种方法:

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

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

也可以:

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

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

答案 1 :(得分:1)

如在另一个堆栈溢出站点上所示,可以pass options使用-c来vim

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

将其包装在bash函数中可以满足我的需求

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

现在我可以做

cat foo.yaml | vaml

答案 2 :(得分:1)

基于上面的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文件的。