27

私はvim-golangプラグインでvimを使用しています。このプラグインには、コマンドライン実行可能ファイルであるgofmtを使用してソースコードを「再フォーマット」する:Fmtという関数が付属しています。

ファイルを保存するたびに:Fmt関数を呼び出したいので、ファイルは継続的に再フォーマットされます。これはautocmdディレクティブで行う必要があると思います。しかし、私には2つの疑問があります。

  1. 関数を実行する方法が見つかりませんでした。autocmd行の最後にFmtと:Fmtを書いてみましたが、うまくいかなかったようです。「電話」のような何かが恋しいと思います。
  2. これは、ファイルタイプが「go」のファイルを保存するときにのみ発生するようにします。これらの2つの条件を組み合わせる方法がわかりません。ファイルの種類に応じて変数をアクティブ化できます。また、ファイルを保存するたびに、末尾のスペースを削除するなどの小さな作業を行うことができますが、別々に行うことができます。

だからこれは私がこれまでに持っているものです:

" 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
4

3 に答える 3

61

FileTypeイベントはバッファ書き込みでは発生しません。BufWritePreは正しいものですが、ファイルパターンを指定する必要があります。例*.go

autocmd BufWritePre *.go Fmt

唯一の欠点は、これがgoファイルタイプの検出を複製することです。イベントにフックすることでこれを委任し、特別なパターンFileTypeを使用して各Goバッファーのフォーマットautocmdを定義できます。<buffer>

autocmd FileType go autocmd BufWritePre <buffer> Fmt

これには、ファイルタイプが複数回設定されると、フォーマットも複数回実行されるという欠点があります。これはカスタムで解決できます:augroupが、今では非常に複雑になっています。BufWritePreまたは、これがGoバッファーの唯一のautocmdであることが本当に確実な場合は、:autocmd! BufWritePre ...(を使用して!)を使用できます。

于 2012-06-10T14:38:48.470 に答える
2

折り目を使用する場合、gofmtはこれらを台無しにします(閉じた折り目を開き、開いた折り目を閉じます)。次の自動コマンドを使用して折り目を維持するには

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

:mkviewと:loadview(折り目を保存して復元する)が何らかの理由でカーソルを移動するため、zレジスタを使用してカーソル位置をマークします。

于 2013-04-11T20:44:44.760 に答える
2

プラグインを使用していない場合、これは機能するはずです。

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"

このスクリプトなしで危険な状態で生活したい場合は、行の%!gofmt-safeで置き換えることができます。これには、の構文エラーを表示するという利点があります。またはを入力しないように注意してください。%!gofmtautocmd:w:x:wq

于 2020-12-21T20:37:09.220 に答える