Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

[Vim] [Python] jedi-vimとマルチバイト文字まわりのバグ?

$
0
0

詳しくは自分のブログに書いたのですが、Pythonの開発環境をPyCharmからVimに乗り換えました。

いままで外部プラグインを使わない派で一年間Vimmerやってきたんですが、気の迷いでプラグインも入れてしまいました(最小限ですが)。

今回Pythonまわりのプラグインでめっちゃ便利なjedi-vimっていう有名所のやつを入れたんですが、バグっぽい挙動を見つけたので書いておきます。

ググったけど同じ症状の人見なかったのでぼくの環境がおかしいのかもしれません。またプラグインのバッティングの可能性もあるかと思います。

対策をご存じの方、ご教授いただけると幸いです。

環境

  • OS : OS X EL Capitan 10.11.6
  • VIM: 8.0
  • jedi:0.10.2

現象

日本語(マルチバイト文字)が入っていると補完が効かない

autocomp.gif

上記画像で言うと"パワーマン {}"のあとの.formatが保管されていません。

s = "パワーマン {}"のように変数に入れれば、s.のあとで補完が効くようになります。

日本語(マルチバイト文字)が入っていると変数リネームが失敗する

rename.gif

リネーム実行後"パワーマン {}".format(hoge)となって欲しいところが"パワーマン {hogeformat(num)になってしまっています。

導入してみての感想

IDEのVimモードも良いですが、やはりVimそのものを使えるというのはかなりのメリットだと感じました。ただし、内包表記でちょっと複雑な変数リネームなどをやるとうまくいかなかったりと、保管機能やリファクタリングにおいてはIDE(PyCharm)のコード分析に軍配が上がると言った印象です。

ここらへんは好みの問題だと思うので、まずはVimで引き続き開発してみようと思います。

.vimrc

"------- Preferences --------"setttyfastsett_Co=256sethiddensetautoreadsethistory=2000setnoswapfilesetbackspace=start,eol,indent
setambiwidth=double
setshortmess+=I
setnrformats=setbackupsetbackupdir=$HOME/vimbackup

setsmartindentsettabstop=4setautoindentsetexpandtabsetshiftwidth=4setshowmatchsetmatchtime=1setformatoptions-=csetsmarttabsetclipboard=unnamed,autoselect

"ハイフンを単語に含めるsetisk+=-"スペルチェック時に日本語を除外するsetspelllang=en,cjk

" インサートモードから抜けるときにペーストモードを解除する
autocmd InsertLeave * setnopaste"syntax markdownauBufRead,BufNewFile *.md setfiletype=markdown

setencoding=utf-8setfileencodings=ucs-bom,utf-8,euc-jp,iso-2022-jp,cp932,utf-16,utf-16le
"set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8setfileformats=unix,dos,mac

"------- Look&Feel -----"setrulersetnumbersyntaxonfiletypeonfiletype plugin onfiletype indent onsettitlesetshowcmdsetcmdheight=2setlistsetlistchars=tab:>-,trail:-,nbsp:%,extends:>,precedes:<,eol:<setdisplay=lastline
setpumheight=10"colorscheme distinguished"colorscheme railscasts"colorscheme grb256"colorscheme darcula"colorscheme molokaicolorscheme badwolf
auBufNewFile,BufRead *.ejs setfiletype=html


