WindowsでC言語の勉強をしよう

# はじめに

私が大学生になり学校の授業でC言語のプログラミングを学んでいますが、友達にvimをすすめたが複数部分で引っかかってしまったため引っかかったところと簡単な対策を書いていくために書いています。

#tl;dr

最後のコピペって完成！

## 環境

- Windows 10
- Visual Studio 2019
- neovim,v0.4.2
- clang,v9.0.0
- cmake,v3.14.3
- python3.8.0
- git

## 目標
開発者用コマンドプロンプト内でC言語を書いてサクッと実行する

## 必要なソフトのインストール

1 言わずもがなな[Visual Studio](https://docs.microsoft.com/ja-jp/visualstudio/install/install-visual-studio?view=vs-2019)
2 他のソフトをまとめてインストールするためchocolateyをインストールする
[Chocolatey](https://chocolatey.org)
[Chocolateyを使った環境構築の時のメモ](https://qiita.com/konta220/items/95b40b4647a737cb51aa)
PowerShellを管理者権限で起動し下記のコマンドを入力する

`PowerShellを管理者権限で起動するにはWindowsキーとxキーを同時に押しAを押すとできる`

```powershell

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

これの処理が終わるとPowerShell上で`choco install 〇〇`などと言ったコマンドで簡単にソフトウェアをインストールすることができる

```powershell

choco install python3 neovim cmake llvm git -y
```
このコマンドで必要なソフトのインストールが終わるのでPowerShellは終了しよう

## neovimの文字コード設定

此処から先は先程インストールしたVisual Studio内にはいっているDeveloper Command Prompt for VS 2019を利用する
スタートメニュー内のVisual Studio 2019のファイル内にあるためこれを選択してほしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242310/cbe4cc3d-3805-4deb-31f7-ec04abc2c8d9.png)


neovimは基本的にUTF-8という文字コードを使用するがWindows上ではべつのcp932という文字コードを使用するためそのままでは文字化けが発生してしまうなので
neovimでもcp932という設定にする必要がある
他の様々なサイトではneovimの設定ファイルは.connfigと書かれていたり
vimの設定ファイルの.vimを推奨している場合が多い
しかし、Windows上で使用する場合初期設定では`$HOME\AppData\init.vim`が使用されているためこちらを使うのが好ましい
まずは設定フォルダを作成するために`mkdir %APPDATA%\..\Local\nvim`と入力をしよう
その後`cd %APPDATA%\..\Local\nvim`で今作成したフォルダに移動して
そしたら`nvim init.vim`と入力してneovimを起動しよう
まずは以下のような設定を行おう

```vim
let g:python3_host_prog='C:\Python38\python.exe'
set fileencoding=cp932
set fileencodings=cp932,sjis,utf-8
```

これによってWindowsでneovimを利用したら基本的にはcp932がしようされもしもutf-8のファイルがあった場合でも読み込まれるというものになってます。

そのためこのDeveloper Command Prompt for VS 2019内においてnvim 〇〇.cとcl 〇〇.cそして〇〇の3つを繰り返してプログラムの学習ができるようになります。

#設定について

ちょっとまってて

# プラグインについて

neovim/vimには様々な人がプラグインを作成していてそれらを使用することでさらなる機能を得ることができます。
今回はdein.vimというプラグイン管理ソフトを利用してインストールしていきたいと思います。



#　おすすめプラグイン

## [vimdoc-ja](https://github.com/vim-jp/vimdoc-ja.git)

neovimのヘルプは基本的にすべて英語で書かれているためこのようなサイトに調べに来る人はとっても困るものですがこのプラグインはほとんどのヘルプを日本語に翻訳して置き換えれるものです

## [molokai](https://github.com/tomasr/molokai)

私の好きなカラースキームで暗めの色のやつ
インストールするだけでは反映されないので下記のようにinit.vimに追加する

```vim:init.vim
colorscheme molokai
```

## [deoplete.nvim](https://github.com/Shougo/deoplete.nvim)　[neosnippet](https://github.com/Shougo/neosnippet)　[neosnippet-snippets](https://github.com/Shougo/neosnippet-snippets)

もうこの3つのファイルのためにこれを書いたと言ってもいいくらいのものである
これらのプラグインはすべて補完機能を拡張するためのプラグインである
基本的に補完機能自体は挿入モードで<C-x>を押すことでできるがそれだけではないそれ以上の機能をくれるのがこれらのプラグインである
インストールするだけではこれらの本領は反映されないので下記のようにinit.vimに追加する

```vim:init.vim
let g:deoplete#enable_at_startup = 1
let g:deoplete#auto_complete_delay = 0
let g:deoplete#auto_complete_start_length = 1
let g:deoplete#enable_camel_case = 0
let g:deoplete#enable_ignore_case = 0
let g:deoplete#enable_refresh_always = 0
let g:deoplete#enable_smart_case = 1
let g:deoplete#file#enable_buffer_path = 1
let g:deoplete#max_list = 10000
inoremap <expr><tab> pumvisible() ? "\<C-n>" :
      \ neosnippet#expandable_or_jumpable() ?
      \    "\<Plug>(neosnippet_expand_or_jump)" : "\<tab>"

imap <C-k> <Plug>(neosnippet_expand_or_jump)
smap <C-k> <Plug>(neosnippet_expand_or_jump)
xmap <C-k> <Plug>(neosnippet_expand_target)
if has('conceal')
  set conceallevel=2 concealcursor=niv
endif
```

これらを追記することによってtabキーで補完するものを選び<C-k>でそれらを展開することができるようになる

##[deoplete-clang](https://github.com/zchee/deoplete-clang)　[neoinclude.vim](https://github.com/Shougo/neoinclude.vim)

この2つのプラグインは上の3つのプラグインで拡張した補完機能にC言語のライブラリを追加するためのプラグインである
これらのプラグインはclangという先程インストールしたものを利用するため以下のようにinit.vimに追記する必要がある

```vim:init.vim
let g:deoplete#sources#clang#clang_header = 'C:\Program Files\LLVM\lib\clang\'
let g:deoplete#sources#clang#libclang_path = 'C:\Program Files\LLVM\bin\libclang.dll'
```

##　まとめ

1 chocolateyをインストールする
管理者権限で開いたPowerShellで
`Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))`を入力する

2 必要なソフトをインストールする
`choco install python3 neovim cmake llvm git -y`
3 PowerShellを再起動してpythonとnvimをつなぐモジュールを用意する
`pip3 install neovim`
4 また以上のプラグインをすべて入れるのであればdein.tomlというファイルをinit.vimと同じフォルダ(~/AppData/Local/nvim)に作成してください

```toml:dein.toml
[[plugins]]
repo='vim-jp/vimdoc-ja.git'
[[plugins]]
repo = 'tomasr/molokai'
[[plugins]]
repo= 'Shougo/neosnippet-snippets'
[[plugins]]
repo = 'Shougo/deoplete.nvim'
hook_source = '''
  let g:deoplete#enable_at_startup = 1
  let g:deoplete#auto_complete_delay = 0
  let g:deoplete#auto_complete_start_length = 1
  let g:deoplete#enable_camel_case = 0
  let g:deoplete#enable_ignore_case = 0
  let g:deoplete#enable_refresh_always = 0
  let g:deoplete#enable_smart_case = 1
  let g:deoplete#file#enable_buffer_path = 1
  let g:deoplete#max_list = 10000
  inoremap <expr><tab> pumvisible() ? "\<C-n>" :
        \ neosnippet#expandable_or_jumpable() ?
        \    "\<Plug>(neosnippet_expand_or_jump)" : "\<tab>"
'''
on_i = 1



[[plugins]]
repo = 'Shougo/neosnippet'
hook_source = '''
  imap <C-k> <Plug>(neosnippet_expand_or_jump)
  smap <C-k> <Plug>(neosnippet_expand_or_jump)
  xmap <C-k> <Plug>(neosnippet_expand_target)
  if has('conceal')
    set conceallevel=2 concealcursor=niv
  endif
'''
on_i  = 1
on_ft = ['snippet']
depends = ['neosnippet-snippets']

#C言語の補完
[[plugins]]
repo = 'zchee/deoplete-clang'
on_ft=['c','cpp','cmake','make']

[[plugins]]
repo='Shougo/neoinclude.vim'
on_ft=['c','cpp']
```

またこれが以上のプラグインをすべて入れてプラグインの設定を追加したものです

```vim:init.vim

set fileencoding=cp932
set fileencodings=cp932,sjis,utf-8
scriptencoding=utf-8
let g:python3_host_prog = 'c:\Python38\python.exe'
"プラグインのインストール
"プラグインが実際にインストールされるディレクトリ
let s:dein_dir = expand('~\AppData\Local\nvim\dein')
" dein.vim 本体
let s:dein_repo_dir = s:dein_dir . '\repos\github.com\Shougo\dein.vim'
" dein.vim がなければ github から落としてくる
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^=' . s:dein_repo_dir
endif
" 設定開始
if dein#load_state(s:dein_dir)
	call dein#begin(s:dein_dir)
	" プラグインリストを収めた TOML ファイルの場所
	let g:rc_dir    = expand('~\AppData\Local\nvim\')
	let s:toml      = g:rc_dir . '\dein.toml'
	" TOML を読み込み、キャッシュしておく
	call dein#load_toml(s:toml,      {'lazy': 0})
	" 設定終了
	call dein#end()
	call dein#save_state()
endif
" もし、未インストールものものがあったらインストール
if dein#check_install()
	call dein#install()
endif

filetype plugin on 

let g:deoplete#sources#clang#clang_header = 'C:\Program Files\LLVM\lib\clang\'
let g:deoplete#sources#clang#libclang_path = 'C:\Program Files\LLVM\bin\libclang.dll'
```

私の[設定ファイル](https://github.com/mirachan010/dotfiles)です良ければ参照してください