neovimでrustを使えるようにする

LSPはrust-analyzerを使う

brew install rust-analyzer

もしくはneovimでmasonを使っている場合は :MasonInstall rust-analyzer

local lspconfig_status_ok, lspconfig = pcall(require, "lspconfig")
if not lspconfig_status_ok then
  return
end
 
local opts = {
  on_attach = require("lsp.handlers").on_attach,
  capabilities = require("lsp.handlers").capabilities,
}
 
lspconfig['rust_analyzer'].setup(opts)
 

formatter

https://github.com/rust-lang/rustfmt

rustup component add rustfmt

:RustFmt はとくに何も設定しなくても使えたけど、エラーが出て効かなかった

Error detected while processing function rustfmt#Format[7]..<SNR>64_RunRustfmt:
line   48:
E776: No location list

:!rustfmt % で代用したらRust 2018からじゃないと使えない記法でエラーになった。 rustfmt.toml を作って edition = "2021" を書いた

保存時に実行してほしかったのでこうした。 cursor位置が先頭に行ってしまうので、 nvim_win_get_cursor で位置を保存しておいてからrustfmt実行 rustfmt.toml を見てくれないのでeditionを明示した。これだとプロジェクトによっては設定読めなくてformatずれるな。

function rustfmt(wait_ms)
  local curpos = vim.api.nvim_win_get_cursor(0)
  vim.cmd [[ %!rustfmt --edition "2021" ]]
  vim.api.nvim_win_set_cursor(0, curpos)
end
 
vim.cmd [[
  augroup rustfmt
    autocmd!
    autocmd BufWritePre *.rs lua rustfmt()
  augroup end
]]
 

Rustなにもわからないのでとりあえずこれをベースにする Building My First Command Line Interface (CLI) with Rust | by Adam Berg | Geek Culture | Medium

初期化

cargo new パッケージ名 もしくは cargo init で作成 Cargo.tomlができる

cargo add クレート名 でライブラリを追加する

cargo add reqwest tokio

features も設定したかったけどコマンドだとよくわからなかったのでtoml直接修正する

clapを使ってみる

ClapというcrateがCLI作るときに便利なライブラリのようなので、これを使ってもいいかも RustのClapクレートがメチャクチャ良かった話

deriveっていうのが今風らしい Rust | clap v3系でCLIツールを作成する - dotTrail

reqwest

responseのJSONをparseしたかったのでserdeをいれてみた

serde = { version = "1.0", features = ["derive"] }
reqwest = { version = "0.11", features = ["blocking", "json"] }