LoginSignup
53
69

More than 1 year has passed since last update.

vimでPython書きたい人へ

Last updated at Posted at 2020-05-22

対象者

vimを使ってPython書きたい/書いてる人と、カラースキームの編集について知りたい人
ぼくが使っている.vimrcと、Python用のシンタックススクリプト、最後にカラースキームをご紹介します。

何かの役に立ちましたらLGTM・ストック・コメントぜひよろしくお願いします!

更新情報

  • 2020/12/13
    • f-stringのシンタックスハイライトを追加しました。変更箇所へ

目次

vimrc

vimは高機能エディターですが、例えばVisual Studiojupyter notebookなどと違って、UIやらが(プラグインを用いないと)全く充実してないためなんとなく敷居が高いですよね。
かくいうぼくも大して使いこなせていないので練習あるのみな感じですが...
でもデフォルトのキーバインドでも慣れるとサクサク書けたり、色々自由にカスタマイズできるのがvimのいいところかなぁと最近思ったり思わなかったりしています。
いろんなプラグインがgithubに公開されていますしね。
そう言うことで、今日はぼくが今使っている.vimrcを紹介します。

ここで紹介されている.vimrcをコピペして、少しだけカスタマイズしたりしています。
全部コピペで.vimrcを作りたい!という時はここまでやってからコピペして調整してください。

.vimrc
.vimrc
set encoding=utf-8
scriptencoding utf-8
" ↑1行目は読み込み時の文字コードの設定
" ↑2行目はVim Script内でマルチバイトを使う場合の設定
" Vim scritptにvimrcも含まれるので、日本語でコメントを書く場合は先頭にこの設定が必要になる

"----------------------------------------------------------
" NeoBundle
"----------------------------------------------------------
if has('vim_starting')
  " 初回起動時のみruntimepathにNeoBundleのパスを指定する
  set runtimepath+=~/.vim/bundle/neobundle.vim/

  " NeoBundleが未インストールであればgit cloneする
  if !isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
    echo "install NeoBundle..."
    :call system("git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim")
  endif
endif

call neobundle#begin(expand('~/.vim/bundle/'))

" インストールするVimプラグインを以下に記述
" NeoBundle自身を管理
NeoBundleFetch 'Shougo/neobundle.vim'
" カラースキーム
"NeoBundle 'tomasr/molokai'
"NeoBundle 'flrnd/plastic.vim'
"NeoBundle 'sainnhe/edge'
NeoBundle 'cocopon/iceberg.vim'
"NeoBundle 'kuroitu/pyceberg.vim'
" 花文字
"NeoBundle 'sainnhe/icursive-nerd-font'
" カラースキームを調べる
NeoBundle 'guns/xterm-color-table.vim'
" ステータスラインの表示内容強化
NeoBundle 'itchyny/lightline.vim'
" インデントの可視化
NeoBundle 'Yggdroot/indentLine'
" 末尾の全角半角空白文字を赤くハイライト
NeoBundle 'bronson/vim-trailing-whitespace'
" 構文エラーチェック
NeoBundle 'scrooloose/syntastic'
" 多機能セレクタ
NeoBundle 'ctrlpvim/ctrlp.vim'
" CtrlPの拡張プラグイン. 関数検索
NeoBundle 'tacahiroy/ctrlp-funky'
" CtrlPの拡張プラグイン. コマンド履歴検索
NeoBundle 'suy/vim-ctrlp-commandline'
" CtrlPの検索にagを使う
NeoBundle 'rking/ag.vim'
" プロジェクトに入ってるESLintを読み込む
NeoBundle 'pmsorhaindo/syntastic-local-eslint.vim'
" pythonコード補完
NeoBundle 'davidhalter/jedi-vim'
NeoBundle 'ervandew/supertab'
autocmd FileType python setlocal completeopt-=preview
let g:SuperTabContextDefaultCompletionType = "context"
let g:SuperTabDefaultCompletionType = "<c-n>"
"let g:jedi#rename_command = "<c-r>"
let g:jedi#force_py_version="3"
" 括弧補完
NeoBundle 'cohama/lexima.vim'

" vimのlua機能が使える時だけ以下のVimプラグインをインストールする
if has('lua')
  " コードの自動補完
  NeoBundle 'Shougo/neocomplete.vim'
  " スニペットの補完機能
  NeoBundle "Shougo/neosnippet"

  " スニペット集
  NeoBundle 'Shougo/neosnippet-snippets'
endif

call neobundle#end()

" ファイルタイプ別のVimプラグイン/インデントを有効にする
filetype plugin indent on

" 未インストールのVimプラグインがある場合、インストールするかどうかを尋ねてくれるようにする設定
NeoBundleCheck

"----------------------------------------------------------
" カラースキーム
"----------------------------------------------------------
" カラースキームにmolokaiを設定する
"if neobundle#is_installed('molokai')
"  colorscheme molokai
"endif
"colorscheme murphy
" plasticに設定
"if neobundle#is_installed('plastic')
"  colorscheme plastic
"endif
" neonに設定
"if neobundle#is_installed('edge')
"  set termguicolors
"  set background=dark
"  let g:edge_style = 'neon'
"  let g:edge_disable_italic_comment = 1
"  let g:edge_enable_italic = 0
"  colorscheme edge
"endif
" icebergに設定
if neobundle#is_installed('iceberg.vim')
  colorscheme iceberg
endif

set t_Co=256 " iTerm2など既に256色環境なら無くても良い
syntax enable " 構文に色を付ける

"----------------------------------------------------------
" 文字
"----------------------------------------------------------
set fileencoding=utf-8 " 保存時の文字コード
set fileencodings=ucs-boms,utf-8,euc-jp,cp932 " 読み込み時の文字コードの自動判別. 左側が優先される
set fileformats=unix,dos,mac " 改行コードの自動判別. 左側が優先される
set ambiwidth=double " □や○文字が崩れる問題を解決

