gradle コマンドを補完しようとして brew にも補完があることを知る今さら感

 

👩‍💻 gradle/gradle-completion

本家から公開されてたんですね!

Gradle ./gradlew を補完しようとして brew の補完を知る今さら感

👉 gradle/gradle-completion: Gradle tab completion for bash and zsh hatena-bookmark

./gradlew でも利用できるようなのでインストールしてみました。


brew install gradle-completion

しかし、補完されないので調べる。


❯ brew info gradle-completion
...
==> Caveats
zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
...


❯ ls /opt/homebrew/share/zsh/site-functions
_brew@     _gradle@   _lsd@      _starship@

手動でロードしてみると弾いてるが。


❯ source /opt/homebrew/share/zsh/site-functions/_gradle

_arguments:comparguments:327: can only be called from completion function
_tags:comptags:36: can only be called from completion function
_tags:comptry:55: can only be called from completion function
_tags:comptags:60: can only be called from completion function
_tags:comptags:67: can only be called from completion function

どうなってるんや。

 

👩‍💻 Basic installation doesn't work on macOS with zsh #95

issues にこんな。


if [ $commands[brew] ]
then
  fpath=("$(brew --prefix)/share/zsh/site-functions" $fpath)
fi

gradle-completion/issues/95#issuecomment-1165679687

見てみると FPATH にない。


❯ echo $FPATH | tr ':' '\n'
/opt/homebrew/share/zsh-completions
/usr/local/share/zsh/site-functions
/usr/share/zsh/site-functions
/usr/share/zsh/5.9/functions

ここに、gradle-completion のインストール先である


/opt/homebrew/share/zsh/site-functions

を追加すると補完は効き始めた。

 

👩‍💻 Homebrew Shell-Completion

さっきの解決方法の issue コメントに書いてあったページをみてみる。

To make Homebrew’s completions available in zsh, you must insert the Homebrew-managed zsh/site-functions path into your FPATH before initialising zsh’s completion facility. Add the following to your ~/.zshrc:


if type brew &>/dev/null
then
  FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}"

  autoload -Uz compinit
  compinit
fi

👉 brew Shell Completion — Homebrew Documentation hatena-bookmark

.zshrc に追加すると、brew コマンドでも TAB キーで補完が効き始める。


❯ brew i

info                  -- Display brief statistics for your Homebrew installa
install               -- Install a formula or cask
install-bundler-gems  -- Install Homebrew's Bundler gems
irb                   -- Enter the interactive Homebrew Ruby shell

知らんかった。

 

👩‍💻 まとめ

Homebrew のコマンド補完を以下で有効にしておくと、


# .zshrc
if type brew &>/dev/null
then
  FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}"

  autoload -Uz compinit
  compinit
fi

Homebrew で以下にインストールされる補完スクリプトたちも、


❯ ls $(brew --prefix)/share/zsh/site-functions
_brew@     _gradle@   _lsd@      _starship@

インストール直後にそのまま使えるようになる。


【Mac】コピペしようとしたら出てくる「"調べる”では、Web、iTunes、App Store、映画の上映時間、近隣エリアの情報などの候補がパーソナライズされて表示されるようになりました。」を出さない設定

ブラウザなどのテキストをコピーしようとしたら出てくるこれ。

【Mac】コピペしようとしたら出てくる「"調べる”では、Web、iTunes、App Store、映画の上映時間、近隣エリアの情報などの候補がパーソナライズされて表示されるようになりました。」を出さない設定

【Mac】コピペしようとしたら出てくる「"調べる”では、Web、iTunes、App Store、映画の上映時間、近隣エリアの情報などの候補がパーソナライズされて表示されるようになりました。」を出さない設定

機能名が分からないので調べようもなくて放置していましたが。

私としましては不要なので表示されないように機能を無効にしたい。

 

🧑‍💻 機能名は「調べる&データ検出」

機能名は「調べる&データ検出」のようです。


[ システム設定 ]

      ↓

[ トラックパッド ]

      ↓

[ ポイントとクリック ] 

      ↓

[ 調べる&データ検出 ]

「調べる&データ検出」

どうやら、「1本指で強めのクリック」で発動していたようです。

とりあえず「オフ」にしておきました。

