tabula rasa

白紙

WSL2+UbuntuでC++の競プロ環境を作る

なんとなくVimを使いたくなったのですがWindowsとの相性が悪すぎたのでWSL使ってUbuntu上で動くようにしました。

環境

Windows11 Home 22H2

WSL2でUbuntuインストール

よっぽどのことがなければwslコマンドは通るようになってると思うから省略 無理だったらWindowsUpdate確認

  • Windowsの機能から「LinuxWindowsサブシステム」と「仮想化プラットフォーム」を有効にする

  • wslのデフォルトをwsl2にする

wsl --set-default-version 2
  • Ubuntuをインストール(管理者で)
wsl --install -d Ubuntu

ここからはUbuntu上で

  • neovimインストール
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:neovim-ppa/unstable
$ sudo apt-get update
$ sudo apt-get install neovim
  • ~/.config/nvimにinit.vim,dein.toml,dein_lazy.toml作成
  • ~/.config/nvim/pluginsにcoc.vim作成

中身は適当に

"行番号を表示
set number
"シンタックスハイライトをon
syntax on
"行末まで検索した後行頭に戻って検索
set wrapscan
"検索結果をハイライト表示(:nohで消す)
set showmatch
"tabキーで挿入されるスペースの数
set shiftwidth=2
"中括弧を始めた後などの改行のあと自動的にインデントを入れる
set smartindent
"インデント周りの各種機能で操作されるスペースの数
set softtabstop=4
"VimではUTF-8で文字を表示する
set encoding=utf-8
"UTF-8でファイルを読み込み、ダメだったらShift_JISを試す
set fileencodings=utf-8,sjis
"UTF-8でファイルを書き込む
set fileencodings=utf-8
"コマンドモードでtabを使ってファイル名を補完するときに、1回目は最大共通文字列、次からは順番にファイル名を完全補完する
set wildmode=longest,full

"Ctrl+J,Ctrl+Kでパラグラフ一つ分移動 nnoremap <C-j> } nnoremap <C-k> {

" Vim起動時に画面下側にターミナルを立ち上げ、いいぐらいの高さにしておく(resizeの値は適宜調整) if has('vim_starting') split wincmd j resize 15 terminal wincmd k endif

"エディタとターミナルの操作をCtrl+Tで切り替え tnoremap <C-t> <C-&gt;<C-n><C-w>k nnoremap <C-t> <C-w>j i "ターミナルモード中にEscでターミナルノーマルモードに移行 tnoremap <Esc> <C-&gt;<C-n>

set autochdir

let &t_SI .= "\e[5 q"