"----------------------------------------------------------
" ステータスライン
"----------------------------------------------------------
set laststatus=2 " ステータスラインを常に表示
set showmode " 現在のモードを表示
set showcmd " 打ったコマンドをステータスラインの下に表示
set ruler " ステータスラインの右側にカーソルの位置を表示する

"----------------------------------------------------------
" コマンドモード
"----------------------------------------------------------
set wildmenu " コマンドモードの補完
set history=5000 " 保存するコマンド履歴の数

"----------------------------------------------------------
" タブ・インデント
"----------------------------------------------------------
set expandtab " タブ入力を複数の空白入力に置き換える
set tabstop=2 " 画面上でタブ文字が占める幅
set softtabstop=2 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent " 改行時に前の行のインデントを継続する
set smartindent " 改行時に前の行の構文をチェックし次の行のインデントを増減する
set shiftwidth=2 " smartindentで増減する幅

"----------------------------------------------------------
" 文字列検索
"----------------------------------------------------------
set incsearch " インクリメンタルサーチ. 1文字入力毎に検索を行う
set ignorecase " 検索パターンに大文字小文字を区別しない
set smartcase " 検索パターンに大文字を含んでいたら大文字小文字を区別する
set hlsearch " 検索結果をハイライト

" ESCキー2度押しでハイライトの切り替え
nnoremap <silent><Esc><Esc> :<C-u>set nohlsearch!<CR>

"----------------------------------------------------------
" カーソル
"----------------------------------------------------------
set whichwrap=b,s,h,l,<,>,[,],~ " カーソルの左右移動で行末から次の行の行頭への移動が可能になる
set number " 行番号を表示
set cursorline " カーソルラインをハイライト

" 行が折り返し表示されていた場合、行単位ではなく表示行単位でカーソルを移動する
nnoremap j gj
nnoremap k gk
nnoremap <down> gj
nnoremap <up> gk

" バックスペースキーの有効化
set backspace=indent,eol,start

"----------------------------------------------------------
" カッコ・タグの対応
"----------------------------------------------------------
set showmatch " 括弧の対応関係を一瞬表示する
set matchtime=3
set matchpairs& matchpairs+=<:>
source $VIMRUNTIME/macros/matchit.vim " Vimの「%」を拡張する
let g:lexima_enable_newline_rules=0   " 括弧の改行ルールを無効にする

"----------------------------------------------------------
" マウスでカーソル移動とスクロール
"----------------------------------------------------------
if has('mouse')
  set mouse=a
  if has('mouse_sgr')
    set ttymouse=sgr
  elseif v:version > 703 || v:version is 703 && has('patch632')
    set ttymouse=sgr
  else
    set ttymouse=xterm2
  endif
endif

"----------------------------------------------------------
" クリップボードからのペースト
"----------------------------------------------------------
" 挿入モードでクリップボードからペーストする時に自動でインデントさせないようにする
if &term =~ "xterm"
  let &t_SI .= "\e[?2004h"
  let &t_EI .= "\e[?2004l"
  let &pastetoggle = "\e[201~"

  function XTermPasteBegin(ret)
    set paste
    return a:ret
  endfunction

  inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
endif

"----------------------------------------------------------
" ファイル管理
"----------------------------------------------------------
" バックアップファイルやスワップファイルを作成しない
set nowritebackup
set nobackup
set noswapfile

"----------------------------------------------------------
" 表示関係
"----------------------------------------------------------
set list " 不可視文字の可視化
set wrap " 長いテキストの折り返し
set colorcolumn=80 "80文字目にラインを入れる
" スクリーンベルの無効化
set t_vb=
set novisualbell
" 不可視文字をUnicodeで綺麗に
set listchars=tab:»-,trail:-,extends:»,precedes:«,nbsp:%,eol:"----------------------------------------------------------
" マクロおよびキー設定
"----------------------------------------------------------
inoremap jj <Esc> " 入力モード中に素早くjjと入力した場合はESCとみなす
" 検索語にジャンプした検索単語を画面中央に持ってくる
nnoremap n nzz
nnoremap N Nzz
nnoremap * *zz
nnoremap # #zz
nnoremap g* g*zz
nnoremap g# g#zz
vnoremap v $h " vを二回で行末まで選択
" TABで対応ペアにジャンプ
nnoremap <Tab> %
vnoremap <Tab> %
" Shift + 矢印でウィンドウサイズを変更
"nnoremap <S-Left> <C-w><<CR>
"nnoremap <S-Right> <C-w>><CR>
"nnoremap <S-Up> <C-w>-<CR>
"nnoremap <S-Down> <C-w>+<CR>
" 矢印2回押しで行頭・行末へ移動
inoremap <Left><Left> <Esc>_i
inoremap <Right><Right> <Esc>$i<Right>
" カーソル位置の記憶
augroup vimrcEx
  autocmd!
  autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line('$') |
    \   exe "normal! g`\"" |
    \ endif
augroup END

"----------------------------------------------------------
" neocomplete・neosnippetの設定
"----------------------------------------------------------
if neobundle#is_installed('neocomplete.vim')
  " Vim起動時にneocompleteを有効にする
  let g:neocomplete#enable_at_startup = 1
  " smartcase有効化. 大文字が入力されるまで大文字小文字の区別を無視する
  let g:neocomplete#enable_smart_case = 1
  " 3文字以上の単語に対して補完を有効にする
  let g:neocomplete#min_keyword_length = 3
  " 区切り文字まで補完する
  let g:neocomplete#enable_auto_delimiter = 1
  " 1文字目の入力から補完のポップアップを表示
  let g:neocomplete#auto_completion_start_length = 1
  " バックスペースで補完のポップアップを閉じる
  inoremap <expr><BS> neocomplete#smart_close_popup()."<C-h>"

  " エンターキーで補完候補の確定. スニペットの展開もエンターキーで確定
  imap <expr><CR> neosnippet#expandable() ? "<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "<C-y>" : "<CR>"
  " タブキーで補完候補の選択. スニペット内のジャンプもタブキーでジャンプ
  imap <expr><TAB> pumvisible() ? "<C-n>" : neosnippet#jumpable() ? "<Plug>(neosnippet_expand_or_jump)" : "<TAB>"
