2018年版Life ChangingだったVimプラグインTOP3

これは BeProud Advent Calendar 2日目の記事です。

こんにちは。がっつりPythonで開発するにはPyCharmがほしいけど、テキストの編集時にはやはりVimを使うkashew_nutsです。

今回は2018年に使い始めてLife ChangingだったVimプラグインを3つに絞って紹介します。

../../../_images/vimlogo-564x564.png

前提とする環境

自分が普段使っている以下の環境が前提としています。

junegunn/fzf.vim: Fuzzy Finder

インタラクティブ(対話的)にファイル・タグ・文字列を一覧に出力して、あいまい検索してくれるツールです。 他によく聞くツールだと ctrlpvim/ctrlp.vim やより汎用なツールを謳う Shougo/denite.nvim があります。

../../../_images/fzf_files.png

fzf.vim を使う理由

個人的に fzf.vim を使う理由は以下の3つです。

  • Vim scriptとGolangで動くため、Vimの外部インターフェイスの依存がない

  • 検索処理をGolang製のコマンドラインツール(junegunn/fzf )を使うので速い

  • grepやctagsのようなVimがよく使う外部コマンドを拡張した使い方ができる

fzf.vim は同作者が作る fzf を使う上でのラッパーなので、 fzfのみを使うことも可能です。しかしデフォルトの設定があると便利なので使用しています。

実行に必要な環境

サポートしてるバージョンはVim7.4以上です。

インストール方法

vim-plugを使用していれば以下のように追加します。

" Windowsの場合は別途手動インストール
Plug 'junegunn/fzf', has('win32') ? {} : {'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'

よく使うコマンド

最初は Files を使うだけでも快適さの一片を味わえるかと思いますが、現在よく使うのは次の5つです。

  • Files: カレントディレクトリ以下のファイル一覧を表示。一覧から選択したファイルを表示できる。

../../../_images/fzf_files.png

そのままでも便利ですがプレビュー画面を有効にするため、vimrcに以下の設定を記述しています。

" ファイル一覧を出すときにプレビュー表示
command! -bang -nargs=? -complete=dir Files
\ call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0)
  • Grep: 自分で定義したgrepコマンドの拡張。プレビューしながらインタラクティブにgrep検索できる。

../../../_images/fzf_grep.png

ag は や Ag コマンド、 ripgrepRg コマンドをデフォルトで持っているのですが、 自分が普段使う pt はコマンドを持っていないので以下のように定義して使っています。

" https://blog.fakiyer.com/entry/2017/08/06/222936
function! s:find_git_root()
  return system('git rev-parse --show-toplevel 2> /dev/null')[:-2]
endfunction
" 外部コマンドptを使用してプレビューしながらgrep検索する
command! -bang -nargs=* Grep
\ call fzf#vim#grep(
\   'pt --column --ignore=.git --global-gitignore '.shellescape(<q-args>), 1,
\   <bang>0 ? fzf#vim#with_preview('up:60%')
\           : fzf#vim#with_preview({ 'dir': s:find_git_root() }),
\   <bang>0)
  • History: 最近開いたファイルと現在開いているバッファを表示できる。

../../../_images/fzf_history.png
  • Buffers: 現在開いているバッファを表示できる。

../../../_images/fzf_buffer.png
  • Tags: プロジェクト内でタグ生成から検索までできる。

../../../_images/fzf_tags.png

w0rp/ale: 非同期Linter/Fixerエンジン

ALEAsynchronous Lint Engine の略です。Vimの快適な編集を邪魔することなく、コードチェックができます。 ALEは2018/12/01時点で110もの言語に対応しているので、Pythonに限らずBashやMarkdown、JSONなどにも使えます。

実際に使用しているイメージは以下の図のようになります。

../../../_images/ale.png

CI実行時にFlake8やmypyのようなツールを使うよう環境は整えたりはよくすると思いますが、 CIの実行を待たずにVimで編集中に実行できるようにしたかったのでALEを導入しました。

実行に必要な環境

サポートしてるバージョンはVim8以上です。 またVimコンパイルオプションで job, channel, timers が有効になっている必要があります。

