Windows(WSL2) + Ubuntu + Rust + Neovim + fish shell マイ競プロ環境構築
WSL2 インストール
以下に従って、WSL2をインストール。
ディストリビューションを指定してインストールすることもできますが、指定しなければUbuntu
が指定されるので、指定しないでインストール。
Windowsターミナル インストール
Windows11の場合は標準搭載されているので、不要。
Windows10の場合は、以下で紹介されている通り、MicroSoft Storeからインストール。
設定
好みで以下の設定を行う。
- スタートアップ時のデフォルトターミナルをUbuntuに設定
[設定] -> [スタートアップ] -> [既定のプロファイル]でUbuntu
を選択し、保存。
- 背景の透明度設定
[設定] -> プロファイル欄の[Ubuntu-20.04] -> [外観] -> [透明度]で好みの透明度に設定し、保存。
ターミナルを再起動、または、ターミナルのタブから新しいターミナルを起動すると、以下のようになる。
Rust インストール
以下の順にWindowsターミナル上のUbuntu
でコマンドを打つ。
以下の記事を参考にしました。
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
のインストールを行う。
rustfmt
自動整形したい場合は、rustfmt
をインストール。
rustup component add rustfmt
Neovim インストール
sudo apt install neovim
でインストールすると最新バージョンにならないので、インストールしてしまった場合は、sudo apt remove neovim
を行ってから、以下のAppImageの手法でインストールを行う。
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()
それぞれ以下の用途。
- rust.vim: 自動整形(事前に
rustfmt
をrustup
でインストールしておくこと) - coc.nvim: rust-analyzer
- 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
を編集します。
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
ができようされる。
参考:
初期設定だと、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
Discussion