endif

"----------------------------------------------------------
" Syntastic
"----------------------------------------------------------
" 構文エラー行に「>>」を表示
let g:syntastic_enable_signs = 1
" 他のVimプラグインと競合するのを防ぐ
let g:syntastic_always_populate_loc_list = 1
" 構文エラーリストを非表示
let g:syntastic_auto_loc_list = 0
" ファイルを開いた時に構文エラーチェックを実行する
let g:syntastic_check_on_open = 1
" 「:wq」で終了する時も構文エラーチェックする
let g:syntastic_check_on_wq = 1

" Javascript用. 構文エラーチェックにESLintを使用
let g:syntastic_javascript_checkers=['eslint']
" Python用. 構文エラーチェックにpep8とpyflakesを使用
let g:syntastic_python_checkers=['pep8', 'pyflakes']
" Javascript以外は構文エラーチェックをしない
let g:syntastic_mode_map = { 'mode': 'passive',
                           \ 'active_filetypes': ['javascript', 'python'],
                           \ 'passive_filetypes': [] }

"----------------------------------------------------------
" CtrlP
"----------------------------------------------------------
let g:ctrlp_match_window = 'order:ttb,min:20,max:20,results:100' " マッチウインドウの設定. 「下部に表示, 大きさ20行で固定, 検索結果100件」
let g:ctrlp_show_hidden = 1 " .(ドット)から始まるファイルも検索対象にする
let g:ctrlp_types = ['fil'] "ファイル検索のみ使用
let g:ctrlp_extensions = ['funky', 'commandline'] " CtrlPの拡張として「funky」と「commandline」を使用

" CtrlPCommandLineの有効化
command! CtrlPCommandLine call ctrlp#init(ctrlp#commandline#id())

" CtrlPFunkyの絞り込み検索設定
let g:ctrlp_funky_matchtype = 'path'

if executable('ag')
  let g:ctrlp_use_caching=0 " CtrlPのキャッシュを使わない
  let g:ctrlp_user_command='ag %s -i --hidden -g ""' " 「ag」の検索設定
endif

"----------------------------------------------------------
" カラースキーム編集用
"----------------------------------------------------------
" ハイライトグループを知るコマンド:SyntaxInfoを実装
function! s:get_syn_id(transparent)
  let synid = synID(line("."), col("."), 1)
  if a:transparent
    return synIDtrans(synid)
  else
    return synid
  endif
endfunction
function! s:get_syn_attr(synid)
  let name = synIDattr(a:synid, "name")
  let ctermfg = synIDattr(a:synid, "fg", "cterm")
  let ctermbg = synIDattr(a:synid, "bg", "cterm")
  let guifg = synIDattr(a:synid, "fg", "gui")
  let guibg = synIDattr(a:synid, "bg", "gui")
  return {
        \ "name": name,
        \ "ctermfg": ctermfg,
        \ "ctermbg": ctermbg,
        \ "guifg": guifg,
        \ "guibg": guibg}
endfunction
function! s:get_syn_info()
  let baseSyn = s:get_syn_attr(s:get_syn_id(0))
  echo "name: " . baseSyn.name .
        \ " ctermfg: " . baseSyn.ctermfg .
        \ " ctermbg: " . baseSyn.ctermbg .
        \ " guifg: " . baseSyn.guifg .
        \ " guibg: " . baseSyn.guibg
  let linkedSyn = s:get_syn_attr(s:get_syn_id(1))
  echo "link to"
  echo "name: " . linkedSyn.name .
        \ " ctermfg: " . linkedSyn.ctermfg .
        \ " ctermbg: " . linkedSyn.ctermbg .
        \ " guifg: " . linkedSyn.guifg .
        \ " guibg: " . linkedSyn.guibg
endfunction
command! SyntaxInfo call s:get_syn_info()

##初めての方へ
初めてじゃない方はこちらまでスキップしてください。

とりあえず.vimrc を作りましょう。

$ cd
$ vi .vimrc

**「え、vimの起動コマンドってvimじゃなくてviなの?」**と思うかもしれませんが、少なくとも現在ではどちらも同じコマンドと見なしていいでしょう。

とりあえずこれでvimで.vimrcを開いた状態になってると思います。
vimは慣れないとなかなか難しいと思うので、とりあえず初歩中の初歩な基礎理解とコマンドだけ紹介します。

基礎理解

vimにはいくつかモードがあります。

  • ノーマルモード(コマンド入力)
  • インサートモード(テキスト編集)
  • ビジュアルモード(範囲選択)

ノーマルモードはvimでコマンドを入力したりするモードです。
vimでファイルを開いた時はこのモードになります。
他のモードの時はEscを押すとこのモードになります。
インサートモードは文章やコード自体を書き換えるためのモードです。
ノーマルモードでioなどと入力するとこのモードになりテキストを編集できるようになります。
ビジュアルモードは範囲選択をするモードです。
ノーマルモードでvなどと入力するとこのモードになります。
最初はあまり使わないかもしれません。

コマンド

とりあえず本記事では次のコマンドだけ頭に入れていればOKだと思います。
足りなければ随時ググってください。

ノーマルモードでのコマンド

1 2
i インサートモードに変更
:w 保存
:q vimを終了する
:wq 保存してvimを終了する
dd 1行削除
yy 1行コピー
p 貼り付け(vim内からvim内へのみ)

その他のモードでのコマンド

1 2
Esc ノーマルモードに戻る

最初の設定

.vimrcの先頭には次のスクリプトを書きましょう。
日本語を有効化するためのスクリプトです。

.vimrc
set encoding=utf-8
scriptencoding utf-8

