iPadでVim

iPad+iVimでPython統合開発環境(IDE)を構築する方法

iPad / iPad Pro / iPhone 上で利用可能なVimアプリ iVim

‎iVim
‎iVim is a project that brings the vim editor to the iOS system. It is open source, please visit the App Support URL. Font management Besides some system and...

こちらを Python統合開発環境(IDE)として利用する方法について検討しましたので、ご紹介します。

IDE機能とVimプラグイン

IDEに求められる機能は非常に沢山ありますが、iVim ではこちらで実現することにしました。

機能VimプラグインPythonモジュール/コマンド
文法チェック
入力補完
vim-lsp
async.vim
asyncomplete.vim
asyncomplete-lsp.vim
pyls
フォーマッターvim-autopep8
vim-isort
autopep8
isort
テストフレームワークunittest
pytest
デバッガpdb
ファイラNERDTree
各種検索Unite
自動補正
補正支援
vim-better-whitespace
vim-surround
indentLine
vim-anzu
vim-commentary
vim-highlightedyank
カーソル移動支援vim-anzu
vim-easymotion
スクリプト実行vim-quickrun
テンプレート
スニペット
vim-sonictemplate
ultisnips
セッション管理vim-startify

好みや過不足があると思いますが、色んな条件を乗り越えた結果でこうなりました。

iVimのIDE化する手順

Pythonモジュール

iVim を起動した後、次の内容のファイル ~/requirements.txt を作成します。

appdirs
 attrs
 autopep8
 certifi
 chardet
 entrypoints
 filelock
 flake8
 future
 idna
 importlib-metadata
 isort
 jedi
 mccabe
 more-itertools
 packaging
 parso
 pluggy
 py
 pycodestyle
 pyflakes
 pyparsing
 pytest
 python-jsonrpc-server
 python-language-server
 requests
 six
 urllib3
 virtualenv
 wcwidth
 zipp

Exコマンドなら、こちらでインストールします。

:!pip install ~/requirements.txt

こちらのコマンド一発でインストールできるはずですが、バージョンに寄ってはエラーが出る場合があります。

その場合はバージョンを一つ下げたモジュールを個別にインストールする必要があります。

もしシェルコマンドでインストールするのであれば、:terminal コマンドでターミナル(ivish)を起動した後、次のように実行します。

pip install ~/requirements.txt

Vim プラグインのインストール

iVimの設定

~/dotfiles/vimrc を作成して、次のように記載します。

" ==============================================================================
" = iVim Settings ==============================================================
" ==============================================================================

" => General ===================================================================
set history=500

" Enable filetype plugins
filetype plugin on
filetype indent on

" => VIM user interface ========================================================
set number
set ruler
set hid
set backspace=eol,start,indent
set whichwrap+=<,>,h,l
set ignorecase
set smartcase
set hlsearch
set incsearch
set lazyredraw
set magic
set showmatch
set mat=2
set showcmd
set wrapscan
set matchtime=3
set list
set autoindent
set hidden
set ttyfast
set cursorline
set cursorcolumn
set colorcolumn=80

" No annoying sound on errors
set noerrorbells
set novisualbell
set t_vb=
set tm=500
set belloff=all
set vb t_vb=

" => Colors and Fonts ==========================================================
colorscheme molokai
set t_Co=256
set encoding=utf8
set ffs=unix,dos,mac
set fileencoding=utf-8
set fileencodings=utf-8,iso-2022-jp,euc-jp,sjis

set guifont=HackGen-Regular.ttf:h20

" => Files, backups and undo ===================================================
set noswapfile
set nobackup
set nowb

" => Text, tab and indent related ==============================================
set expandtab
set smarttab
set shiftwidth=4
set tabstop=4
set softtabstop=0
set lbr
set tw=500
set ai
set si
set wrap
set helplang=ja

" => Status line & Tab line ====================================================
set laststatus=2
set cmdheight=3
set showtabline=2
set guioptions-=e

" => Custom Key Mappings =======================================================
let mapleader = ","

"  Moving windows
nnoremap <C-j>                  <C-W>j
nnoremap <C-k>                  <C-W>k
nnoremap <C-h>                  <C-W>h
nnoremap <C-l>                  <C-W>l

" Like windows keymapping
inoremap <C-v>                  <C-r>*
inoremap <C-e>                  <End>
vnoremap <C-C>                  "+y
nnoremap <C-a>                  ggVG
nnoremap <C-e>                  <End>

" Tab control
nnoremap <C-t>                  :tabe<cr>
nnoremap <C-tab>                :tabnext<cr>
nnoremap <C-S-tab>              :tabprevious<cr>

nnoremap <silent><Leader><S-S>  :Startify<CR>
nnoremap <silent><Leader>b      :call BufferList()<CR>
nnoremap <silent><Leader>f      :MRU<CR>
nnoremap <silent><Leader>t      :vert terminal<CR>
nnoremap <silent><Leader>v      :source ~/.vimrc<CR>
nnoremap <silent><Leader>n      :NERDTree<CR>
nnoremap <silent><Leader>m      :put =execute('messages') "<CR>

" Input Back Slash (Only iVim)
inoremap ¥                      \

