少し前まで black を使っていたが、より早くフォーマットできる ruff に切り替えた

Vim

ruff を実行するコマンドを作成しよう

nnoremap <buffer> gF <Cmd>call Preserve(':silent !ruff format ' .. expand('%'))<CR>

もしくは保存するたびに実行することもできる

augroup format-with-ruff-on-save
  au BufWritePost *.py call Preserve(':silent !ruff format ' .. expand('%'))
augroup END
  • ruff はとても速いので、保存するたびに実行しても遅延はわずかであり気にならない
  • この設定だと他の人が書いたコードを編集して保存したときにもファイル全体がフォーマットされてしまうので注意

Git でコミットする前にファイルがフォーマットされていることを確認する

pre-commit hook を使うことで、コードをコミットする前に、コミットしようとしているファイルがフォーマットされているかを確認することができる。
以下を .git/hooks/pre-commit として保存する

#!/bin/zsh
 
command -v ruff || (echo "ruff not found" >&2; exit 1)
TARGET_VERSION=py311
 
non_formatted_files=""
 
for FILE in $(git diff --staged --name-only | grep .py); do
    if [[ ! -f $FILE ]]; then
        continue
    fi
    ruff check --target-version $TARGET_VERSION -q --extend-select I $FILE || non_formatted_files=$non_formatted_files\ $FILE
    ruff format --check --line-length=140 --target-version $TARGET_VERSION -q $FILE || non_formatted_files=$non_formatted_files\ $FILE
    # If failed in execution, exit
    if [ $? -ne 0 ]; then
        echo "ruff failed to execute for $FILE" >&2
        exit 1
    fi
done
 
if [[ $non_formatted_files != "" ]]; then
        echo "Files that aren't formatted:"$non_formatted_files >&2
        exit 1
fi