.vimrcを初めて書く場合はとりあえずここまで書いてEscを押してノーマルモードにし、:wqで保存して閉じましょう。
改めて開き直せば日本語が有効になります。

クリップボード経由のコピペ有効化

コピペで全部済ませたい人はここまでは手動でやってからにしましょう。
普通にコピペするとめんどくさいことになるはずです。
やっちゃった場合、修正が面倒ならノーマルモードで:q!と入力して保存せず閉じましょう。

コピペ有効化
.vimrc
"----------------------------------------------------------
" クリップボードからのペースト
"----------------------------------------------------------
" 挿入モードでクリップボードからペーストする時に自動でインデントさせないようにする
if &term =~ "xterm"
  let &t_SI .= "\e[?2004h"
  let &t_EI .= "\e[?2004l"
  let &pastetoggle = "\e[201~"

  function XTermPasteBegin(ret)
    set paste
    return a:ret
  endfunction

  inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
endif

これでクリップボードからコピペできるようになります。
つまりインターネットのサイトとかから文章などをコピーしてvimで開いてるファイルにペーストできるようになります。便利!

プラグイン管理のNeoBundle

NeoBundleはもうずいぶん前に開発終了が宣言されてるみたいですね。
開発者はdeinをオススメしているようです。
希望者はここなどを参考に書き換えてください。
ぼくもそのうち気が向いたら移行するかもしれないのでその時はまた記事を書くかも...

NeoBundle
.vimrc
"----------------------------------------------------------
" NeoBundle
"----------------------------------------------------------
if has('vim_starting')
  " 初回起動時のみruntimepathにNeoBundleのパスを指定する
  set runtimepath+=~/.vim/bundle/neobundle.vim/

  " NeoBundleが未インストールであればgit cloneする
  if !isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
    echo "install NeoBundle..."
    :call system("git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim")
  endif
endif

call neobundle#begin(expand('~/.vim/bundle/'))

" インストールするVimプラグインを以下に記述
" NeoBundle自身を管理
NeoBundleFetch 'Shougo/neobundle.vim'
" カラースキーム
"NeoBundle 'tomasr/molokai'
"NeoBundle 'flrnd/plastic.vim'
"NeoBundle 'sainnhe/edge'
NeoBundle 'cocopon/iceberg.vim'
"NeoBundle 'kuroitu/pyceberg.vim'
" 花文字
"NeoBundle 'sainnhe/icursive-nerd-font'
" カラースキームを調べる
NeoBundle 'guns/xterm-color-table.vim'
" ステータスラインの表示内容強化
NeoBundle 'itchyny/lightline.vim'
" インデントの可視化
NeoBundle 'Yggdroot/indentLine'
" 末尾の全角半角空白文字を赤くハイライト
NeoBundle 'bronson/vim-trailing-whitespace'
" 構文エラーチェック
NeoBundle 'scrooloose/syntastic'
" 多機能セレクタ
NeoBundle 'ctrlpvim/ctrlp.vim'
" CtrlPの拡張プラグイン. 関数検索
NeoBundle 'tacahiroy/ctrlp-funky'
" CtrlPの拡張プラグイン. コマンド履歴検索
NeoBundle 'suy/vim-ctrlp-commandline'
" CtrlPの検索にagを使う
NeoBundle 'rking/ag.vim'
" プロジェクトに入ってるESLintを読み込む
NeoBundle 'pmsorhaindo/syntastic-local-eslint.vim'
" pythonコード補完
NeoBundle 'davidhalter/jedi-vim'
NeoBundle 'ervandew/supertab'
autocmd FileType python setlocal completeopt-=preview
let g:SuperTabContextDefaultCompletionType = "context"
let g:SuperTabDefaultCompletionType = "<c-n>"
"let g:jedi#rename_command = "<c-r>"
let g:jedi#force_py_version="3"
" 括弧補完
NeoBundle 'cohama/lexima.vim'

" vimのlua機能が使える時だけ以下のVimプラグインをインストールする
if has('lua')
  " コードの自動補完
  NeoBundle 'Shougo/neocomplete.vim'
  " スニペットの補完機能
  NeoBundle "Shougo/neosnippet"

  " スニペット集
  NeoBundle 'Shougo/neosnippet-snippets'
endif

call neobundle#end()

" ファイルタイプ別のVimプラグイン/インデントを有効にする
filetype plugin indent on

" 未インストールのVimプラグインがある場合、インストールするかどうかを尋ねてくれるようにする設定
NeoBundleCheck

各プラグインの説明は大体ここにウルトラ丁寧な説明が乗っていますので省略しながら説明します。

NeoBundle本体関係

NeoBundle本体に関係するところを抜き出します。
それぞれの動作はコメントにある通りですね。

本体関係
.vimrc
if has('vim_starting')
  " 初回起動時のみruntimepathにNeoBundleのパスを指定する
  set runtimepath+=~/.vim/bundle/neobundle.vim/

  " NeoBundleが未インストールであればgit cloneする
  if !isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
    echo "install NeoBundle..."
    :call system("git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim")
  endif
endif

call neobundle#begin(expand('~/.vim/bundle/'))

" インストールするVimプラグインを以下に記述
" NeoBundle自身を管理
NeoBundleFetch 'Shougo/neobundle.vim'

...

call neobundle#end()

" ファイルタイプ別のVimプラグイン/インデントを有効にする
filetype plugin indent on

" 未インストールのVimプラグインがある場合、インストールするかどうかを尋ねてくれるようにする設定
NeoBundleCheck

カラースキーム

カラースキームは個人的に試したものの残骸がコメントアウトされています...
molokaiは有名ですね。
ただ、個人的にはicebergが気に入りました。
また、これをぼくにとって見やすいように少しだけカスタマイズしたpycebergも後ほど紹介させていただきます~~(ダイマ)~~。

.vimrc
" カラースキーム
"NeoBundle 'tomasr/molokai'
"NeoBundle 'flrnd/plastic.vim'
"NeoBundle 'sainnhe/edge'
NeoBundle 'cocopon/iceberg.vim'