自分のVimが対応してるかどうかはVimを立ち上げて :version コマンドを実行し、 各オプションが +(有効) になっていることを確認してください。

インストール方法・使い方

vim-plugを使用していれば以下のように追加します。

Plug 'w0rp/ale'

しかしALEはこれだけでは真価を発揮できません。自分が使いたいコードチェックやフォーマット用のツールを用意します。 普段自分はPythonを書くときに Flake8mypy でチェックするのでこちらをPythonの仮想環境上にインストールします。

$ python3.6 -m venv venv
$ source venv/bin/activate
(venv) $ pip install flake8 mypy
Collecting flake8

.... #  Flake8やmypyの関連パッケージがインストールされる

Installing collected packages: mccabe, pyflakes, pycodestyle, flake8, typed-ast, mypy-extensions, mypy
Successfully installed flake8-3.6.0 mccabe-0.6.1 mypy-0.641 mypy-extensions-0.4.1 pycodestyle-2.4.0 pyflakes-2.0.0 typed-ast-1.1.0

次にALEにPythonのLinterにFlake8とmypyを使うよう指定します。次のようにvimrcに記述します。

let g:ale_linters = {
\   'python': ['flake8', 'mypy'],
\}

Linterが実行できる環境を用意し、vimrcにLinterの指定をすると以下のようにチェックしてくれます。 設定により更に強調することもできますが、自分は編集中は編集に集中してLinterはそのアシストをしてほしいので控えめな表示にしています。

ここではLinterで実行するツールの設定だけ行いましたが、実行するタイミングを選べたりVimのQuickFixと連携できたりなどカスタマイズができるので自分好みに設定してみてください。以下に自分が設定している内容の一部を抜粋します。

" ファイル保存時にLinterを実行する
let g:ale_lint_on_save = 1
" テキスト変更時にはLinterを実行しない
let g:ale_lint_on_text_changed = 'never'
" Linter(コードチェックツール)の設定
let g:ale_linters = {
\   'python': ['flake8', 'mypy'],
\}
" ファイル保存時にはFixerを時刻しない
let g:ale_fix_on_save = 0
" テキスト変更時にはFixerを実行しない
let g:ale_fix_on_text_changed = 'never'
" Fixer(コード整形ツール)の設定
let b:ale_fixers = {
\   'python': ['autopep8', 'isort'],
\}
" 余分な空白があるときは警告表示
let b:ale_warn_about_trailing_whitespace = 0
" ALE実行時にでる目印行を常に表示
let g:ale_sign_column_always = 1

airblade/vim-gitgutter: 追加・変更・削除された箇所のマーカー表示

ALEでコードチェックができるようにしたら、Gitでバージョン管理してるコードに変更があったのかもできるようにしたくなりました。

以下はvim-gitgutter作者が公開している使用イメージ画面です。

https://camo.githubusercontent.com/f88161827e0cbb3144455b9e5c7582fdd5b5fc83/68747470733a2f2f7261772e6769746875622e636f6d2f616972626c6164652f76696d2d6769746775747465722f6d61737465722f73637265656e73686f742e706e67

15行目が変更され、21-24行目が新規に追加、25-26行目の間の行が削除されています。 vim-gitgutterを導入して自分がどこを変更をしたのか、意図していない変更はないかがすぐわかるようになりました。

実行に必要な環境

Vimのコンパイルオプションで signs が有効になっている必要があります。

設定方法

vim-gitgutterはインストールしただけで使えるのですが、変更のあるなしで目印行が表示されたり、非表示になったりするのが煩わしかったので、常に表示するようにだけ設定しています。

Plug 'airblade/vim-gitgutter'
" 目印行を常に表示する
if exists('&signcolumn')  " Vim 7.4.2201
  set signcolumn=yes
else
  let g:gitgutter_sign_column_always = 1
endif

マーカーが表示されるタイミングを変えるためにvimrcで updatetime の値を変更するのは有効なので、お好みで設定してみてください。

終わりに

fzf.vim, ALE, vim-gitgutterと3つのプラグインを紹介してきました。 今回は紹介しきれなかったプラグインも dotfiles/vimrc にあるので興味があれば見てみてください。

