尋常でないもふもふ

a software engineer blog

Vimの知見まとめとく

自分は vi 信者でもなければ emacs 信者でもない。どちらかというと IDE 至上主義者。
vim に関してはターミナル作業中にときどき使う。凝った設定は不要で、プラグインは使わないしカラーテーマもデフォルトで用意されてるものだけを使いたい。
無駄な設定なしで最低限使いやすい状態にしておきたい、というスタンス。

Mac では vi = vim

vi コマンドは vim コマンドへのシンボリックリンク。たまに alias を書いてる人がいるけど不要。

$ ls -l /usr/bin/vi
lrwxr-xr-x  1 root  wheel     3B  7 25 12:33 /usr/bin/vi@ -> vim

.vimrc に省略形は書かない

省略形で書くとこうなる。

set ts
set sw
set sts
set tw

正しい名称はこちら。

set tabstop
set shiftwidth
set softtabstop
set textwidth

省略形はエディタ上で臨時的に変更したいときに入力文字数が少なくてすむという機能。設定ファイルに記述するのは混乱するだけだし、重複して書いてるような人も多くて害が多い。

nocomaptible はいらない

あらゆる .vimrc の冒頭に set nocompatible と記述されているが vim では標準で適用されているため不要。
書くといくつかの設定がリセットされるという副作用があるらしく書いてはいけない。
vimrcアンチパターン - rbtnn雑記

ペースト時に盛大にインデントがずれる件

noautoindent する。smartindent を有効にしてれば改行時には適切にインデントしてくれるため、実用面でも不便はない。

現在の設定

更新するにあたってひとつひとつがどんな意味をもつのか精査したので、とりあえずの完成形という感じ。

gist.github.com

2016年11月のPython環境構築

Python で開発するわけじゃないけど、Hubot を使ったりするときにサーバ操作のための自動化ツールとして Fabric をつかうことになることが度々あり pip が必要になったりする。
最近だと Google人工知能ライブラリ TensorFlow を試すためにいれてる人も多そう。
改めて現時点のモダンPython 環境構築手順をまとめる。

対象物

  • Python 自体のバージョン管理のために pyenv
  • Python は標準の Python.org のものではなく Anaconda または Miniconda
  • パッケージ管理ツールとして pip ではなく conda
  • プロジェクト毎に Python 環境を変えるための pyenv-virtualenv は個人的に不要
    • 一般的には開発で Python3 使うけど Fabric 実行のために Python2 必要みたいなケース多いはず
    • そういうときに入れればいい
  • インストール対象

環境

  • OS X El Capitan バージョン 10.11.6

インストール

pyenv は Homebrew 経由でいれる。

$ brew install pyenv

設定

bash を使ってる場合は .bash_profile に追記する必要あるけど FishShellfisherman を使っているのでプラグインを入れるだけ。

$ fisher pyenv

インストール可能な Python 一覧

Python3 はリリースから 8 年経つらしいが後方互換性がないせいで、Python2 が今でも現役。最新は以下の通り。

新規開発なら 3 系を入れれば良いが、今回の目的の Fabric は 2.5〜2.7 しか対応してないため、2 系の最新をいれることにする。

pyenv では標準の Python, Anaconda, Miniconda, PyPy, Stackless Python と 5 種類の Python をインストールできる。

$ pyenv install --list
 (略)
  2.7.10
  2.7.11
  2.7.12
 (略)
  3.5.2
  3.6.0b1
  3.6-dev
 (略)
  anaconda2-4.0.0
  anaconda2-4.1.0
  anaconda2-4.1.1
 (略)
  anaconda3-4.0.0
  anaconda3-4.1.0
  anaconda3-4.1.1
 (略)
  miniconda2-3.19.0
  miniconda2-4.0.5
  miniconda2-4.1.11
 (略)
  miniconda3-3.19.0
  miniconda3-4.0.5
  miniconda3-4.1.11

Anaconda と Miniconda の違い

公式のFAQ によると

What is Miniconda?
Miniconda includes conda, Python and a small number of other useful packages including pip, zlib and a few others.

ニコンダは condaPythonpipzlib 等を含んだ小さなパッケージという扱い。
何が入っているかはインストール後に conda list で確認することができる。

conda list
# packages in environment at /Users/jnst/.pyenv/versions/miniconda2-latest:
#
conda                     4.2.12                   py27_0
conda-env                 2.6.0                         0
enum34                    1.1.6                    py27_0
openssl                   1.0.2j                        0
pip                       9.0.1                    py27_0
pycosat                   0.6.1                    py27_1
pycrypto                  2.6.1                    py27_4
python                    2.7.12                        1
readline                  6.2                           2
requests                  2.11.1                   py27_0
ruamel_yaml               0.11.14                  py27_0
setuptools                27.2.0                   py27_0
sqlite                    3.13.0                        0
tk                        8.5.18                        0
wheel                     0.29.0                   py27_0
yaml                      0.1.6                         0
zlib                      1.2.8                         3