有効化の方法はまた後ほど紹介します。

花文字

花文字はなぜか使えませんでした。
かっこいいから使いたかった。
色々調べたのですが、文字列の背景がハイライトされるだけでした...
どなたか情報あれば教えてください泣

.vimrc
" 花文字
"NeoBundle 'sainnhe/icursive-nerd-font'

カラースキームを調べる

詳しくはこちら
使用できるカラーとかが一覧として表示できるコマンド:XtermColorTableが使えるようになります。
カラースキームの色調整に大いに役立ちます。

.vimrc
" カラースキームを調べる
NeoBundle 'guns/xterm-color-table.vim'

ステータスラインの表示内容強化

詳しくはこちら
まあ要するに表示される情報が増えるのでありがたいってことです。

.vimrc
" ステータスラインの表示内容強化
NeoBundle 'itchyny/lightline.vim'

ステータスラインを有効にする必要がありますのでここを参考にしてください。

インデント可視化

そのままです。インデントが見えるようになります。
どんな言語でもインデントラインは重要ですよね〜。

.vimrc
" インデントの可視化
NeoBundle 'Yggdroot/indentLine'

不要なスペースをハイライト

コードに紛れる空白文字を赤のハイライトで見えるようにします。
スペースあるせいでコンパイルできない!なんてこともあるので大変ありがたいですね。
さらにさらに、なんと:FixWhitespaceというコマンドでハイライトされた不要なスペースを一括削除できたりもします!
まあこれに頼りすぎず、普段から丁寧なコーディングをしましょう。

.vimrc
" 末尾の全角半角空白文字を赤くハイライト
NeoBundle 'bronson/vim-trailing-whitespace'

構文エラーチェック

動作はこちらを見たらわかります。
文法の間違いがあれば教えてくれる感じですね。

.vimrc
" 構文エラーチェック
NeoBundle 'scrooloose/syntastic'
" プロジェクトに入ってるESLintを読み込む
NeoBundle 'pmsorhaindo/syntastic-local-eslint.vim'

単体ではPythonの構文チェックしてくれないのでここを見てください。

多機能セレクタ

ファイルの検索とかバッファの検索とかしてくれるプラグインですね。特に使ってない気がする...
まだまだ修行が足りないということなんでしょうか...

.vimrc
" 多機能セレクタ
NeoBundle 'ctrlpvim/ctrlp.vim'
" CtrlPの拡張プラグイン. 関数検索
NeoBundle 'tacahiroy/ctrlp-funky'
" CtrlPの拡張プラグイン. コマンド履歴検索
NeoBundle 'suy/vim-ctrlp-commandline'
" CtrlPの検索にagを使う
NeoBundle 'rking/ag.vim'

これに関連するCtrlPの設定はこちら

コード補完

コーディングの味方、コード補完ですね。
そういえばneocompleteとか別になくてもjedi-vim使ってるしいいのではないかと思ったけど、別にあっても困ってないから置いています。
そのうち整理するかも。

コード補完
.vimrc
" pythonコード補完
NeoBundle 'davidhalter/jedi-vim'
NeoBundle 'ervandew/supertab'
autocmd FileType python setlocal completeopt-=preview
let g:SuperTabContextDefaultCompletionType = "context"
let g:SuperTabDefaultCompletionType = "<c-n>"
"let g:jedi#rename_command = "<c-r>"
let g:jedi#force_py_version="3"

" vimのlua機能が使える時だけ以下のVimプラグインをインストールする
if has('lua')
  " コードの自動補完
  NeoBundle 'Shougo/neocomplete.vim'
  " スニペットの補完機能
  NeoBundle "Shougo/neosnippet"
  " スニペット集
  NeoBundle 'Shougo/neosnippet-snippets'
endif

neocompleteの設定はここ

括弧補完

開き括弧を入力した際に閉じ括弧を一緒に入力してくれたり、開き括弧を消した場合隣接する閉じ括弧も消してくれるなど、jupyter notebookなどのエディタによくある地味に便利な括弧補完ももちろんVimでもできます。
GitHubリポジトリではもう少しいろいろ書いてありますが、まあ使いたい人はそちらで確認してください。
基本的にインストールすればそのまま使えます。カスタマイズしたい場合はREADME.mdなどを確認してください。

.vimrc
" 括弧補完
NeoBundle 'cohama/lexima.vim'

個人的には括弧内の改行ルールはあまり使わないのでオフにしています。

カラースキームの有効化

カラースキームの有効化です。
例の如くコメントアウトしてる部分は残骸です。
好きなやつを使ってください。

カラースキーム設定集
.vimrc
"----------------------------------------------------------
" カラースキーム
"----------------------------------------------------------
" カラースキームにmolokaiを設定する
"if neobundle#is_installed('molokai')
"  colorscheme molokai
"endif
"colorscheme murphy
" plasticに設定
"if neobundle#is_installed('plastic')
"  colorscheme plastic
"endif
" neonに設定
"if neobundle#is_installed('edge')
"  set termguicolors
"  set background=dark
"  let g:edge_style = 'neon'
"  let g:edge_disable_italic_comment = 1
"  let g:edge_enable_italic = 0
"  colorscheme edge
"endif
" icebergに設定
if neobundle#is_installed('iceberg.vim')
  colorscheme iceberg
endif

set t_Co=256 " iTerm2など既に256色環境なら無くても良い
syntax enable " 構文に色を付ける

pycebergもぜひ見てみてください!!(ダイマ2回目)
導入などの紹介はこちら

文字コードの設定

文字コードに関する設定集です。

.vimrc
"----------------------------------------------------------
" 文字
"----------------------------------------------------------
set fileencoding=utf-8 " 保存時の文字コード
set fileencodings=ucs-boms,utf-8,euc-jp,cp932 " 読み込み時の文字コードの自動判別. 左側が優先される
set fileformats=unix,dos,mac " 改行コードの自動判別. 左側が優先される
set ambiwidth=double " □や○文字が崩れる問題を解決