ヨセミテツアー日記

去る10/19〜26日にアメリカのヨセミテにクライミング旅行に行ってきた。 また行くことになったときの自分用のメモとして記録して起きたいと思う。

スケジュール感

書き出すときりがないのでざっくりと書くとこんな感じ。

  • 10/19[Day0]: 移動

  • 10/20-25[Day1-5]: クライミング

  • 10/26[Day6]: 移動

初日と最終日の移動は本当に疲れたので、次回いくとしたらフレズノから行きたい…. 成田→サンフランシスコの直行便でいったが、渋滞にハマったおかげで初日宿についたのは0時を回ってた。

「レスト日どうする?」なんて会話もしていたけど、結局ヨセミテにいた5日中5日とも登ってた。 明確なレスト日はなかったけど毎日12-18時間ぐらいずつレストしてたのと、ワクワク感が尽きなくて今回は必要なかった。 だいたい10-12時から18時ぐらいしかエリアにいなかったり、移動も車で数十分かかることもあり登ってる時間もそこまで多くなかったのかな。

V7, V8以上の課題を完登しようと思ったら、 2週間ぐらいまとめていかないと足りない と感じた。

宿とか食事とか

../../../_images/lodge.png

今回止まったのはCamp4…じゃなくてヨセミテ園内にあるロッジ。 Airbnbで宿を取った。通信網は事前情報から諦めていたのでそれ以外の洗濯機や乾燥機、暖房もあるしすごいなーと思っていたら階段がヤバかった。

食事はDay0の行きがけに1週間分の食料を買ってから行ったのだけど、0時過ぎに着いて水やスーツケース、食べ物類を抱えて何往復もした。 「他の宿より安いのはこれが理由か….」とメンバー全員が思ったとか。

自炊力の高いメンバーが居てくれたおかげで食事に苦労することはなかった。感謝しかない。

移動とか

レンタカーを2台体制で行きました。自分が運転の経験値が浅いこともあり、ほとんどお任せする形になってしまったが、 ヨセミテ園内で海外で運転する実績は解除できた

日本から海外にいって運転するときは国際運転免許証が必要らしいのだが、今回はレンタカー会社がやっていた運転免許証翻訳フォームから発行できたのでそちらを使用した。必要な条件は満たしている上に、発行の手間も非常に少なかったので便利。

持ち物

宿に洗濯機があるのがわかっていたので服とかも3,4日分の荷物でいったけど十分足りた。

  • 航空会社にANAを使ったので手荷物1つと預け荷物2つを持っていけた。

  • 今回は手荷物をノースフェースのフューズボックスにして、預け荷物をスーツケースとクラッシュパッド(以下マット)にした。

  • 現地で購入する手段もあったが、パモも持って行きたかったので自前で持っていった。

  • パモのような細いものはマットの間に挟んでも抜けて紛失する恐れがあったので、行きは空港の バゲージラッピングサービス を活用していった。一緒に行ったメンバーは車用のラゲージネットで包んでいっていた。ラッピングしてもらうのもよかったが、空港である程度時間も使うので次回はこっちを検討しようと思う。

お財布事情

今回はカード1枚しかもっていかなかったけど、2,3枚+50~100ドルの現金があればベストかなと。 (1ヶ所なかなかカードの認証が通らなくて焦ったりしたのでバックアップ大事)

  • 基本カード(クレジットなりデビット)があればそれで足りる、というかないと不便。

  • しかし例外的に1グループごとに現金は50〜100ドルぐらいは持っていないと慌てる可能性がある。ただ100ドル札があっても断れることがあるらしいので、10ドル札とかを何枚か持っておく感じ。

  • 以下は今回現金が必要だった場所

    • ヨセミテ園内にあるガソリンスタンド (日本のカードってアメリカのガソリンスタンドで通らないのを知った)

    • 通行料がある橋

通信網について

../../../_images/speedtest.PNG