全部入りが Anaconda で、データサイエンティスト向けのパッケージが充実してるらしいけど自分は必要ないため、Miniconda をいれることにする。

Python2 系の最新をインストール

バージョン指定もできるが、末尾に latest で最新をいれる書き方もできる。

$ pyenv install miniconda2-latest

利用する Python 環境を変更

global コマンドで設定。

$ pyenv global miniconda2-latest

利用中のバージョン確認

versions コマンドでインストールされている環境一覧がわかる。

$ pyenv versions
  system
* miniconda2-latest (set by /Users/jnst/.pyenv/version)
$ python -V
Python 2.7.12 :: Continuum Analytics, Inc.

conda の使い方

まず condapyenv のように Python 自体のバージョン管理もできるが、pyenv で管理する方が楽そうなので conda はパッケージ管理マネージャのみとして利用することにする。
いろいろインストールして何かよくわからなくなったら pyenv uninstall <version> すればキレイさっぱりと最初からやり直せる。

コマンド一覧の確認。

$ conda help

Fabric を探す。

$ conda search fabric

Fabric の最新をインストール。

$ conda install fabric

conda install fabric=1.11.1 のようなバージョン指定もできる。公式ドキュメントもわかりやすい。

Fabric が使えることを確認。

$ fab -V
Fabric 1.11.1
Paramiko 1.16.0

zshは諦めてたけどfish shell導入したら捗った

エンジニア人生の中で zsh を導入しようと数回思いたったことはあるのだけれど、毎回初期設定のひどさを見るたびに辟易して bash でいいやと諦めていた。
コピペで機能追加できるとか言われても、自分の理解の範疇を超えてわけわからん状態になるのは耐え難いし、そこに学習コストをかけるモチベーションもない。
しかし最近になって Fish Shell=fish という面倒がなく導入できて使い勝手もすこぶる良いものがあると知り導入することにした。

インストール

Homebrew でインストールできる。

$ brew install fish

プラグイン管理ツールのインストール

zsh では oh-my-zsh, Antigen, zplug のようないくつかのプラグイン管理ツールがあるようだけど、fish では oh-my-fishfisherman があり、fisherman の方がより洗練されているそうなので fisherman を使うことにする。

$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman
$ fisher -v
fisherman version 2.9.0 ~/.config/fish/functions/fisher.fish

初期設定

デフォルトのシェルを bash から fish に変更する。

$ echo /usr/local/bin/fish | sudo tee -a /etc/shells
$ chsh -s /usr/local/bin/fish

設定ファイル

bash では ~/.bash_profile~/.bashrc を設定ファイルとして使うが、fish では ~/.config/fish/config.fish を編集する。

$ touch ~/.config/fish/config.fish

現状、このような記述にしている。
nodebrewgolangプラグインはまだないようだが、ちゃんと探せてないだけだと思う。

見た目の変更

ローカル環境でサーバが起動しWebブラウザから設定できるようになる。

$ fish_config

各種設定

bash のときは ruby, node.js, golang の設定を書いているくらいだった。fish では config.fish に書かなくても fisherman でインストールすれば使えるようになるものもある。
以下は Ruby 環境用の rbenvPython 環境用の pyenv の自動設定プラグイン

$ fisher add rbenv pyenv

最高に便利なプラグイン

対話的フィルタリングツールとして peco が有名だけど、同等以上に便利な fzfMac にインストールした。

$ brew fzf

続いて fish で便利に使えるようにする fzf プラグインをインストール。

$ fisher add jethrokuan/fzf

これでキーバインディグが追加される(ただし Mac の場合は Alt + cç と入力されてしまうため、Esc キーを使ったり別途設定が必要)。

  • Ctrl-t: カレントディレクトリ配下のすべてのファイルを自動補完
  • Ctrl-r: コマンド履歴から自動補完
  • Ctrl-x: コマンド履歴から自動補完して確認なしに即実行
  • Alt-c: カレントディレクトリ配下のすべてのディレクトリを自動補完して移動
  • Alt-Shift-c: カレントディレクトリ配下のすべてのディレクトリを自動補完して移動 (隠しファイル含む)

Go 言語を利用している場合は GitHub リポジトリの clone に ghq を利用している人が多いが、これも fish プラグインを使うことで便利なリポジトリ移動ができる。

fisher decors/fish-ghq

いろいろなオートコンプリートを追加

man ページを元に自動生成してくれる。git コマンドでも ruby コマンドでも何でも自動で追加してくれる。この仕組みはシェル界隈ではエポックメイキング的に便利な新機能のようだ。
生成ファイルは ~/.local/share/fish/generated_completions に保存された。

$ fish_update_completions
Parsing man pages and writing completions to /Users/jnst/.local/share/fish/generated_completions/
  2683 / 2683 : zic.8