ステータスラインの有効化

ステータスライン(vimエディタの下部)を有効にします。

"----------------------------------------------------------
" ステータスライン
"----------------------------------------------------------
set laststatus=2 " ステータスラインを常に表示
set showmode " 現在のモードを表示
set showcmd " 打ったコマンドをステータスラインの下に表示
set ruler " ステータスラインの右側にカーソルの位置を表示する

コマンドモードの設定

ノーマルモードでコマンドを色々打ちますが、それをアシストしてくれる機能です。
コマンド履歴はもっと少なくても多分何も困らないでしょう。

.vimrc
"----------------------------------------------------------
" コマンドモード
"----------------------------------------------------------
set wildmenu " コマンドモードの補完
set history=5000 " 保存するコマンド履歴の数

タブやインデントの設定

タブやインデント、読みやすいコードを書く上では超重要ですね。
個人的にインデント幅が大きすぎると見にくいと感じるので2にしていますが、なぜかPythonコードを書いてる時は勝手に4になってしまいます。
まあPythonは暗黙の了解でインデント幅は4みたいな風潮があるのでいいですが。
インデントとか可視化されますしね。

.vimrc
"----------------------------------------------------------
" タブ・インデント
"----------------------------------------------------------
set expandtab " タブ入力を複数の空白入力に置き換える
set tabstop=2 " 画面上でタブ文字が占める幅
set softtabstop=2 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent " 改行時に前の行のインデントを継続する
set smartindent " 改行時に前の行の構文をチェックし次の行のインデントを増減する
set shiftwidth=2 " smartindentで増減する幅

文字列検索

こちらも重要設定ですね。
文字列検索が便利になります。

.vimrc
"----------------------------------------------------------
" 文字列検索
"----------------------------------------------------------
set incsearch " インクリメンタルサーチ. 1文字入力毎に検索を行う
set ignorecase " 検索パターンに大文字小文字を区別しない
set smartcase " 検索パターンに大文字を含んでいたら大文字小文字を区別する
set hlsearch " 検索結果をハイライト

" ESCキー2度押しでハイライトの切り替え
nnoremap <silent><Esc><Esc> :<C-u>set nohlsearch!<CR>

ちなみに文字列検索は/(検索したい文字列)
文字列置換は:%s/(置換対象の文字列)/(置換後の文字列)が基本です。

カーソル移動など

vimではノーマルモードならh, j, k, lでそれぞれ左 下 上 右と移動できますが、こういったコマンドでの移動の際、長いコードを書いたために1行が折り返して表示されていると、例えばjで移動すると見た目での1行下ではなく、次の行にカーソルが移動してしまったりします。
ここではそれを解消したり、カーソルラインをハイライトしたりの設定をしています。

カーソル関連
/.vimrc
"----------------------------------------------------------
" カーソル
"----------------------------------------------------------
set whichwrap=b,s,h,l,<,>,[,],~ " カーソルの左右移動で行末から次の行の行頭への移動が可能になる
set number " 行番号を表示
set cursorline " カーソルラインをハイライト

" 行が折り返し表示されていた場合、行単位ではなく表示行単位でカーソルを移動する
nnoremap j gj
nnoremap k gk
nnoremap <down> gj
nnoremap <up> gk

" バックスペースキーの有効化
set backspace=indent,eol,start

括弧やタグの対応

コーディング中に対応する括弧が一瞬光ります。
括弧をたくさん書くときに便利です。

.vimrc
"----------------------------------------------------------
" カッコ・タグの対応
"----------------------------------------------------------
set showmatch " 括弧の対応関係を一瞬表示する
set matchtime=3
set matchpairs& matchpairs+=<:>
source $VIMRUNTIME/macros/matchit.vim " Vimの「%」を拡張する
let g:lexima_enable_newline_rules=0   " 括弧の改行ルールを無効にする

マウス有効化

なんと初期設定のvimではマウスが使えません。
トラックパッドも使えません。
ということで設定しましょう。

マウス有効化
.vimrc
"----------------------------------------------------------
" マウスでカーソル移動とスクロール
"----------------------------------------------------------
if has('mouse')
  set mouse=a
  if has('mouse_sgr')
    set ttymouse=sgr
  elseif v:version > 703 || v:version is 703 && has('patch632')
    set ttymouse=sgr
  else
    set ttymouse=xterm2
  endif
endif

ファイル管理

vimでファイルを編集すると自動でバックアップファイルやスワップファイルを作成するのですが、別に不要なのでオフにしておきます。
(ファイルのバックアップとかが必要ならそもそもgitとか使った方がいいと思ってます)

.vimrc
"----------------------------------------------------------
" ファイル管理
"----------------------------------------------------------
" バックアップファイルやスワップファイルを作成しない
set nowritebackup
set nobackup
set noswapfile

表示関係

空白とか改行とかタブとかを可視化します。
あと一文が長くなったら折り返します。

表示関係設定
.vimrc
"----------------------------------------------------------
" 表示関係
"----------------------------------------------------------
set list " 不可視文字の可視化
set wrap " 長いテキストの折り返し
set colorcolumn=100 "100文字目にラインを入れる
" スクリーンベルの無効化
set t_vb=
set novisualbell
" 不可視文字をUnicodeで綺麗に
set listchars=tab:»-,trail:-,extends:»,precedes:«,nbsp:%,eol:

マクロとキー設定

ここではデフォルトのキーバインドを直感的に使えるようにオーバーライドしたり新しく設定したりしています。
お好みで追加したり削除したりしてくださいね。

  • nnoremapはノーマルモードでのキー設定
  • inoremapはインサートモードでのキー設定
  • vnoremapはビジュアルモードでのキー設定
  • <S>Shiftキー
  • <C>Ctrlキー