便利な機能かも知れんけど。


【Gradle Plugin】detekt「baseline」とは

何のことか分からないまま遊んでいたら、ルール違反が検出されなくなった。

毎度のことながら、

気づいてからドキュメントに書いてあることが分かる。

Code Smell Baseline
👉 Code Smell Baseline | detekt hatena-bookmark

まあ、そんなに隅々まで読まないわな。

なので簡単にメモ。

 

🧑‍💻「baseline」とは


./gradlew detekt

で「code smell」が検出されたときに、それらを baseline に保存しておくと、次からそれらは検出されなくなる。

「検出のベースライン」ということなのだろう。

 

🧑‍💻 baseline ファイル

ファイル位置を指定しておくと分かりやすい。


// build.gradle.kts

detekt {
  baseline = file("$rootDir/config/detekt/baseline.xml")
}


❯ ./gradlew tasks | grep detekt | grep -v EXPERIMENTAL
detekt
detektBaseline - Creates a detekt baseline on the given --baseline path.
detektGenerateConfig - Generate a detekt configuration file inside your project.

検出後、./gradlew detektBaseline で指定した位置に書き出される。


❯ ./gradlew detekt             

> Task :app:detekt FAILED
~(略)~ The function EditBar(target: TargetTodo, focusRequester: FocusRequester, onDone: KeyboardActionScope.() -> Unit, onClear: () -> Unit, onValueChange: (TextFieldValue) -> Unit, onAdd: () -> Unit, onUpdate: () -> Unit, onDelete: () -> Unit, modifier: Modifier) has too many parameters. The current threshold is set to 6. [LongParameterList]
~(略)~ The function TodoScreen is too long (99). The maximum length is 60. [LongMethod]
~(略)~ The function MainScreen is too long (63). The maximum length is 60. [LongMethod]

FAILURE: Build failed with an exception.

❯ ./gradlew detektBaseline                            

BUILD SUCCESSFUL in 510ms

❯ cat config/detekt/baseline.xml                                            
<?xml version="1.0" ?>
<SmellBaseline>
  <ManuallySuppressedIssues></ManuallySuppressedIssues>
  <CurrentIssues>
    <ID>LongMethod:MainScreen.kt$@Composable fun MainScreen( modifier: Modifier = Modifier )</ID>
    <ID>LongMethod:TodoScreen.kt$@Composable fun TodoScreen( modifier: Modifier = Modifier, viewModel: TodoViewModel = hiltViewModel() )</ID>
    <ID>LongParameterList:TodoScreen.kt$( target: TargetTodo, focusRequester: FocusRequester, onDone: KeyboardActionScope.() -&gt; Unit, onClear: () -&gt; Unit, onValueChange: (TextFieldValue) -&gt; Unit, onAdd: () -&gt; Unit, onUpdate: () -&gt; Unit, onDelete: () -&gt; Unit, modifier: Modifier = Modifier )</ID>
  </CurrentIssues>
</SmellBaseline>

ここで検出しようとすると、何も検出されない。


❯ ./gradlew detekt              

BUILD SUCCESSFUL in 582ms

削除すると検出されるようになる。


❯ rm config/detekt/baseline.xml

❯ ./gradlew detekt             

> Task :app:detekt FAILED
~(略)~ The function EditBar(target: TargetTodo, focusRequester: FocusRequester, onDone: KeyboardActionScope.() -> Unit, onClear: () -> Unit, onValueChange: (TextFieldValue) -> Unit, onAdd: () -> Unit, onUpdate: () -> Unit, onDelete: () -> Unit, modifier: Modifier) has too many parameters. The current threshold is set to 6. [LongParameterList]
~(略)~ The function TodoScreen is too long (99). The maximum length is 60. [LongMethod]
~(略)~ The function MainScreen is too long (63). The maximum length is 60. [LongMethod]


FAILURE: Build failed with an exception.

 

🧑‍💻 まとめ

キャッシュが効いてるのかと思ってあれこれやっていたが、この「baseline」だった。

「最初からドキュメントを隅々まで読んでおけば良かった。」などは言わない。

👉 【AndroidStudio】detekt で JetpackCompose 記述をチェックする hatena-bookmark