2011/01/22

キー操作で Emacs のフレーム位置やサイズを変更するマイナーモード frame-arrange.el を作りました

* 追記あります

C-c M (サンプルとして登録されているサイズ - 大きめ)

C-c m (サンプルとして登録されているサイズ - 小さめ)

qw 同時押し(左上端への移動 - 要 key-chord.el)

df 同時押し(右端への移動 -  要 key-chord.ell)

キー操作で、指定の位置に移動したり、位置やサイズを少しずつずらしたり、保存しておいた位置とサイズに復元したりできます。

ダウンロード

他に必要なものは、@podhmo さんの defmacro!.el 。

設定例

この例では、キーの同時押しにコマンドを割り当てる(例えば qw 同時押しに左上端に移動するコマンド)key-chord.el を使用しています。

また、C-Shift-矢印で矢印の方向にちびちび移動できます。
(require 'frame-arrange)
;; key-map
(define-key global-map [(C shift down)]
  'frange:increment-position-top/current-frame)
(define-key global-map [(C shift up)]
  'frange:increment-position-bottom/current-frame)
(define-key global-map [(C shift left)]
  'frange:increment-position-right/current-frame)
(define-key global-map [(C shift right)]
  'frange:increment-position-left/current-frame)

;; ;; (auto-install-from-emacswiki "key-chord.el")
;; (require 'key-chord nil t)
;; (setq key-chord-two-keys-delay 0.04)
;; (key-chord-mode 1)
(key-chord-define-global "qw" 'frange:arrange/top-left-most/current-frame)
(key-chord-define-global "we" 'frange:arrange/top-most/current-frame)
(key-chord-define-global "er" 'frange:arrange/top-right-most/current-frame)
(key-chord-define-global "as" 'frange:arrange/left-most/current-frame)
(key-chord-define-global "df" 'frange:arrange/right-most/current-frame)
(key-chord-define-global "zx" 'frange:arrange/bottom-left-most/current-frame)
(key-chord-define-global "xc" 'frange:arrange/bottom-most/current-frame)
(key-chord-define-global "cv" 'frange:arrange/bottom-right-most/current-frame)

(frange:regist-frame-position-parameter
 'example-min
 '((top . 20) (left . 70) (height . 30) (width . 110)))

(frange:regist-frame-position-parameter
 'example-max
 '((top + -4) (left + -4) (height . 35) (width . 126)))

(define-key global-map (kbd "C-c m")
  #'(lambda ()
      (interactive)
      (frange:restore-frame-position-parameter
       (selected-frame)
       'example-min)))

(define-key global-map (kbd "C-c M")
  #'(lambda ()
      (interactive)
      (frange:restore-frame-position-parameter
       (selected-frame)
       'example-max)))



デフォルトで用意されている機能

  • 右上端へ移動
  • 上端へ移動
  • 右上端へ移動
  • 左端へ移動
  • 右端へ移動
  • 左下端へ移動
  • 下端へ移動
  • 右下端へ移動
  • 上に1移動
  • 左に1移動
  • 右に1移動
  • 下に1移動
  • 現在の位置とサイズを取得
  • 現在の位置とサイズを名前をつけて保存
  • 保存した位置とサイズへ復元

frame-arrange.el に用意されている関数やマクロを使用すれば、任意の操作を実現する関数を定義及び生成することができます。

関数
  • frange:arrange/alist
  • frange:arrange/f
  • frange:arrange-partial-gen
  • frange:arrange
などを使って任意の移動ができます。

マクロ
  • def:frange
  • def:frange/current-frame
を使って任意の移動を行なう関数を生成することができます。
マクロはおまけみたいなものです。

フレームの移動やサイズ変更にはいろんな組み合わせがあるので、全部書くのが面倒でした。
欲しいものをマクロで生成できたら良いんじゃね?みたいな興味本位で書きました。

オレオレ仕様なので、どういうイメージで作ったかは以下のファイルをのぞいてみてください。
必ずしも同様のコードが生成されるわけではありませんので、あくまでイメージとして。

マクロの定義は frame-arrange.el の中にあります。
frame-arrange.el の最後の方で実際に使っているので、そこも参考になるかもしれません。

動機

frame-arrange.el を作った動機。

広い画面で Emacs を使っているとき、私は必ずしも最大化して使いません。
小さめのフレームサイズで使うことが少なくないのです。

Emacs と別のアプリやブラウザを並べて使ったりするのですが、Emacs が邪魔になったり、Emacs のサイズを変えたくなったときにわざわざマウスに手を伸ばすのが面倒でした。

Emacs の位置も毎回違うわけではなく、ブラウザと一緒のときはこの辺、IDE と一緒のときはこのくらいのサイズでこの辺、というのがある程度決まっていました。
なので、そういうことをしてくれる Emacs Lisp が欲しかったのですが、私が探した範囲では小さなコード片くらいしかなかったので自分用に作ることにしました。

Emacs Lisp で数十行以上のコードを書くのは初めてだったので面白かったです。
Scheme や Common Lisp とは結構違うので抵抗があったのですが、今ではなくなりました。
(でも名前空間はやっぱりちょっとアレですよね)

結果的に、コードは少し大袈裟になりましたが、マイナーモードとして公開してもよさそうな塊になった気がしたので公開してみることにしました。

参考


追記

マイナーモードとかライセンスとかよくわからないので、適当にコピペしたので、少し不安です。
何か不備(?)があったら教えてください。

追記2

上記設定例の場合の動作イメージ。
わかりやすく絵を描くのって難しいんですね。。

追記3

frange:initialize 関数が行方不明になってました。
gist のコードを修正しました。

追記4

いくつかバグ取りました。
byte-compileが通りませんでしたが、通るようになりました。

追記5

key-chord.el を使わない場合の設定例とかマクロの使い方とか書きました。

追記6

サイズのインクリメント/デクリメント関数追加、設定の永続化機能追加、バグの修正などを行ないました。

追記7

保存しておいた設定(位置とサイズ)を順番に切り替えて適用する機能を追加しました。
少し変更した設定例を載せました。

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

0 件のコメント:

コメントを投稿