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