個人設定込みNeovimのDockerイメージを作成した。
ビルド用のスクリプトをGithubにアップロードして、Docker HubにAutomated Buildを設定した。
動作環境
以下の環境で使用している。
- MacBook'12 2017 core-m3
- macOS High Sierra
- Docker for Mac
使い方
# ビルド
git clone https://github.com/succi0303/my-neovim-dockerized.git
cd my-neovim-dockerized
docker build -t nvim .# 実行
docker run -it--rm-v$(pwd):/usr/src/nvim nvim [filename]
または
docker pull succi0303/neovim
docker run -it--rm-v$(pwd):/usr/src/nvim succi0303/neovim [filename]
毎回、docker run
を打ち込むのは面倒なので、シェルのrcファイルでnvim
のエイリアスに上記コマンドを設定する。
内容
2018年5月時点の内容。Githubのファイルは随時アップデートしていく。
Dockerfile
FROM ubuntu:latestLABEL maintainer="succi0303@gmail.com"RUN apt-get update -y&&\
apt-get install-y software-properties-common &&\
apt-add-repository -y ppa:neovim-ppa/stable &&\
apt-get update -y&&\
apt-get install-y\
curl \
git \
language-pack-ja-base \
language-pack-ja \
neovim \
python-dev \
python-pip \
python3-dev \
python3-pip
ENV LANG="ja_JP.UTF-8" LANGUAGE="ja_JP:ja" LC_ALL="ja_JP.UTF-8"RUN pip3 install--upgrade neovim
RUN curl -fLo /root/.local/share/nvim/site/autoload/plug.vim --create-dirs\
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
COPY .config /root/.configRUN nvim +PlugInstall +qa
WORKDIR /usr/src/nvimENTRYPOINT ["nvim"]
.config/nvim/init.vim
" vim-plugcall plug#begin('~/.local/share/nvim/plugged')
Plug 'airblade/vim-gitgutter'
Plug 'cespare/vim-toml'
Plug 'cohama/vim-smartinput-endwise'
Plug 'deton/jasegment.vim'
Plug 'easymotion/vim-easymotion'
Plug 'fuenor/qfixgrep'
Plug 'fuenor/qfixhowm'
Plug 'kana/vim-smartinput'
Plug 'kana/vim-textobj-indent'
Plug 'kana/vim-textobj-user'
Plug 'kannokanno/previm'
Plug 'mattn/emmet-vim'
Plug 'nathanaelkane/vim-indent-guides'
Plug 'scrooloose/nerdtree'
Plug 'Shougo/denite.nvim',{'do':':UpdateRemotePlugins'}
Plug 'Shougo/deoplete.nvim',{'do':':UpdateRemotePlugins'}
Plug 'sjl/badwolf'
Plug 'thinca/vim-partedit'
Plug 'thinca/vim-qfreplace'
Plug 'tpope/vim-fugitive'
Plug 'tpope/vim-markdown'
Plug 'tyru/open-browser.vim'
Plug 'tpope/vim-surround'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'vim-ruby/vim-ruby'
Plug 'vim-syntastic/syntastic'call plug#end()set encoding=UTF-8set fileencoding=UTF-8set termencoding=UTF-8set backspace=indent,eol,startset hidden
set showcmd
set cursorline
setnumberset laststatus=2set showmatch
set incsearch
set display+=lastline
set wildmenu
set ignorecase
set clipboard=unnamed
set tabstop=2set shiftwidth=2set softtabstop=2set expandtab
set smarttab
set autoindent
set smartindent
augroup fileTypeIndent
autocmd!
autocmd BufNewFile,BufRead *.pysetlocal tabstop=4 softtabstop=4 shiftwidth=4
augroup END
nnoremap s <Nop>
nnoremap ss :<C-u>sp<CR>
nnoremap sv:<C-u>vs<CR>
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl<C-w>l
nnoremap sh<C-w>h
nnoremap sq :<C-u>q<CR>
nnoremap st:<C-u>tabnew<CR>
nnoremap sn gt
nnoremap sp gT
nnoremap sQ :<C-u>tabclose<CR>
nnoremap <silent>[b:bprevious<CR>
nnoremap <silent>]b:bnext<CR>
nnoremap <silent>[B :bfirst<CR>
nnoremap <silent>]B :blast<CR>
nnoremap <ESC><ESC>:nohlsearch<CR>set wildmode=list,full
set grepformat=%f:%l:%m,%f:%l%m,%f\ \ %l%m,%fset grepprg=grep\ -nh
colorscheme badwolf
set termguicolors
syntax on" denite.vim
nnoremap <silent>,b:Denite buffer<CR>
nnoremap <silent>,c:Denite changes<CR>
nnoremap <silent>,f:Denite file<CR>
nnoremap <silent>,g:Denite grep<CR>
nnoremap <silent>,h:Denite help<CR>
nnoremap <silent>,l:Denite line<CR>
nnoremap <silent>,t:Denite tag<CR>call denite#custom#map('insert','<esc>','<denite:enter_mode:normal>','noremap')call denite#custom#map('normal','<esc>','<denite:quit>','noremap')call denite#custom#map('insert','<C-n>','<denite:move_to_next_line>','noremap')call denite#custom#map('insert','<C-p>','<denite:move_to_previous_line>','noremap')call denite#custom#map('insert','<C-j>','<denite:do_action:split>','noremap')call denite#custom#map('insert','<C-k>','<denite:do_action:vsplit>','noremap')call denite#custom#option('default','prompt','>')call denite#custom#option('default','direction','top')" deoplete.nvimletg:deoplete#enable_at_startup =1" vim-easymothonletg:EasyMotion_startofline=0letg:EasyMotion_smartcase=1" <Leader>f{char} to move to {char}
map <Leader>f<Plug>(easymotion-bd-f)
nmap <Leader>f<Plug>(easymotion-overwin-f)" <Leader>s{char}{char} to move to {char}{char}
map <Leader>s <Plug>(easymotion-bd-f2)
nmap <Leader>s <Plug>(easymotion-overwin-f2)" Move to Line
map <Leader>L <Plug>(easymotion-bd-jk)
nmap <Leader>L <Plug>(easymotion-overwin-line)" Move to word
map <Leader>w<Plug>(easymotion-bd-w)
nmap <Leader>w<Plug>(easymotion-overwin-w)" n-character search
map / <Plug>(easymotion-sn)
omap / <Plug>(easymotion-tn)
map n<Plug>(easymotion-next)
map N <Plug>(easymotion-prev)"hjkl
map <Leader>l<Plug>(easymotion-lineforward)
map <Leader>j<Plug>(easymotion-j)
map <Leader>k<Plug>(easymotion-k)
map <Leader>n<Plug>(easymotion_linebackward)" JpFormatset formatexpr=jpfmt#formatexpr()" nerdtreeletg:NERDTreeShowHidden=1letg:NERDTreeMapActivateNode="<CR>"let file_name = expand("%:p")
nnoremap <C-e>:NERDTreeToggle<CR>" open-browserletg:netw_nogx=1
nmap gx <Plug>(openbrowser-smart-search)
vmap gx <Plug>(openbrowser-smart-search)" syntasticletg:syntastic_auto_loc_list=0" vim-airlineletg:airline#extentions#tabline#enabled =1letg:airline#extentions#tabline#show_buffers =0letg:airline#extentions#tabline#tab_nr_type =1letg:airline#extentions#tabline#fnamemod =":t"letg:airline_theme='badwolf'if!exists('g:airline_symbols')letg:airline_symbols={}endifletg:airline_symbols.branch =''letg:airline_symbols.readonly =''letg:airline_symbols.linenr =''" vim-indent-guidesletg:indent_guides_auto_colors=0
autocmd VimEnter,Colorscheme * :hi IndentGuidesOdd ctermbg=gray
autocmd VimEnter,Colorscheme * :hi IndentGuidesEven ctermbg=darkgray
letg:indent_guides_enable_on_vim_startup=1letg:indent_guides_guide_size=1" vim-partedit
vnoremap <C-l>:Partedit<CR>
noremap <C-h>:ParteditEnd<CR>" vim-smartinput-endwisecall smartinput_endwise#define_default_rules()
工夫したところ
日本語入力を有効にする
ubuntu:latest
のイメージには日本語環境が入っておらず、日本語入力が文字化けする。
apt-getでlanguage-pack-ja-base
とlanguage-pack-ja
をインストールし、環境変数にLANG="ja_JP.UTF-8"
等を設定することで日本語入力が可能になる。
プラグインマネージャにvim-plug
を使う
本当はdein.vim
を使いたかったが、docker build
でエラーが発生して使用を諦め、代わりにvim-plug
を使用した。RUN nvim +PlugInstall +qa
でプラグインインストール用のPlugInstall
コマンドを外から叩いている。
dein.vim
でもRUN nvim +"call dein#install()" +qa
でインストールコマンドの実行はできたが、コマンドがnon-zero
を返す云々でビルドが止まる。詳細な条件は特定できなかったが、どうやらプラグインの数が10件程度を越えると発生するようである。プラグインをinit.vim
に直書きするパターンとdein.toml
に分けるパターンを試してみたがどちらも同じ結果だった。
python-provider
はpip
でインストールする
ubuntuの場合、apt-get
でpython-provider
のインストールまで実行できるが、denite.vim
を動かすにはバージョンが足りなかった。RUN pip3 install --upgrade neovim
でpip
からインストールすることで解決できた。
課題事項
open-browser
コンテナ内でブラウザを開こうとするため、正常に動作しない。open-browser
が動かないため、自動的にprevim
も使えない。解決策は今のところ思いつかない。
vim-fugitive
vim-fugitive
でGitの操作を行う場合、コンテナ内のGitが利用される。できれば、ホストの設定を引き継ぎたい。コンテナからホストの.gitconfig
と.ssh
フォルダを参照させれば解決できるかも。
howm
qfixhowm
でメモの管理をしているが、コンテナ版Neovimからどうやってhowmを使うか。howmフォルダを参照するデータコンテナを作って、docker-compose
を設定することを検討中。
参考
「Docker in Action」を読みながら試行錯誤した。