マクロとキー設定集
.vimrc
"----------------------------------------------------------
" マクロおよびキー設定
"----------------------------------------------------------
inoremap jj <Esc> " 入力モード中に素早くjjと入力した場合はESCとみなす
" 検索語にジャンプした検索単語を画面中央に持ってくる
nnoremap n nzz
nnoremap N Nzz
nnoremap * *zz
nnoremap # #zz
nnoremap g* g*zz
nnoremap g# g#zz
vnoremap v $h " vを二回で行末まで選択
" TABで対応ペアにジャンプ
nnoremap <Tab> %
vnoremap <Tab> %
" Shift + 矢印でウィンドウサイズを変更
"nnoremap <S-Left> <C-w><<CR>
"nnoremap <S-Right> <C-w>><CR>
"nnoremap <S-Up> <C-w>-<CR>
"nnoremap <S-Down> <C-w>+<CR>
" 矢印2回押しで行頭・行末へ移動
inoremap <Left><Left> <Esc>_i
inoremap <Right><Right> <Esc>$i<Right>
" カーソル位置の記憶
augroup vimrcEx
  autocmd!
  autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line('$') |
    \   exe "normal! g`\"" |
    \ endif
augroup END

neocompleteの設定

neocompleteの設定と、neosnippetの設定です。
他にも色々オプションあるみたいですが、大体下記で事足りるのではないでしょうか。
詳しくは

をご覧ください。

コード補完設定
.vimrc
"----------------------------------------------------------
" neocomplete・neosnippetの設定
"----------------------------------------------------------
if neobundle#is_installed('neocomplete.vim')
  " Vim起動時にneocompleteを有効にする
  let g:neocomplete#enable_at_startup = 1
  " smartcase有効化. 大文字が入力されるまで大文字小文字の区別を無視する
  let g:neocomplete#enable_smart_case = 1
  " 3文字以上の単語に対して補完を有効にする
  let g:neocomplete#min_keyword_length = 3
  " 区切り文字まで補完する
  let g:neocomplete#enable_auto_delimiter = 1
  " 1文字目の入力から補完のポップアップを表示
  let g:neocomplete#auto_completion_start_length = 1
  " バックスペースで補完のポップアップを閉じる
  inoremap <expr><BS> neocomplete#smart_close_popup()."<C-h>"

  " エンターキーで補完候補の確定. スニペットの展開もエンターキーで確定
  imap <expr><CR> neosnippet#expandable() ? "<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "<C-y>" : "<CR>"
  " タブキーで補完候補の選択. スニペット内のジャンプもタブキーでジャンプ
  imap <expr><TAB> pumvisible() ? "<C-n>" : neosnippet#jumpable() ? "<Plug>(neosnippet_expand_or_jump)" : "<TAB>"
endif

Syntasticの設定

構文チェック機能の設定集ですね。
ただ、なぜかぼくの環境では動いていないっぽい...?
どこか間違ってそうです...

`Syntastic`の設定
.vimrc
"----------------------------------------------------------
" Syntastic
"----------------------------------------------------------
" 構文エラー行に「>>」を表示
let g:syntastic_enable_signs = 1
" 他のVimプラグインと競合するのを防ぐ
let g:syntastic_always_populate_loc_list = 1
" 構文エラーリストを非表示
let g:syntastic_auto_loc_list = 0
" ファイルを開いた時に構文エラーチェックを実行する
let g:syntastic_check_on_open = 1
" 「:wq」で終了する時も構文エラーチェックする
let g:syntastic_check_on_wq = 1

" Javascript用. 構文エラーチェックにESLintを使用
let g:syntastic_javascript_checkers=['eslint']
" Python用. 構文エラーチェックにpep8とpyflakesを使用
let g:syntastic_python_checkers=['pep8', 'pyflakes']
" Javascript, python以外は構文エラーチェックをしない
let g:syntastic_mode_map = { 'mode': 'passive',
                           \ 'active_filetypes': ['javascript', 'python'],
                           \ 'passive_filetypes': [] }

ちなみにpep8pyflakes

$ pip install pep8 pyflakes

でインストールできます。
詳しくはこちら

CtrlPの設定

多機能セレクタプラグインの設定です。
ファイル検出の設定とかをしています。

CtrlPの設定
.vimrc
"----------------------------------------------------------
" CtrlP
"----------------------------------------------------------
let g:ctrlp_match_window = 'order:ttb,min:20,max:20,results:100' " マッチウインドウの設定. 「下部に表示, 大きさ20行で固定, 検索結果100件」
let g:ctrlp_show_hidden = 1 " .(ドット)から始まるファイルも検索対象にする
let g:ctrlp_types = ['fil'] "ファイル検索のみ使用
let g:ctrlp_extensions = ['funky', 'commandline'] " CtrlPの拡張として「funky」と「commandline」を使用

" CtrlPCommandLineの有効化
command! CtrlPCommandLine call ctrlp#init(ctrlp#commandline#id())

" CtrlPFunkyの絞り込み検索設定
let g:ctrlp_funky_matchtype = 'path'

if executable('ag')
  let g:ctrlp_use_caching=0 " CtrlPのキャッシュを使わない
  let g:ctrlp_user_command='ag %s -i --hidden -g ""' " 「ag」の検索設定
endif

カラースキーム編集用

カラースキーム編集時に、今カーソルを合わせているコードのシンタックスグループなどを教えてくれる便利コマンドです。

`:SyntaxInfo`コマンドを使えるようにする
.vimrc
"----------------------------------------------------------
" カラースキーム編集用
"----------------------------------------------------------
" ハイライトグループを知るコマンド:SyntaxInfoを実装
function! s:get_syn_id(transparent)
  let synid = synID(line("."), col("."), 1)
  if a:transparent
    return synIDtrans(synid)
  else
    return synid
  endif
