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
2 他のソフトをまとめてインストールするためchocolateyをインストールする
Chocolatey
Chocolateyを使った環境構築の時のメモ
PowerShellを管理者権限で起動し下記のコマンドを入力する

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


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

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


choco install python3 neovim cmake llvm git -y

このコマンドで必要なソフトのインストールが終わるのでPowerShellは終了しよう

neovimの文字コード設定

此処から先は先程インストールしたVisual Studio内にはいっているDeveloper Command Prompt for VS 2019を利用する
スタートメニュー内のVisual Studio 2019のファイル内にあるためこれを選択してほしい

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を起動しよう
まずは以下のような設定を行おう

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

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

molokai

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

init.vim
colorscheme molokai

deoplete.nvim neosnippet neosnippet-snippets

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

deoplete-clang neoinclude.vim

この2つのプラグインは上の3つのプラグインで拡張した補完機能にC言語のライブラリを追加するためのプラグインである
これらのプラグインはclangという先程インストールしたものを利用するため以下のようにinit.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)に作成してください

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']

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

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'

私の設定ファイルです良ければ参照してください