WSL2+UbuntuでC++の競プロ環境を作る
なんとなくVimを使いたくなったのですがWindowsとの相性が悪すぎたのでWSL使ってUbuntu上で動くようにしました。
環境
Windows11 Home 22H2
WSL2でUbuntuインストール
よっぽどのことがなければwslコマンドは通るようになってると思うから省略 無理だったらWindowsUpdate確認
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
中身は適当に
"行番号を表示 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-><C-n><C-w>k nnoremap <C-t> <C-w>j i "ターミナルモード中にEscでターミナルノーマルモードに移行 tnoremap <Esc> <C-><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) : "<C-j>" inoremap <silent><expr> <C-k> coc#pum#visible() ? coc#pum#prev(1) : "<C-k>" inoremap <silent><expr> <Enter> coc#pum#visible() ? coc#pum#confirm() : "<Enter>" inoremap <silent><expr> <Esc> coc#pum#visible() ? coc#pum#cancel() : "<Esc>" inoremap <silent><expr> <C-h> coc#pum#visible() ? coc#pum#cancel() : "<C-h>"
うまくいってればこの時点でこんな感じになってるはず
atcoder-cliとonline-judge-toolsのインストール
製作者様のブログに準じます
-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
$ 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
↑いちいち問題選ぶのがめんどくさいので
使い方
acc new {コンテスト名}
を叩く
サンプルがダウンロードされるので問題ごとにmain.cppに書き込んでいって(多分テンプレートが入ってるはず)
g++ main.cpp && oj t
でコンパイル&テストケース確認
acc s
で提出
おわりに
全部適当なのでなんか問題あったら指摘ください。よろしくお願いいたします。