🏃

Windows(WSL2) + Ubuntu + Rust + Neovim + fish shell マイ競プロ環境構築

2023/05/27に公開

WSL2 インストール

以下に従って、WSL2をインストール。
ディストリビューションを指定してインストールすることもできますが、指定しなければUbuntuが指定されるので、指定しないでインストール。

https://chigusa-web.com/blog/wsl2-win11/

Windowsターミナル インストール

Windows11の場合は標準搭載されているので、不要。
Windows10の場合は、以下で紹介されている通り、MicroSoft Storeからインストール。

https://se-abeaver.com/install-winterm/

設定

好みで以下の設定を行う。

  • スタートアップ時のデフォルトターミナルをUbuntuに設定

[設定] -> [スタートアップ] -> [既定のプロファイル]でUbuntuを選択し、保存。

altテキスト

  • 背景の透明度設定

[設定] -> プロファイル欄の[Ubuntu-20.04] -> [外観] -> [透明度]で好みの透明度に設定し、保存。

altテキスト

ターミナルを再起動、または、ターミナルのタブから新しいターミナルを起動すると、以下のようになる。

altテキスト

Rust インストール

以下の順にWindowsターミナル上のUbuntuでコマンドを打つ。
以下の記事を参考にしました。
https://zenn.dev/dozo/articles/56a3fa90dbfb50

sudo apt install build-essential
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
echo 'export PATH=$HOME/.cargo/bin:$PATH' | tee -a .bashrc
source .bashrc

以下のバージョン確認で、バージョンが表示されれば、無事インストールできています。

rustup --version
cargo --version

cargo-competeインストール

AtCoderでcargo-competeを使用する場合は、以下の通り。

rustup install 1.42.0
cargo install cargo-compete

インストール時以下のエラーが出る場合は、以下を試して、再度cargo-competeのインストールを行う。

https://qiita.com/nacika_ins/items/465e89a7b3fbeb373605

rustfmt

自動整形したい場合は、rustfmtをインストール。

rustup component add rustfmt

Neovim インストール

sudo apt install neovimでインストールすると最新バージョンにならないので、インストールしてしまった場合は、sudo apt remove neovimを行ってから、以下のAppImageの手法でインストールを行う。

https://github.com/neovim/neovim/wiki/Installing-Neovim#appimage-universal-linux-package

curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
chmod u+x nvim.appimage
./nvim.appimage
./nvim.appimage --appimage-extract
./squashfs-root/AppRun --version
sudo mv squashfs-root /
sudo ln -s /squashfs-root/AppRun /usr/bin/nvim

以下のコマンドでバージョン確認して、正常にインストールされていることを確認する。

nvim -v

Node.js インストール

rust-analyzerを使うためにcoc.nvimプラグインで、Node.jsが必要なので、インストールする。

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install -g yarn
sudo npm install n -g
sudo n latest

以下のコマンドでバージョンを切り替える。カーソルキーで選択しリターンキーでインストールできます。

sudo n

ターミナルを再起動後、以下のコマンドで最新版のNode.jsがインストールされていることを確認する。

node -v

vim-plug インストール

sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
  • init.vim作成

Neovimをインストールしてから、init.vimの設定をしていない場合は、~/.config/nvim/init.vimを手動で作成し、以下の内容を入力し、保存する。
プラグインに関する記述は以下の通り。

call plug#begin('~/.vim/plugged')
  Plug 'rust-lang/rust.vim'
  Plug 'neoclide/coc.nvim', {'branch': 'release'}
  Plug 'tpope/vim-commentary'
call plug#end()

それぞれ以下の用途。

  1. rust.vim: 自動整形(事前にrustfmtrustupでインストールしておくこと)
  2. coc.nvim: rust-analyzer
  3. vim-commentary: ビジュアルモードで選択してgcを入力すると、選択部分をコメントアウトできる
  • プラグインインストール

Neovimを開いて(何でもよい)、以下のコマンドを実行する。

PlugInstall

インストール完了後、以下のコマンドでステータスを確認し、OKでれば正常にインストールされている。