" => Plugin ====================================================================

" Markdown
let g:vim_markdown_folding_disabled = 1

" QuickRun
let g:quickrun_config = {}
let g:quickrun_config.python = {'command': 'python3'}

" indentLine
let g:indentLine_setColors = 0
let g:indentLine_color_term = 239

" Language Server Protocol
if executable('pyls')
    augroup vim_lsp_pyls
        autocmd!
        autocmd User lsp_setup call lsp#register_server({
            \ 'name': 'pyls',
            \ 'cmd': {server_info->['pyls']},
            \ 'whitelist': ['python'],
            \ })
        autocmd FileType python setlocal omnifunc=lsp#complete
    augroup end
endif
set completeopt+=menuone

function! s:on_lsp_buffer_enabled() abort
    setlocal omnifunc=lsp#complete
    setlocal signcolumn=yes
    nmap <buffer> gd <plug>(lsp-definition)
    nmap <buffer> <f2> <plug>(lsp-rename)
endfunction

augroup lsp_install
    au!
    autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
augroup END

" Unite
let g:unite_enable_start_insert=1
let g:unite_source_history_yank_enable =1
let g:unite_source_file_mru_limit = 200
nnoremap <silent> ,uy :<C-u>Unite history/yank<CR>
nnoremap <silent> ,ub :<C-u>Unite buffer<CR>
nnoremap <silent> ,uf :<C-u>UniteWithBufferDir -buffer-name=files file<CR>
nnoremap <silent> ,ur :<C-u>Unite -buffer-name=register register<CR>
nnoremap <silent> ,uu :<C-u>Unite ultisnips<CR>
nnoremap <silent> ,ui <Plug>(unite_insert_enter)
au FileType unite nnoremap     unite#do_action('split') " ウィンドウを分割して開く
au FileType unite inoremap     unite#do_action('split')

" Subversive
nmap <leader>s      <plug>(SubversiveSubstituteRange)
xmap <leader>s      <plug>(SubversiveSubstituteRange)
nmap <leader>ss     <plug>(SubversiveSubstituteWordRange)

" UltiSnips
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<c-b>"
let g:UltiSnipsJumpBackwardTrigger="<c-z>"
let g:UltiSnipsEditSplit="vertical"
let g:UltiSnipsSnippetDirectories=[ 'UltiSnips',expand('~/.vim/UltiSnips/')]

" => My Defined Commands =======================================================
command! -nargs=+ PlugInstall :!python3 ~/bin/pluginInstall.py <args>
command! -nargs=+ PlugRemove :!python3 ~/bin/pluginRemove.py <args>
command! -nargs=1 Opvimgrep :vimgrep /<args>/g % | cw
nnoremap <Leader>g :Opvimgrep 

"===============================================================================

そして、.vimrc は次のように記載します。

source ~/dotfiles/vimrc

iVimのディレクトリ/ファイルのうち、ドットファイルやドットディレクトリは「ファイル」アプリで扱うことができない制約があります。そのため、iVimが壊れて起動しなくなった場合に対処できるように、~/.vimrcに設定情報を直接は記載せず、~/.vim や ~/.config などの利用は最低限にした方が無難です。

正常に作業完了した後は、iVim を再起動します。このとき、サスペンド(:qで終わらせただけ)から復帰するときでも設定は全て読み込み直してくれるます。

ただし、寄付をした場合には、次の設定値になっている必要がある点は注意です。

iVim IDE

iVim環境はなかなか厳しい

iVimの問題点

悩むエンジニアの姿

そうは言っても、iVim には次の問題があって解消できないのが実情です。

  • Gitコマンドがない(使えない)
  • make / gmake ほか開発系プログラムが使えない
  • インストールできないPythonモジュールがある
  • Python / Vim script 以外の処理系が使えない

しかしながら、iPad / iPad Pro の高いモバイル性能のは魅力的です。

理想的な iPad + iVim の作業環境は?

iPadのワークステーション化

こちらの iPad / iPad Pro とキーボードとの組み合わせで利用できます。

Air や mini でも良いのですが、個人的には中途半端だなと感じていて、低コストなら iPad、高性能なら iPad Pro、携帯性なら iPhone で良いんじゃないかなと。

あと、iPadOSデバイスと標準キーボードとの組み合わせは、モバイルにも自宅利用でもスゴく快適です。

こちらの記事を見て一時期検討しましたが、iVimを利用する限りはマウス不要だし、タッチ操作で十分だと思ってます。この辺はそれぞれの好みですね。

あと、個人的には次の組み合わせがオススメです。長時間作業の疲れがぜんぜん違いますね。

ただ、どれでも少しお高めなのがツラいところ。ニッチなニーズ向けなので仕方ないところでしょうけど。

皆様、ぜひ楽しい iVim ライフをお送りください。

プロフィール
管理人
Vim太郎

Vim力アップして、そろそろ上級 Vimmer の仲間入りしたいIT系エンジニアの端くれです。読んでくる訪問者の皆様と一緒に、Vim力を上げていくことができる記事が書ければと考えています。

\フォローする/
\ シェアする /
\フォローする/
関連記事
Vim入門
タイトルとURLをコピーしました