"------- Cursor -----""挿入モードでカーソル形状を変更するlet&t_SI.="\e[6 q"let&t_EI.="\e[2 q""カーソル形状がすぐに元に戻らないのでタイムアウト時間を調整setttimeoutlen=10"挿入モードを抜けた時にカーソルが見えなくなる現象対策(なぜかこれで治る)inoremap<ESC><ESC>setmouse=a"------- StatusLine -----""http://blog.ruedap.com/2011/07/12/vim-statusline-git-branch-name"プラグイン必要だったので今は設定しない。替わりに下記を設定"http://qiita.com/sizucca/items/40f291463a40feb4cd02"自動文字数カウント
augroup WordCount
    autocmd!
    autocmd BufWinEnter,InsertLeave,CursorHold * call WordCount('char')
augroup END
let s:WordCountStr =''let s:WordCountDict = {'word': 2,'char': 3,'byte': 4}
function! WordCount(...)ifa:0==0return s:WordCountStr
    endiflet cidx =3silent!let cidx = s:WordCountDict[a:1]
    let s:WordCountStr =''let s:saved_status =v:statusmsg
    exec "silent normal! g\<c-g>"ifv:statusmsg !~'^--'let str =''silent!let str = split(v:statusmsg,';')[cidx]
        let cur = str2nr(matchstr(str,'\d\+'))letend= str2nr(matchstr(str,'\d\+\s*$'))ifa:1=='char'            " ここで(改行コード数*改行コードサイズ)を'g<C-g>'の文字数から引くletcr=&ff=='dos' ? 2 : 1let cur -=cr * (line('.')-1)letend-=cr * line('$')endiflet s:WordCountStr = printf('%d/%d', cur,end)endifletv:statusmsg = s:saved_status
    return s:WordCountStr
endfunction"ステータスラインにコマンドを表示setshowcmd"ステータスラインを常に表示setlaststatus=2"ファイルナンバー表示setstatusline=[%n]
"ホスト名表示setstatusline+=%{matchstr(hostname(),'\\w\\+')}@
"ファイル名表示setstatusline+=%<%F
"変更のチェック表示setstatusline+=%m"読み込み専用かどうか表示setstatusline+=%r"ヘルプページなら[HELP]と表示setstatusline+=%h"プレビューウインドウなら[Prevew]と表示setstatusline+=%w"ファイルフォーマット表示setstatusline+=[%{&fileformat}]
"文字コード表示setstatusline+=[%{has('multi_byte')&&\&fileencoding!=''?&fileencoding:&encoding}]
"ファイルタイプ表示setstatusline+=%y"------- netrw -----""http://blog.tojiru.net/article/234400966.html  " netrwは常にtree viewletg:netrw_liststyle =3" CVSと.で始まるファイルは表示しないletg:netrw_list_hide ='CVS,\(^\|\s\s\)\zs\.\S\+'" 'v'でファイルを開くときは右側に開く。(デフォルトが左側なので入れ替え)letg:netrw_altv =1" 'o'でファイルを開くときは下側に開く。(デフォルトが上側なので入れ替え)letg:netrw_alto =1"------- Search --------"setincsearchsetignorecasesetsmartcasesetwrapscansethlsearch":grepコマンドをackに変更setgrepprg=ack\ --nogroup\ --column\ $*
setgrepformat=%f:%l:%c:%m"------- & command --------"nnoremap& :&&<CR>
xnoremap & :&&<CR>"現在の選択範囲を検索する
xnoremap * :<C-u>call<SID>VSetSearch()<CR>/<C-R>=@/<CR><CR>
xnoremap # :<C-u>call<SID>VSetSearch()<CR>?<C-R>=@/<CR><CR>function! s:VSetSearch()let temp = @s
  norm! gv"sylet @/ = '\V' . substitute(escape(@s, '/\'), '\n', '\\n', 'g')let @s = temp
endfunction"quickfixリストに含まれるファイル名を引数リストに設定する
command!-nargs=0-bar Qargs execute 'args' QuickfixFilenames()function! QuickfixFilenames()let buffer_numbers = {}
  for quickfix_item in getqflist()let buffer_numbers[quickfix_item['bufnr']] = bufname(quickfix_item['bufnr'])endforreturnjoin(map(values(buffer_numbers),'fnameescape(v:val)'))endfunction"------- plugins --------"
runtime macros/matchit.vim" Specify a directory for plugins" - For Neovim: ~/.local/share/nvim/plugged" - Avoid using standard Vim directory names like 'plugin'call plug#begin('~/.vim/plugged')" Make sure you use single quotes" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align" gaでテキスト揃え
Plug 'junegunn/vim-easy-align'" Pythonの自動補完
Plug 'davidhalter/jedi-vim'" KillRing的なやつ
Plug 'LeafCage/yankround.vim'" vで選択範囲を拡大、C-vで選択範囲を戻す
Plug 'terryma/vim-expand-region'" C--2回押しで選択範囲をまとめてコメントアウト
Plug 'tomtom/tcomment_vim'" gxでカーソル下のURLをブラウザで開く(URLでなければ検索結果を開く)
Plug 'tyru/open-browser.vim'" テキストを囲うものを様々に編集
Plug 'tpope/vim-surround'" 閉じカッコの自動挿入
Plug 'cohama/lexima.vim'" インデントの可視化
Plug 'Yggdroot/indentLine'" 候補絞り込み型インターフェース
Plug 'kien/ctrlp.vim'" CtrlPの拡張プラグイン. 関数検索
Plug 'tacahiroy/ctrlp-funky'" CtrlPの拡張プラグイン. コマンド履歴検索
Plug 'suy/vim-ctrlp-commandline'" CtrlPの拡張プラグイン 3つの機能が同梱
Plug 'sgur/ctrlp-extensions.vim'" vimからagを利用する
Plug 'rking/ag.vim'" Multiple Plug commands can be written in a single line using | separators
Plug 'SirVer/ultisnips'| Plug 'honza/vim-snippets'" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
Plug 'fatih/vim-go', { 'tag': '*' }

" Plugin options
Plug 'nsf/gocode', { 'tag': 'v.20150303','rtp': 'vim' }

" Plugin outside ~/.vim/plugged with post-update hook
Plug 'junegunn/fzf', { 'dir': '~/.fzf','do': './install --all' }

" Initialize plugin systemcall plug#end()"------- plugin settings --------"" ctrlp" let g:ctrlp_match_window = 'order:ttb,min:20,max:20,results:100'" .(ドット)から始まるファイルも検索対象にするletg:ctrlp_show_hidden =1" ファイル検索のみ使用letg:ctrlp_types = ['fil'] 
" CtrlPの拡張指定letg:ctrlp_extensions = ['funky','commandline','yankring'] 
"C-pでCtrlPMenuが起動するようにletg:ctrlp_map ='<c-p>'letg:ctrlp_cmd ='CtrlPMenu'" CtrlPCommandLineの有効化
command! CtrlPCommandLine call ctrlp#init(ctrlp#commandline#id())" CtrlPFunkyの有効化letg:ctrlp_funky_matchtype ='path'letg:ctrlp_cache_dir = $HOME.'/.cache/ctrlp'letg:ctrlp_clear_cache_on_exit =0letg:ctrlp_max_files           =100000letg:ctrlp_mruf_max            =500letg:ctrlp_yankring_limit =100letg:ctrlp_custom_ignore = {
  \ 'dir':  '\v[\/]\.?(git|hg|svn|cache|emacs\.d|node_modules)$',
  \ 'file': '\v\.(exe|so|dll|dmg|tar|gz|c4d|DS_Store|zip|mtl|lxo|psd|ai|eps|pdf|aep|jpe?g|png|gif|tif|swf|svg|obj|fbx|mov|mp[3-4])$',
  \ 'link': 'some_bad_symbolic_links',
  \ }

" jedi-vim" docstringポップアップを無効化
autocmd FileType python setlocalcompleteopt-=preview

" indentLine" 任意のファイルタイプで無効化するletg:indentLine_fileTypeExclude = ['help','markdown']

"------- Keymap -----"inoremap<C-c><ESC>noremap<C-c><C-c> :nohlsearch<Cr><Esc>setwhichwrap=b,s,h,l,<,>,[,],~let mapleader ="\<Space>"nnoremap<Leader>s :w<CR>nnoremap<Leader>/ /\vnnoremap<Leader>?  ?\vnnoremap Y y$
nnoremap+<C-a>nnoremap-<C-x>
cnoremap <C-p><Up>
cnoremap <C-n><Down>nnoremapj gj
nnoremapk gk
nnoremap gj jnnoremap gk knnoremap<silent><C-l> :<C-u>nohlsearch<CR><C-l>
cnoremap <expr> %% getcmdtype()==':' ? expand('%:h').'/' : '%%'setpastetoggle=<f5>
map <f6> :!open -a textedit %<CR>" Start interactive EasyAlign in visual mode (e.g. vipga)
xmap ga <Plug>(EasyAlign)" Start interactive EasyAlign for a motion/text object (e.g. gaip)
nmap ga <Plug>(EasyAlign)" 選択範囲を広げる
vmap v<Plug>(expand_region_expand)" 選択範囲を戻す
vmap <C-v><Plug>(expand_region_shrink)" カーソル下のURLをブラウザで開くletg:netrw_nogx =1" disable netrw's gx mapping.
nmap gx <Plug>(openbrowser-smart-search)
vmap gx <Plug>(openbrowser-smart-search)

まとめ

外部プラグイン入れはじめて数日なので、設定まわりで僕が変なことをやっちゃってる可能性も否めませんが、直す方法が見つかればいいなぁと思っています。

元記事

Vim: Python開発環境を作る - kick the base


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>