【问题标题】:vim - automatically formatting golang source code when savingvim - 保存时自动格式化golang源代码
【发布时间】:2012-06-13 17:22:54
【问题描述】:

我正在使用带有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

【问题讨论】:

    标签: go vim


    【解决方案1】:

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

    autocmd BufWritePre *.go Fmt
    

    唯一的缺点是这重复了 go 文件类型的检测。您可以通过挂钩FileType 事件来委托它,然后使用特殊的<buffer> 模式为每个 Go 缓冲区定义格式化 autocmd:

    autocmd FileType go autocmd BufWritePre <buffer> Fmt
    

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

    【讨论】:

    • 哇,非常广泛的答案,非常感谢!我最终使用了第二个选项 - 我根本不打算重置文件类型。谢谢!
    • 如果您需要从Fmt 命令正常输出,您可能需要添加silent(我一直看到X lines filtered):autocmd FileType go autocmd BufWritePre &lt;buffer&gt; silent Fmt
    • 场景是在登机口编码。如果代码有错误并且即使出现错误我也需要保存文件怎么办?就我而言,它不允许我保存文件。有没有办法在这种情况下强制保存?
    • PS!从 Go 1.4 (其中 misc/vim 被删除),您必须安装 github.com/vim-jp/vim-go-extra 才能使 @IngoKarkat 的说明正常工作。或者,通过Go GitHub wiki 浏览其他选项。
    【解决方案2】:

    如果你使用折叠,gofmt 会把这些弄乱(它打开闭合的折叠,关闭打开的折叠)。 要保持折叠状态,请使用以下自动命令

    autocmd FileType go autocmd BufWritePre <buffer> execute "normal! mz:mkview\<esc>:Fmt\<esc>:loadview\<esc>`z"
    

    它使用 z 寄存器来标记光标位置,因为 :mkview 和 :loadview(保存并恢复折叠)出于某种原因移动光标。

    【讨论】:

      【解决方案3】:

      对于那些不使用插件的人,这应该可以:

      autocmd FileType go autocmd BufWritePre <buffer> execute "normal! mz:mkview\<esc>:%!gofmt-safe\<esc>:loadview\<esc>`z"
      

      将以下脚本添加到您的PATH,这是必需的,否则如果有任何语法错误,gofmt 将删除文件。例如,如果您键入 :x,这可能会很危险。

      gofmt-safe

      #!/usr/bin/env bash
      
      orig=$(mktemp)
      fmt=$(mktemp)
      
      cat > "$orig"
      
      <"$orig" gofmt "$@" > "$fmt" 2>/dev/null
      
      if [ $? -eq 0 ]; then
          cat "$fmt"
      else
          cat "$orig"
      fi
      
      rm -f "$orig" "$fmt"
      

      如果您想在没有此脚本的情况下过上危险的生活,您可以在 autocmd 行中将 %!gofmt-safe 替换为 %!gofmt。这有助于向您显示:w 上的语法错误。请确保不要输入:x:wq

      【讨论】:

        猜你喜欢
        • 2018-08-05
        • 1970-01-01
        • 1970-01-01
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多