我正在使用带有vim-golang插件的vim.这个插件附带a function called :Fmt,它使用gofmt(一个命令行可执行文件)"重新格式化"源代码.

我想在每次保存文件时调用:fmt函数,因此它会不断地重新格式化.我认为这应该通过autocmd的指令来完成.但我有两个疑问:

  1. 我找不到执行该函数的方法.我试着在autocmd行的末尾写Fmt和:Fmt,但似乎不起作用.我想我错过了什么,比如"电话".
  2. 我希望只有在保存文件类型为"GO"的文件时才会发生这种情况.我不知道如何将这两个条件结合起来--我可以根据文件类型激活变量,也可以在保存文件时单独执行一些小操作,比如删除尾随空格.

这就是我到目前为止所掌握的情况:

" I can set variables for go like this
autocmd FileType go setlocal noexpandtab shiftwidth=4 tabstop=4 softtabstop=4 nolist

" I can clean trailing spaces(conserving cursor position) on save like this
autocmd BufWritePre * kz|:%s/\s\+$//e|'z

" None of these worked:
autocmd BufWritePre,FileType go Fmt
autocmd BufWritePre,FileType go :Fmt

推荐答案

FileType事件不会在缓冲区写入时触发;BufWritePre是正确的事件,但您需要提供文件模式,例如*.go:

autocmd BufWritePre *.go Fmt

唯一的缺点是这重复了go文件类型的检测.您可以通过连接到FileType事件来委托此操作,然后使用特殊的<buffer>模式定义每个GO缓冲区的格式autocmd:

autocmd FileType go autocmd BufWritePre <buffer> Fmt

这样做的缺点是,如果多次设置文件类型,您也会多次运行格式化.这可以通过定制:augroup来解决,但现在它变得非常复杂.或者,如果您真的确定这是唯一的BufWritePre个GO缓冲区的autocmd,您可以使用:autocmd! BufWritePre ...(带!).

Go相关问答推荐

如何获得与cksum相同的CRC 32?

将Go程序导出到WASM—构建约束排除所有Go文件

Term~T中的类型不能是类型参数,但可以是引用类型参数的切片

如何用';贪婪原则';正确地

通过代理从golang连接到ftp

如何在 Chi Router 的受保护路由下提供静态文件(尤其是图像)?

Cypher 查找(多个)最低 node

我可以扫描表中每个项目的最高范围键值吗?

如何从Go项目连接Microsoft Access数据库?

从单词中删除特殊字符

如何使用 go 包设置标头键和值:shurcooL/graphql 或 hasura/go-graphql-client?

regex.ReplaceAll 但如果替换则添加相同数量的字符

如何使用带有方法的字符串枚举作为通用参数?

为超时的单元测试创​​建 deadlineExceededError:true

数据流中的无根单元错误,从 Golang 中的 PubSub 到 Bigquery

为什么 reflect.TypeOf(new(Encoder)).Elem() != reflect.TypeOf(interfaceVariable)?

如何编写一个以字符串或错误为参数的通用函数?

切片到数组指针的转换

为什么 x/net/html Token().Attr 上的 len 在此处为空切片返回非零值?

不理解切片和指针