PlugStatus

init.vim設定

init.vimに何も設定しないと、使用しずらいので、タブ選択できるようにしたり、保存時に自動整形されるようにする。

call plug#begin('~/.vim/plugged')
  Plug 'rust-lang/rust.vim'
  Plug 'neoclide/coc.nvim', {'branch': 'release'}
call plug#end()

syntax enable
filetype plugin indent on

" rust auto format
let g:rustfmt_autosave = 1

set number

" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
" delays and poor user experience.
set updatetime=300

" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved.
if has("patch-8.1.1564")
  " Recently vim can merge signcolumn and number column into one
  set signcolumn=number
else
  set signcolumn=yes
endif

" Make <CR> auto-select the first completion item and notify coc.nvim to
" format on enter, <cr> could be remapped by other vim plugin
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
                              \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

inoremap <silent> jj <ESC>
noremap <Space>s :<C-u>w<CR>

括弧とクォーテーションの自動補完

好みに応じて、以下の記事を参考に、init.vimを編集します。
https://original-game.com/how-to-make-a-complementary-function-of-vim/

rust-analyzer インストール

Neovimを開いて(何でもよい)、以下のコマンドを実行する。

CocInstall coc-rust-analyzer

coc-snippets インストール

Neovimを開いて(何でもよい)、以下のコマンドを実行する。

CocInstall coc-snippets

RustファイルをNeovimで開いて、以下のコマンドを実行する。

CocCommand snippets.editSnippets

以下のようにスニペットを設定する。

snippet atcoder "template" b
#![allow(non_snake_case)]
#![allow(unused_imports)]
#![allow(unused_macros)]
#![allow(clippy::needless_range_loop)]
#![allow(clippy::comparison_chain)]
#![allow(clippy::nonminimal_bool)]
#![allow(clippy::neg_multiply)]
#![allow(dead_code)]
use itertools::Itertools;
use superslice::Ext;
use std::cmp::Reverse;
use std::collections::{BTreeMap, BTreeSet, BinaryHeap, VecDeque};

use proconio::{
    fastout, input,
    marker::{Chars, Usize1},
};

#[derive(Default)]
struct Solver {}
impl Solver {
    #[fastout]
    fn solve(&mut self) {
        input! {}
    }
}

fn main() {
    std::thread::Builder::new()
        .stack_size(128 * 1024 * 1024)
        .spawn(|| Solver::default().solve())
        .unwrap()
        .join()
        .unwrap();
}
endsnippet

fish shell インストール

sudo apt-add-repository ppa:fish-shell/release-3
sudo apt-get update
sudo apt-get install fish

以下のコマンドでバージョン確認して、正常にインストールされていることを確認。

fish -v

以下のコマンドでデフォルトのシェルを変更。

chsh

ディレクトリは以下を設定。

/usr/bin/fish

ターミナルを再起動、または、タブで新規起動すると、fish shellができようされる。

参考:
https://qiita.com/koji9412/items/7e2a15c330c387fc5b3b

初期設定だと、cargoの環境パスが通っていないので、手動でパスを通す必要がある。

fish_add_path $HOME/.cargo/bin

クリップボード

Windowsのclip.exeが使用できるので、以下で可能。

cat src/main.rs | clip.exe
clip.exe < src/main.rs

clip.exeの代わりに、clipとしたい場合、fish shellでは以下の通り、aliasを設定し、保存する(再起動時使えない)。

alias clip='clip.exe'
funcsave clip

ファイルを開かず入力する方法

マルチテストケースのときは、入出力が混在してしまうので、入力情報をファイルに保存してから実行します。その際、ファイルをいちいち開くのも面倒なので、開かなくても入力して、プログラムを実行する方法は以下です。入力にはEnterが含まれるので、シングルクォーテーションで囲みます。

touch in
echo '3
5 2
1 3 5 3 9
2 5 11 2 4
6 1
-1 3 -2 0 -5 -1
-4 0 -1 4 0 0
3 3
7 7 7
9 4 8
' > in
cargo run < in
GitHubで編集を提案

Discussion