サンフランシスコあたりでは快適につながったが、ヨセミテ全体ではエリアによる感じでした。

  • 今回はAT&TのMVNOであるMOST SIMをAmazonで購入して行った。

  • Sprintだとヨセミテ園内では電波が入らなくないらしい(電波を掴んでもつながらなかったり)

  • 空港から途中まではしっかりつながっていたが、ヨセミテ園内に入るとつながる場所はつながるが、つながらないところはどうしてもあった。

  • 観光スポットになっていたり、Camp4やCurry Villageではつながりやすかったが、常にiPhoneのアンテナが4本立っているというわけではなかった。(これは予め知らないとわからないことだったので、ちゃんとSIMフリーiPhoneを持って、つながるSIMを選んで行けてよかった)

動画撮影とか

iPhone6sの空き容量を40GBぐらい空けて行ったけど、撮りっぱなしで撮影することもあったので全然足りなかった。 次の機種は128GBか256GBにするかな……それか、撮りっぱなし用途ならGoProみたいなのを持ち歩いたほうがよいのかも。

登った(トライした)課題

登れた課題も登れなかった課題もいくつもあって、思い出深いので今回使用したトポ SuperTopo Yosemite Valley Bouldering のエリア名、ページ数、課題番号とともにメモしておく。

Camp4 - Columbia Boulders [P114-115]

ヨセミテに来たら触らないわけにはいかない、世界で最も有名なボルダリング課題がある岩。

  1. Midnight Lightning V8(★★★★): 未完登。

    最初は怖気づいて触る気もしなかったのだけど、次どこ行こうかみたいな話を岩の近くでしていたら、オーストリア?の兄さんに「10分だけマット貸してくれないか?」と言われて出した流れでトライ。 (ちなみにそのお兄さん3撃で完登してた。いいもの見れた。ムーブもめっちゃ教えてくれたしいい人だった。) 今回はマントル前の飛び出しの姿勢をうまく作れず終了。二段の実力つけて登りたいですなー。

Camp4 - East [P116-120]

低グレードでもマントル返すのが慎重になるような課題がちらほらあって、凹まされたエリア。

  1. The Largo Lunge V0-(★★★): 完登。意外とマントルがスローピーなので怖い課題。でもV0だなーと思える。

  2. The Jimi Hendrix Experience V0(★): 完登。

  3. Bachar Cracker V4(★★★★): 未完登。クラック課題。

    ジャミングができないとできなそうだなという気持ちと、落ちたら背中を岩に強打しそうな雰囲気がバンバンしたので、そんなに頑張らず終了。

  4. Unnamed V1(★★): 未完登。Bachar Crackerの抜けの部分。

    意外とできそうだったのだけど、草が積りすぎて、足を滑らせ怖い落ち方をしそうになったので、1回で終了。

  5. Unnamed V1(★★): 未完登。

    ガバホールドでのトラバースなのだけど、良すぎて手に刺さって痛いし、足場が悪い、途中の下地が悪いの3連コンボでやる気をなくして終了。

  1. Unnamed V3(★): 未完登。苦手が詰まった課題だった。

    両手カチからの微妙に踏みにくい右足に乗り込んで1手目を取り、マッチしたらマントルを返す課題。1手目取りが安定せずよれて終了。ロックとカチと悪い足が揃うととたんに弱くなるな….

  1. The Force V9(★★★): 登ってない。40. Unnamedをやった後見に行った課題。かっこいい課題なので次回行くときはちゃんとトライしたい。

  2. Thriller V11(★★★★): 44. The Forceと同様。

Camp4 - West [P128-]

../../../_images/camp4_west.png

乗り込みにくかったり、ホールディングにコツが必要だったりとグレード関係なく試される感じがしたエリア。

  1. Unnamed V3(★): 未完登。

    狭くて悪くて「これ本当にV3!?」って課題だった。

  1. Unnamed V3(★): 未完登。

    これも保持感が悪くて木にぶつかりそうで1回で諦めてしまった。

  2. Battle of the Bulge V6(★★★): 未完登。

    上部でマッチした後飛び出すのが確信らしいが、マッチできずに終了。 次回行くときは完登したい。

  3. The Titanic V5(★★): 未完登。

    エリアの名前になってる看板課題。 初手取りが全然できなかったけど、コツ物かな。。。

  1. Initial Friction V1(★★): 完登。

    V1だと思ってなめてかかるとスタートすらできない課題。 登れたときはテンション上がりました。

  1. Marco’s Traverse V1(★): 完登

  2. Unnamed VB(★★): 完登

  1. Unnamed V0(★★): 完登

  2. Unnamed VB(★★): 完登