inoremap { {}<LEFT> inoremap [ []<LEFT> inoremap ( ()<LEFT> inoremap " ""<LEFT> inoremap ' ''<LEFT>

"dein setting-------------------------------------------------------- let s:dein_dir = expand('$HOME/.cache/dein') let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim' "if &compatible " set nocompatible " Be iMproved "endif " dein.vimがない場合githubからDL if &runtimepath !~# '/dein.vim' if !isdirectory(s:dein_repo_dir) execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir endif execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p') endif " 設定開始 if dein#load_state(s:dein_dir) call dein#begin(s:dein_dir) " プラグインリスト(toml) let g:rc_dir = expand('$HOME/.config/nvim') let s:toml = g:rc_dir . '/dein.toml' let s:lazy_toml = g:rc_dir . '/dein_lazy.toml' " tomlのロード call dein#load_toml(s:toml, {'lazy':0}) call dein#load_toml(s:lazy_toml, {'lazy':1}) " 設定終了 call dein#end() call dein#save_state() endif " Required: filetype plugin indent on syntax enable " 未インストールがあればインストール if dein#check_install() call dein#install() endif "dein setting end------------------------------------------------------

"nerdtree setting nmap <C-f> :NERDTreeToggle<CR>

"Clipboard setting set clipboard+=unnamedplus

[[plugins]]
repo = 'Shougo/dein.vim'

plugins repo = 'vim-airline/vim-airline' hook_add =''' let g:airline#extensions#tabline#enabled = 1 nmap <C-p> <Plug>AirlineSelectPrevTab nmap <C-n> <Plug>AirlineSelectNextTab let g:airline#extensions#tabline#buffer_idx_mode = 1 '''

plugins repo = 'vim-airline/vim-airline-themes' hook_add =''' let g:airline_theme = 'bubblegum' let g:airline#extensions#tabline#enabled = 1 let g:airline_powerline_fonts = 1 '''

plugins repo = 'ryanoasis/vim-devicons'

plugins repo = 'preservim/nerdtree'

plugins repo = 'neoclide/coc.nvim' merged = 0 rev = 'release' hook_add = ''' source ~/.config/nvim/plugins/coc.vim '''

dein_lazy.tomlは使い方がいまいちよくわからなかったので空です。

" デフォルトでインストールするもの
let g:coc_global_extensions = [
    \'coc-clangd',
    \]

" エラーと警告の色を指定 highlight CocErrorSign ctermfg=15 ctermbg=196 highlight CocWarningSign ctermfg=0 ctermbg=172

"スペースinfoでHover noremap <silent> <Leader>info :<C-u>call CocAction('doHover')<cr> "スペースdfでDefinition nnoremap <silent> <Leader>df :call CocAction('jumpDefinition')<CR> "スペースfmtでFormat nnoremap <space>fmt :call CocAction('format')<CR> " Coc-quick-fix nnoremap <space>fx :call CocAction('doQuickfix')<CR> " autocomplete inoremap <silent><expr> <C-j> coc#pum#visible() ? coc#pum#next(1) : "&lt;C-j>" inoremap <silent><expr> <C-k> coc#pum#visible() ? coc#pum#prev(1) : "&lt;C-k>" inoremap <silent><expr> <Enter> coc#pum#visible() ? coc#pum#confirm() : "&lt;Enter>" inoremap <silent><expr> <Esc> coc#pum#visible() ? coc#pum#cancel() : "&lt;Esc>" inoremap <silent><expr> <C-h> coc#pum#visible() ? coc#pum#cancel() : "&lt;C-h>"

うまくいってればこの時点でこんな感じになってるはず

C++のファイルを開いたところ

atcoder-cliとonline-judge-toolsのインストール

製作者様のブログに準じます

tatamo.81.la

-node.jsが必要なのでインストール

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

一旦ターミナル再起動

$ nvm install node
$ npm install -g npm
  • pip3のインストール
$ sudo apt-get install python3-pip
  • atcoder-cli, online-judge-toolsのインストール
$ npm install -g atcoder-cli
$ pip3 install online-judge-tools

accとojコマンドが通ってればOK

atcoder-cliとonline-judge-toolsの設定

  • ログイン
$ acc login
$ oj login https://atcoder.jp/
  • 連携のための設定
$ acc config default-contest-dirname-format test
$ acc config default-task-choice all

テンプレート設定

$ acc config-dir
$ cd ~/.config/atcoder-cli-nodejs
$ mkdir cpp
$ cd cpp

この中にmain.cppとtemplate.jsonを作成

/**
*    author:  mioupa
**/

#include <bits/stdc++.h> #include <math.h> #define rep(i, n, m) for (int i = n; i < m; ++i) #define ll long long #define ALL_RANGE(v) v.begin(), v.end() #define REV_ALL_RANGE(v) v.rbegin(), v.rend() #define INF 1010000000

using namespace std;

template <class T> inline bool chmax(T &a, T b) { if (a < b) { a = b; return 1; } return 0; } template <class T> inline bool chmin(T &a, T b) { if (a > b) { a = b; return 1; } return 0; }

//-----------------end_template------------------

int main() {

return 0; }

{
  "task":{
    "program": ["main.cpp"],
    "submit": "main.cpp"
  }
}

$ acc config default-template cpp

↑いちいち問題選ぶのがめんどくさいので

使い方

適当にAtcoder用のディレクトリを作って

acc new {コンテスト名}

を叩く

サンプルがダウンロードされるので問題ごとにmain.cppに書き込んでいって(多分テンプレートが入ってるはず)

g++ main.cpp && oj t

コンパイル&テストケース確認

acc s

で提出

おわりに

全部適当なのでなんか問題あったら指摘ください。よろしくお願いいたします。