endfunction
function! s:get_syn_attr(synid)
  let name = synIDattr(a:synid, "name")
  let ctermfg = synIDattr(a:synid, "fg", "cterm")
  let ctermbg = synIDattr(a:synid, "bg", "cterm")
  let guifg = synIDattr(a:synid, "fg", "gui")
  let guibg = synIDattr(a:synid, "bg", "gui")
  return {
        \ "name": name,
        \ "ctermfg": ctermfg,
        \ "ctermbg": ctermbg,
        \ "guifg": guifg,
        \ "guibg": guibg}
endfunction
function! s:get_syn_info()
  let baseSyn = s:get_syn_attr(s:get_syn_id(0))
  echo "name: " . baseSyn.name .
        \ " ctermfg: " . baseSyn.ctermfg .
        \ " ctermbg: " . baseSyn.ctermbg .
        \ " guifg: " . baseSyn.guifg .
        \ " guibg: " . baseSyn.guibg
  let linkedSyn = s:get_syn_attr(s:get_syn_id(1))
  echo "link to"
  echo "name: " . linkedSyn.name .
        \ " ctermfg: " . linkedSyn.ctermfg .
        \ " ctermbg: " . linkedSyn.ctermbg .
        \ " guifg: " . linkedSyn.guifg .
        \ " guibg: " . linkedSyn.guibg
endfunction
command! SyntaxInfo call s:get_syn_info()

SyntaxInfo.gif

カラースキームの編集

ぼくはここなどを参考にしました。
vimでコーディングする上でカラースキームって意外と大切だったりします。
明るい色ばかり使っていたら目が疲れますし、全部同じ色だとスペルミスに気づけなかったり、とにかくコーディング効率が悪くなります。
いろんなサイトで「カラースキームといえばこれ!」とか紹介されているのを見たり、既存のカラースキームを探せるサイトとかで自分なりに良さげなのを探してきたりしても、どうにも微妙に納得がいかなかったりしませんか?
ということで、すごく簡単にですがカラースキームの編集方法について説明します。

まずは元となるカラースキームを見つけよう

一から自分専用のカラースキームを作るのは心が折れると思いますのでやめときましょう。
今自分の中で一番気に入っているカラースキームを少しずつ編集するだけで十分なものに仕上げることができます。
ぼくはicebergが気に入ったのでこれをもとに少しだけ編集しました。

どの部分が気に入らない?

元となるカラースキームを決めたら、どの部分の色が気に入らないか調べましょう。
先に紹介した:SyntaxInfoでハイライトグループを知ることができますので、それを元に編集します。
以下では例としてPythonStringグループの色を変更します。
PythonString.gif

このPythonコードは開きっぱなしで!

カラースキームを開く

カラースキームはNeoBundleで管理していれば

~/.vim/bundle/

の中にあると思います。
今回はicebergを編集するので

$ vi ~/.vim/bundle/iceberg.vim/colors/iceberg.vim

でカラースキームを開きます。

対象のシンタックスグループを検索

vimの文字列検索/pythonstringとして定義を見てみましょう。
search_PythonString.gif
ないですね、はい。
ということは自分で書くしかないわけですね。
どこに書き足してもいいですが、わかりやすいところにしましょう。
今回はカラースキームの色を直接定義している部分の一番最後にします。
define_last.png

書いてみる

書き方は真似すればOK。
何色がある?っていうのはここで紹介した:XtermColorTableを参考にしましょう。
今回はctermfg=40,guifg=#00df00を使います。
guifgの16進数はビジュアルモードで範囲選択すれば見えますよ〜
colortable.png
write_pythonstring.png
書けたらとりあえず**:wで保存するだけ保存しましょう。**
まだ閉じないように!

確認する

ではPythonのコード画面に移りましょう。
:syntax onと入力すれば新しいカラーが反映されるはずです。
reflect.gif
派手すぎますね〜やっぱりやめときましょうこの色、とかなったり、微妙に思った色と違ったりするかもしれないので、また書いてみるに戻って編集し直して確認して〜の繰り返しです。

以上でカラースキームの編集方法の説明は終了です!

シンタックスファイル

さて、カラースキーム編集したしバッチリ!と思ってるそこのあなた、もう一つ大事な要素を忘れてますよ!
それはシンタックスファイルの存在です。
シンタックスファイルとは、そのまま文法をまとめたファイルのことです。
vimでPython書くならこれを入れておくべきでしょう。
ここにPythonのシンタックスファイルがありますが、これでは(なぜか)クラスのメソッドなどのアトリビュート(hoge.foofoo)の色を変えられなかったりします。
ということでぼくがちょっぴり修正したここpython.vimREADME.mdに従って

~/.vim/syntax/

に入れましょう。
そうすればアトリビュートも色を変えられるはずです!

f-stringに対応する

最近Pythonのf-stringを書くことが多くなってきて、文字列と同じ色は見辛いなぁと思っていたところ、いいものを発見しました。コピペすればOKなシンタックス構文です。
やっている内容の詳細はしっかりここに書いてますが、一応覚書として日本語で解説しておきます。

最初の2行でpythonStringpythonDocstringなどにエスケープシーケンスを定義しています。
次の部分でf-stringについてのシンタックスが定義されています。fから始まる文字列をpythonfStringなどのregionとしています。{}で囲まれている部分のハイライトを変更する感じですね。
あとは正規表現でf-stringの構文内をそれぞれのカラースキームに合わせてハイライトされるように指定しています。
最後にハイライトリンクを設定して完了です。

pyceberg

最後に、本記事を通してダイマしまくったpycebergを宣伝させてもらいます笑
基本はicebergで、少しぼく好みに色を変更したりしたくらいです。
もしよかったら使ってやってください。

導入方法はREADME.mdに書いてあります。
1番簡単なのは.vimrc

.vimrc
NeoBundle ‘kuroitu/pyceberg’
colorscheme pyceberg

とやるやり方ですかね〜

こんな感じになります↓ (画像はnumpyのコードより)
screenshot1.png screenshot2.png

おわりに

すごく長い記事になりました...
まあ何かの参考にでもなれば幸いです。

参考

53
69
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
69