Curry Village(Half Dome Village) [P76-81]

Camp4に比べると小さめな岩(とはいえ5〜6mくらいはある)が多く、取り付きやすい課題が多かった。

  1. Circuit Breaker V2(★★★): たどり着けず。

    どうやらCurry Villageの他の課題と違うところから行く必要があるらしく、ふらっと探しに行ける場所ではなかったらしい。クラック課題なのでジャミングができるかできないかでレベル感も変わりそう。

  1. Root Canal V7(★★★): 未完登。

    カチが多い課題だが、ムーブが選べて女性にも人気な課題らしい。実際セッションしてた強強女性クライマーが完登してた。左手のロックとかカチを耐えてしっかり持つところができないとつらそうなので次回行くときまでに鍛えたい。

  1. Unnamed VB(★★): 完登

  2. Unnamed V1(★★): 未完登

  3. Unnamed V0(★★): 未完登

  4. Unnamed V2(★★): 完登

  5. Unnamed V2(★★): 完登

  1. The Angler V3(★★★): 未完登

    カチ具合に気が引けて3回でやめてしまった….自分はロースタートxカチx横移動の組み合わせだと極端に弱いらしい…..

  1. Zorro V4(★★★): 完登。

    「Yosemite’s Best」に選ばれているだけあって良い課題だった。飛び出しも初見だとすごく遠く感じるけど、右手人差し指と中指をしっかりホールドして、右足の置き場所を定めるとバチッとハマる課題。楽しかった。

  2. Unnamed V5(★★): 完登。

    Zorroの右横にある課題。スタートから右手を送るのが遠いが、左手の持ち感を変えたらあっさりできてしまった課題。個人的には好きなタイプの課題だったのでできて嬉しい。

登った後のピザはおいしかった。

../../../_images/curry_village_pizza.png

Sentinel Boulders [P62-66]

../../../_images/sentinel_boulder.png

同行者も初めていったエリアだったが、駐車場からのアクセスもよく課題も見つけやすかった。

しかしリーチ感が非常に遠い課題があったり、ホールディングやムーブの質が求められている感じがした。 5. Flake Out V7(★★) にも目をつけていたのに、ここにあることを忘れていたのがもったいなかったので次回行くときは触りたい。

  1. No Holds Bard V7(★★★): 未完登。

    一手一手が遠いとは聞いていたが、本当に遠かった。初手取りのムーブが起こせず消沈して終えてしまったが、動画ムーブに縛られなかったらまた別のやりようがあったのでは….とも思う。

  1. Unnamed VB(★): 完登

  2. Unnamed V1(★): 完登

  3. Unnamed V0-(★): 完登

  4. Door Knocker Traverse V3(★): 完登

  1. Mr. Pink Eyes V0(★★★): 未完登。ひたすらスローパーで「これは本当にV0なのか!?」と衝撃を覚えたライン。

  2. Unnamed V4(★★): 未完登。スタートの仕方がわからず….

  3. Midget Traverse V3(★★): 未完登。

    トポに書いてあるラインだけ見ると「これV3?」と思うのですが、実は岩を半周するほど長いライン。最後のマントル時にはよれている上、足場もなく「なるほどこれはV3だ」というライン。

Cathedral Boulders [P42-48]

../../../_images/cathedral_boulder.png

ここも同行者含めて初のエリア。途中迷ったが、偶然の出会いもあったりして印象的。Fish Headは次回いくときは落としたい。

  1. Fish Head V7(★★): 未完登。

    撤収する30分くらい前に良さそうと思って手をつけたが、流石に厳しかった。 3手目出しをどうしたらいいかわからなかったけど、1手目ポケットと2手目の引けない向きについているカチからだと動けなかったからなー。 もうちょい格闘する時間ほしかった。

  1. The Octagon V6(★★★): 未完登。一手一手がかなり遠かった。完敗。

  2. Ladder Detail V5(★★): 完登。

    Youtubeでムーブを見てたから結局それで完登したけど、トポに書いてあるルートや記述とは違うので完登といって良いものか悩むけど、登れたものは登れたということにしておく。次はトポに書いてあるやり方で登りたいところ。

