最近の開発環境: mjolnir, projectile, peco

mjolnir

mjolnir

Lightweight automation and productivity power-tool for OS X

とのことです。ウインドウやアプリケーションに関する操作をキーバインドに設定したり色々できる。

ウインドウの移動とリサイズ、アプリケーションとウィンドウのフォーカス移動のデモ
デモ

同じようなアプリにslateがあったけれど、ウインドウの操作などがもたついたのでmjolnirを使っている。

インストール

README.mdをなぞることになるけどインストールは

アプリケーションをダウンロードして解凍。

$ brew update
$ brew install lua
$ brew install luarocks
$ echo 'rocks_servers = { "http://rocks.moonscript.org" }' > ~/.luarocks/config.lua
$ luarocks install mjolnir.hotkey
$ luarocks install mjolnir.application
$ luarocks install mjolnir.window
$ luarocks install mjolnir.fnutils

設定は~/.mjolnir/init.luaに書く。luaは全く見たことも書いたことも無かったけど調べながらなんとなく書けば大体動く。自分の設定は以下のような感じ。

local application = require "mjolnir.application"
local hotkey = require "mjolnir.hotkey"
local window = require "mjolnir.window"
local fnutils = require "mjolnir.fnutils"

local key_app_map = {
  D = "Dash",
  C = "Google Chrome",
  T = "iTerm",
  S = "Slack"
}

-- アプリの起動とフォーカス
for key, app in pairs(key_app_map) do
  hotkey.bind({"cmd", "ctrl"}, key, function()
    application.launchorfocus(app)
  end)
end

local roundrobin = function(funcs)
  local i = 1
  return function()
    funcs[i]()
    i = i % #funcs + 1
  end
end

-- ウインドウを {左半分, 右半分, フル} にリサイズ
hotkey.bind({"ctrl"}, "9", roundrobin({
  function() window.focusedwindow():movetounit({x=0, y=0, w=0.5, h=1}) end,
  function() window.focusedwindow():movetounit({x=0.5, y=0, w=0.5, h=1}) end,
  function() window.focusedwindow():movetounit({x=0, y=0, w=1, h=1}) end
}))

-- 同一アプリケーション内のウインドウ移動
hotkey.bind({"alt"}, "o", function()
  local current_window = window.focusedwindow()
  local windows = current_window:application():allwindows()
  table.sort(windows, function(a, b) return a:id() < b:id() end)
  local index = fnutils.indexof(windows, current_window)
  if not index then return end
  for i = 1, #windows do
    if windows[(index + i) % #windows + 1]:focus() then break end
  end
end)

projectile

emacsのパッケージ。バージョン管理しているものの場合に、自動でプロジェクトのルートディレクトリを探して、それ以下のファイルを見つけたり色々できる。
projectile, helm-projectileをインストールして.emacsやらお好きなところに

(projectile-global-mode)
(require 'helm-projectile)

;; プロジェクトに関連するファイルをhelm-for-filesに追加
(defadvice helm-for-files (around update-helm-list activate)
  (let ((helm-for-files-preferred-list
         (helm-for-files-update-list)))
    ad-do-it))

(defun helm-for-files-update-list ()
  `(helm-source-buffers-list
    helm-source-recentf
    helm-source-ghq
    helm-source-files-in-current-dir
    helm-source-file-cache
    ,(if (projectile-project-p)
	 helm-source-projectile-files-list)))

;; helm-agをプロジェクトルートから
(defun projectile-helm-ag ()
  (interactive)
  (helm-ag (projectile-project-root)))

peco

以前入れたものにいくつか追加。メインはhelmやanythingからそのままだけどpeco-M-x。キーバインドを割り当てるほど頻繁には使わないものの便利なものを、名前をうろ覚えでも簡単に呼び出せるようになる。あとはpeco-M-xから呼びそうな便利関数追加。

# zsh
function peco-M-x () {
  $(print -l ${(ok)functions} | sed -e /^_/d | peco)
}
zle -N peco-M-x
bindkey '\ex' peco-M-x

# キーバインドの一覧
function peco-descbinds () {
  zle $(bindkey | peco | cut -d " " -f 2)
}
zle -N peco-descbinds

# Chromeのタブをmigemoで
function peco-chrome-tabs () {
  local tab_id=$(chrome-cli list tabs | peco --initial-matcher Migemo | sed -e 's/\[//' -e 's/].*//')
  if [ -n "$tab_id" ]; then
    chrome-cli activate -t $tab_id
  fi
}

# 電子書籍をパッと開く
function peco-books () {
  local book="$(find ~/Dropbox/books -type f | sed -e /.DS_Store/d | peco)"
  if [ -n "$book" ]; then
    open $book
  fi
}
zle -N peco-books