gofumpt

neovim(nvim) gopls 설정을 업데이트한 후 .go 파일을 저장하면
var 로 선언된 변수가 := 로 간단하게 변경된다.

찾아보니 gopls 설정에 gofumpt(https://github.com/mvdan/gofumpt) 활성화되어 있었다.

gofumpt 는 gofmt, goimports 기능을 포함하면서 더 엄격한 포맷팅 규칙을 적용하는 확장된 포맷팅 방식이다.
그래서 gofumpt 포맷팅된 코드는 gofmt, goimports 검사를 통과한다고 한다.
요런 규칙들이 있다.
- 복합 리터럴에서 선행 또는 후행 빈 줄 제거
- 할당 연산자 다음의 불필요한 빈 줄 제거
- 인터페이스에서 불필요한 빈 줄 제거
- 가독성을 위해 함수에서 빈 줄 대신 ) { 라인 사용

# 바이너리 설치
go install mvdan.cc/gofumpt@latest

# 이전의 .go 파일들에 대해 포맷팅을 해봤는데 개인적으로 깔끔해져서 가독성에 더 좋은것 같다.
gofumpt -w -l $(fd --type file .go)

# 참고, gopls 체크사항 확인
gopls check $(fd --type file .go)

vim-gitgutter auto refresh

# 커밋전 코드 변경을 표시하기 위해 vim-gitgutter 플러그인을 사용중이다.
# 원래 커밋 후에는 변경표시(-,+등)이 사라져야 한다.
# 그런데 언제부터인가 커밋 후에도 변경 표시가 남아 있다.
# 임시 방편으로 현재 버퍼(파일) 저장시 :GitgutterAll(모든 버퍼 내용을 갱신) 명령을 설정해 사용하고 있었다.
autocmd BufWritePost * GitGutterAll

# neovim(nvim) 에서는 커밋 후에는 정상적으로 변경 표시가 사라진다.
# vim, nvim 모두 같은 gitgutter 설정을 사용한다.
# 원인 파악을 위해 다음과 같이 설정하면 gitgutter 플러그인 소스 위치에 gitgutter.log 를 생성한다.
let g:gitgutter_log = 1

# 변경내용 커밋 후 nvim 에 포커스를 옮기면 다음과 같이 gitgutter#all 함수가 수행된다.

# 반면 vim 에서는 다음과 같이 FocusGained 이벤트가 발생되지 않아 gitgutter#all이 수행되지 않고 있었다.

# 다음과 같이 vim 에 포커스 이벤트 액션을 설정하면, nvim 에서는 동작하지만 vim 에서 동작하지 않는다.
autocmd FocusGained * echo 'Vim has gained focus'
autocmd FocusLost * echo 'Vim has lost focus'

# iterm 내에서는 vim 포커스 이벤트가 동작한다.
# 찾아 보니 alacritty 에서 focus 이벤트가 동작하지 않는다는 이슈가 있었다.
# 다음과 같이 alacritty 사용시 터미널코드를 별도 설정하면 된다.
# 참고로 :set termcap 으로 설정된 터미널 코드 확인
if &term =~ "alacritty"
  let &t_fe = "\<Esc>[?1004h"
  let &t_fd = "\<Esc>[?1004l"
endif

vim-go slow save

# vim 사용중 파일을 저장이 아주 느린 경우가 발생했다.
# :w 를 여러 번 시도했을때 어쩌다 한번은 시간이 오래 걸린다.
# 원인 파악을 위해 다음 프로파일링
nnoremap <leader>ps :profile start vim-profile.log<enter>:profile func *<enter>:profile file *<enter>
nnoremap <leader>pt :profile stop<enter>

# vim-profile.log 결과 vim-go 플러그인의 에서 시간이 오래걸린다.

# promise 함수에서 13초

# vim-go 다양한 기능을 위해 go#promise#New timeout(디폴트 10초)을 두고 사용하는데
# 위 프로파일 결과는 formatting, imports 부분에서 사용됐다.
let l:handleFormat = go#promise#New(function('s:handleFormat', [], l:state), 10000, '')
let l:handler = go#promise#New(function('s:handleCodeAction', ['source.organizeImports', ''], l:state), 10000, '')

# 포맷팅은 오래 걸리지 않을것 같고, imports 부분이 의심이 된다.
# 그래서 vim 을 처음 열고 .go > import {} 에서 패키지를 삭제하고 저장해보니 느려지는게 100% 재현 된다.
# 그뒤 부터는 수정 저장을 해도 빠르게 저장된다.

# argocd dependency 이슈를 해결하니 최초 저장시에도 1~2초로 빨라졌다.