最後に

ヨセミテ最高だった!誘ってくれたTKBや一緒にいってくれたメンバーには感謝です。

次が来年再来年になるか、いつになるかわからないけどもまた行きたいなー。

../../../_images/yosemite_beers.png

おまけ

今のところアメリカいるときしかあたってない。(わかる人だけわかる)

PyConJP2018でPyCharmの話をしてきました #pyconjp

通算5回目のPyCon参加になりました。個人的には今回は例年と少し違った参加のしかたになりました。

発表者として45分間トークしてきたり(New!)、 チュートリアルの講師・TAをやった(New!)のは良い経験になりましたね。

せっかく参加したのをそのままにするのももったいないので、 当日の様子とかを振り返っておきたいと思います。

自分の発表について

普段自分がPyCharmを使っている中で便利だなと感じるところや、どうゆうところで詰まったりしたかというところを紹介しました。

内容的には PyCon Kyushu - 2018 Fukuoka で話したことがベースになっています。始まる前は「裏番組も強力だし、まさか満員になることはないだろう」と思っていましたが、まさかの満員で、しかも立ち見NGなので別会場でライブストリーミングするという話が聞こえてきて「何が起きているんだ!?」とテンパっていました。

登壇の機会をいただいたといっても、「聞きに来てくださった方の期待に応えられるかなー」と不安に思ったりもしましたが、概ね好評だったようでホッとしました。45分枠だったので質疑応答の時間も取れてよかったかなと思います。発表したことで自分が知らなかったことも知れたりしました。

チュートリアルについて

今回は「DjangoによるWebアプリケーション開発入門」の講師&TA担当でチュートリアルに初参加しました。 かなり反省点もある時間だったのですが、いい経験になりました。その経験が翌日の発表やその後の講師業にも活かせたかなーと。

いくつかやられたなーと思ったのがあったので今後の自分のためにいくつかメモ。

  • Python3.7をサポートしているのはDjango2.0.7以降。Django1.11LTSはサポートしていない。

    • 考えてみたらそうだけど、Django1.11LTSの方がPython3.7より先にリリースされているからサポートされてる保証はなかった。サポートしているバージョンの確認は大事。

    • Python3.7互換の対応は https://code.djangoproject.com/ticket/28814 でされた様子。

  • 忘れたことにやってきたShebang。

    • #!/usr/bin/python : フルパスで指定されているPythonインタプリタを実行する

    • #!/usr/bin/env python : PATH の中に含まれるPythonインタプリタを実行する

チュートリアル後に行われたWelcomeパーティは楽しかった!

PyConで拝聴したセッション

1日目は自分の発表もあり、他のセッションを聞いてる余裕があまりなかったのですが、2日目のキーノートである @ransui さんの 「Pythonでやってみた」:広がるプログラミングの愉しみ はわくわくしましたね。

他に会場で聞いたり、YouTubeで見てる中で良かったなーと思ったセッションはこんな感じ。現実と戦う話だったり、自分の興味を掘り下げていく話だったりと今回のテーマだった「ひろがるPython」にちなんだ発表だなーと感じました。

Tweet振り返り

雑多にいくつかピックアップして振り返り

ちょうどコラボイベントをやっていらしかったのでパシャリ。

@yattom さんのライブコーディング。

仕事で pytest は使っているのですが、 他の人がどうテストを書くんだろうと見れる機会は多くないので参考になりました。

コードは https://github.com/yattom/tddhome/tree/20180918_pyconjp2018_livedemo/python_pytest に上げていただいているので、見直したいときは役立ちそう。

スタッフの方々おつかれ様でした。参加者の人数が増えていたり、新しい会場だったり、いろいろ大変な役割だと思いますが、おかげで楽しめるました。

おわりに

有志の打ち上げも楽しかった。来年もトークできたらいいなと思うので、発表ネタをしたためておきたいですね。