iPadでVim

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

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

https://apps.apple.com/jp/app/ivim/id1266544660

こちらを 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をコピーしました