キー入力頻度

リマップ後のキーです。

  • j (36) = 4705 (20%)
  • leftctrl (29) = 1551 (6%)
  • k (37) = 1433 (6%)
  • s (31) = 996 (4%)
  • d (32) = 996 (4%)
  • enter (28) = 936 (4%)
  • space (57) = 675 (2%)
  • h (35) = 647 (2%)
  • a (30) = 622 (2%)
  • o (24) = 621 (2%)
  • w (17) = 617 (2%)
  • n (49) = 594 (2%)
  • i (23) = 579 (2%)
  • leftshift (42) = 536 (2%)
  • e (18) = 497 (2%)
  • tab (15) = 467 (2%)
  • t (20) = 466 (2%)
  • u (22) = 460 (2%)
  • f (33) = 419 (1%)
  • g (34) = 415 (1%)
  • leftalt (56) = 400 (1%)
  • l (38) = 391 (1%)
  • r (19) = 364 (1%)
  • backspace (14) = 359 (1%)
  • esc (1) = 297 (1%)
  • comma (51) = 283 (1%)
  • p (25) = 266 (1%)
  • m (50) = 233 (1%)
  • x (45) = 209 (0%)
  • semicolon (39) = 183 (0%)
  • y (21) = 164 (0%)
  • c (46) = 139 (0%)
  • v (47) = 138 (0%)
  • slash (53) = 113 (0%)
  • dot (52) = 113 (0%)
  • z (44) = 104 (0%)
  • b (48) = 91 (0%)
  • 0 (11) = 86 (0%)
  • 1 (2) = 82 (0%)
  • equal (13) = 79 (0%)
  • minus (12) = 69 (0%)
  • 2 (3) = 68 (0%)
  • q (16) = 63 (0%)
  • leftbrace (26) = 51 (0%)
  • 4 (5) = 51 (0%)
  • apostrophe (40) = 48 (0%)
  • rightbrace (27) = 40 (0%)
  • capslock (58) = 33 (0%)
  • 9 (10) = 33 (0%)
  • 8 (9) = 31 (0%)
  • 7 (8) = 30 (0%)
  • grave (41) = 23 (0%)
  • rightshift (54) = 21 (0%)
  • 6 (7) = 17 (0%)
  • 5 (6) = 17 (0%)
  • 3 (4) = 16 (0%)
  • left (105) = 15 (0%)
  • down (108) = 12 (0%)
  • backslash (43) = 10 (0%)
  • up (103) = 6 (0%)
  • right (106) = 5 (0%)
  • f2 (60) = 4 (0%)
  • 102nd (86) = 4 (0%)
  • f1 (59) = 2 (0%)
  • pause (119) = 1 (0%)

謎のキー入れ替え設定メモ

(iron-maiden
  (define-keyboard "HHKB"
                   :path #P"/dev/input/by-id/usb-Topre_Corporation_HHKB_Professional-event-kbd")
  (define-keyboard "Pedal3"
                   :path #P"/dev/input/by-id/usb-RDing_FootSwitch3F1.-event-mouse")
  (define-keyboard "PokerProS"
                   :path #P"/dev/input/by-id/usb-Heng_Yu_Technology_Poker_Pro_S-event-kbd")
  (define-keyboard "Poker2"
                   :path #P"/dev/input/by-id/usb-Heng_Yu_Technology_Poker_II-event-kbd")
  (define-keyboard "Poker2Sub"
                   :path #P"/dev/input/by-id/usb-Heng_Yu_Technology_Poker_II-event-if01")
  (define-keyboard "Race"
                   :path #P"/dev/input/by-id/usb-04d9_USB_Keyboard-event-kbd")
  (define-keyboard "Thinkpad"
                   :path #P"/dev/input/by-id/usb-Lite-On_Technology_Corp._ThinkPad_USB_Keyboard_with_TrackPoint-event-kbd")
  (define-keyboard "Kinesis"
                   :path #P"/dev/input/by-id/usb-05f3_0007-event-kbd")
  (define-keyboard "SinglePedal"
                   :path #P"/dev/input/by-id/usb-MKEYBOARD_3011-event-mouse")
  (define-mouse    "PowerMate"
                   :path #P"/dev/input/by-id/usb-Griffin_Technology__Inc._Griffin_PowerMate-event-if00")
  (define-mouse "SBT"
                :path #P"/dev/input/by-id/usb-Kensington_Kensington_Slimblade_Trackball-event-mouse")
  (define-mouse "RingMouse"
                :name "Genius Ring Mouse nRF")
  (define-keyboard "AnkerBTKB"
                   :name "Anker Bluetooth Keyboard")
  (define-keyboard "LaserKB"
                   :name "ELECOM TK-PBL042")
  (define-keyboard "Internal"
                   :name "AT Translated Set 2 keyboard")

  ; safety
  (let ((ring (imrb:make-ring-buffer 10)))
    (define-processor
      (for-keyboard
        (when-key-down
          (when (= code key-esc)
            (imrb:put-to-buffer ring msec)
            (when-let (next (imrb:next-buffer ring))
              (when (< (- msec next) 2000)
                (imrb:clear-all-buffer ring)
                (sb-ext:exit))))))))

  ; pp
  (define-processor
    (when *output-mode*
      (pp t ev))
    (for-keyboard
      (key-map-to-action
        "<leftalt><leftalt><leftalt>"
        (toggle-output-mode))))

  ; ignore
  (define-processor
    (for-device "PowerMate"
      (next-event)))


  ; フットペダルを特殊キーの入力用に使用する
  (define-processor
    (for-device "SinglePedal"
      (when-key-down
        (setf *foot-pedal-pressed* t))
      (when-key-up
        (setf *foot-pedal-pressed* nil))
      (next-event))
    (when *foot-pedal-pressed*
      (for-keyboard
        (key-map-to-action "w" (imx:warp-pointer 0 -5))
        (key-map-to-action "a" (imx:warp-pointer -5 0))
        (key-map-to-action "s" (imx:warp-pointer 0 5))
        (key-map-to-action "d" (imx:warp-pointer 5 0))
        (change key-1 key-f1)
        (change key-2 key-f2)
        (change key-3 key-f3)
        (change key-4 key-f4)
        (change key-5 key-f5)
        (change key-6 key-f6)
        (change key-7 key-f7)
        (change key-8 key-f8)
        (change key-9 key-f9)
        (change key-0 key-f10)
        (change key-j key-down)
        (change key-k key-up)
        (change key-h key-left)
        (change key-l key-right))))

  ; Kinesis は特殊なため先に処理する
  (define-processor
    (for-device "Kinesis"

      (key-map-to-key "<rightmeta>" "<A-S-enter>")
      (key-map-to-action "<leftalt>" (toggle-output-mode))
      (key-map-to-action "<pagedown>" (toggle-xmonad-pad "zsh"))
      (key-map-to-action "<pageup>" (toggle-xmonad-pad "shell"))

      (x-and-y key-leftctrl key-esc key-leftalt)
      (x-and-y key-rightctrl key-esc key-leftalt)
      (x-and-y key-enter nil key-leftalt)
      (x-and-y key-delete key-enter key-leftalt)
      (x-and-y key-backspace key-space key-leftshift)
      (x-and-y key-apostrophe nil key-leftctrl)

      (key-map-to-key "<f1>" "<A-1>")
      (key-map-to-key "<f2>" "<A-2>")
      (key-map-to-key "<f3>" "<A-3>")
      (key-map-to-key "<f4>" "<A-4>")
      (key-map-to-key "<f5>" "<A-5>")
      (key-map-to-key "<f6>" "<A-6>")
      (key-map-to-key "<f7>" "<A-7>")
      (key-map-to-key "<f8>" "<A-8>")
      (key-map-to-key "<f9>" "<A-9>")
      (key-map-to-key "<f10>" "<A-0>")

      (change key-capslock key-leftctrl)))

  ; pedals
  (define-processor
    (for-device "Pedal3"
      (pedal-shell im dev ev)
      (pedal-ranger im dev ev)
      (pedal-calc im dev ev)))

  ; change keys
  (define-processor
    ; TypeMatrix は特殊なため先に処理する
    (for-device "TypeMatrix"
      (change key-backspace key-esc)
      (change key-capslock key-leftalt)
      (change key-leftmeta key-leftalt)
      (change key-compose key-leftalt)
      (change key-rightctrl key-leftalt)
      (change key-left key-leftalt)
      (change key-leftshift key-leftctrl))

    ; 全キーボード
    (for-keyboard
      (change key-leftmeta key-leftalt)
      (change key-capslock key-leftctrl))

    ; 右上のキーを以下のようにする
    ; [equal][backslash]
    ;   [r-brace][grave]
    ;        [e n t e r]

    ; 対象配列
    ; 左      右
    ; `       Backspace
    ;         Backslash
    (for-device "Race"
      (change key-grave key-esc)
      (change key-backspace key-backslash)
      (change key-backslash key-grave))

    ; 対象配列
    ; 右
    ; Backspace
    ; Backslash
    (for-device ("PokerProS" "Poker2" "AnkerBTKB" "Thinkpad" "Internal")
      (change key-backspace key-backslash)
      (change key-backslash key-grave))

    ; for application
    (for-keyboard
      (when-key-press
        (for-window-class "sxiv"
          (change key-k key-p)
          (change key-j key-n)))))

  ; SandS
  (define-processor
    (x-and-y key-space nil key-leftshift))

  ; key-map
  (define-processor
    (for-keyboard
      (key-map-to-action "<home>" (imx:warp-pointer 5 0))
      (key-map-to-action "<end>" (imx:warp-pointer -5 0))
      (key-map-to-action "<pageup>" (imx:warp-pointer 0 5))
      (key-map-to-action "<pagedown>" (imx:warp-pointer 0 -5))

      (for-window-class "chromium"
        (key-map "<C-S-w>" "<C-w>")
        (key-map "<C-w>" "<backspace>")
        (key-map "<C-h>" "<backspace>"))
      (for-window-class ("Navigator" "Dialog")
        (key-map "<C-h>" "<backspace>"))))

  ; test
  ; (define-processor
  ;   (for-device "RingMouse"
  ;     (/ 0 0)))

  ; rhythm
  (define-processor
    (for-keyboard
      (rhythm-map
        key-leftshift '(1 1 1)
        (press-key im "<A-C-f1>"))
      (rhythm-map
        key-rightshift '(1 1 1)
        (press-key im "<A-C-f7>"))
      (rhythm-map
        key-leftctrl '(100 30)
        (slock)))))

謎のキー入れ替え設定メモ

; TypeMatrix は特殊なため先に処理する
(for-device "TypeMatrix"
  (when-key-press
    (change key-backspace key-esc)
    (change key-capslock key-leftalt)
    (change key-leftmeta key-leftalt)
    (change key-compose key-leftalt)
    (change key-rightctrl key-leftalt)
    (change key-left key-leftalt)
    (change key-leftshift key-leftctrl)))

; 全キーボード
(for-keyboard
  (change key-leftmeta key-leftalt)
  (change key-homepage key-esc)
  (change key-capslock key-leftctrl))

; 右上のキーを以下のようにする
; [equal][backslash]
;   [r-brace][grave]
;        [e n t e r]

; 対象配列
; 左      右
; `       Backspace
;         Backslash
(for-device "Race"
  (change key-grave key-esc)
  (change key-backspace key-backslash)
  (change key-backslash key-grave))

; 対象配列
; 右
; Backspace
; Backslash
(for-device ("PokerProS" "Poker2" "AnkerBTKB" "Thinkpad" "Internal")
  (change key-backspace key-backslash)
  (change key-backslash key-grave))

メモ

pacaur

# pacman -S wget yajl expac
$ mkdir -p /tmp/pkg/{cower,pacaur}

$ cd /tmp/pkg/cower
$ wget 'https://aur.archlinux.org/packages/co/cower/PKGBUILD'
$ makepkg -f
# pacman -U *.xz

$ cd ../pacaur
$ wget 'https://aur.archlinux.org/packages/pa/pacaur/PKGBUILD'
$ makepkg -f
# pacman -U *.xz

wifi

# pacman -S wifi_menu dialog wpa_supplicant
# wifi_menu
# vim /etc/netctl/my-
# vim /etc/resolv.conf

git log から1年間の変更行数の合計を取得する (結果も書いてみた)

リポジトリ全体

git log --follow --stat --after=2013-01-01 --before=2014-01-01 . | grep insertions | awk '{ins+=$4;del+=$6} END{print ins,del,(ins-del)}'

特定のファイル

.vimrc でやってみる。

git log --follow --stat --after=2013-01-01 --before=2014-01-01 .vimrc | grep insertions | awk '{ins+=$4;del+=$6} END{print ins,del,(ins-del)}'

特定のコミッター

「--author」 で指定すればいい

git log --follow --author=anekos --stat --after=2013-01-01 --before=2014-01-01 .vimrc | grep insertions | awk '{ins+=$4;del+=$6} END{print ins,del,(ins-del)}'

これで大丈夫だろうか。

結果

「追加、削除、その差」の組です

.vimrc 2013

3995 1542 2453

XMonad

2011年 = 3255 1555 1700
2012年 = 6717 4556 2161
2013年 = 1404 566 838

vimpr (anekos のコミットだけ、面倒なので全期間)

47037 15769 31268

XMonad の NamedScratchPad と restart.vim のアギャーーーー!

これは、タンスの裏の隙間に潜んだマンボウや棚の上に潜んだモモンガが襲い掛かってくる Vim Advent Calendar 2013 : ATNDの 100 日目の記事です。

XMonad 伝説

XMonad には、特定の(アプリを起動|アプリのウィンドウを出し入れ)する、「スクラッチパッド」という機能があります。
これを使うと、ホットキーで gVim のメモ帳などを簡単に呼び出したり、非表示化できます。

これは超便利なのですが、restart.vim で再起動してしまうと問題が起きます。
スクラッチパッドのウィンドウとみなされなくなってしまい、ホットキーで呼び出したつもりが、新規に gVim が起動してしまうのです。

原因は、スクラッチパッドウィンドウの特定をするのに各 Window に付随するプロパティ値などを使う必要があり、それが再起動により消えてしまうから。
(プロパティを使わないと、複数gVim ウィンドウがあったときにどれをスクラッチパッドとしたいのか判断できない)

解決方法

restart.vim には、再起動後に実行するコマンドを設定する機能(?)があるので、それを用いてプロパティ値の復帰を行います。
ただ、起動時に指定する以外の標準的な方法がなさそうなので、xprop コマンドを実行する関数を作ってやります。
(ついでに、起動後自分で任意の値に変更できるように、コマンドも定義します)

function! s:SetWindowRole(role)
  call system(printf('xprop -id %s -f WM_WINDOW_ROLE 8s -set WM_WINDOW_ROLE %s', v:windowid, a:role))
endfunction
command! -bar -nargs=* SetWindowRole call s:SetWindowRole(<q-args>)

あとは、restart.vim が復帰時に使うコマンドを生成する関数の定義と、設定です。

function! s:OnRestart()
  let res = [] " ここに復帰時に実行したいコマンドを突っ込んでいく

  " 念の為&手抜きで、role に使用する文字を制限してる ([a-zA-Z_-])
  let l:window_role = substitute(system('xprop -id ' . v:windowid . ' WM_WINDOW_ROLE'), '^.*= "\([a-zA-Z_-]\+\)".*', '\1', 'g')
  if match(l:window_role, "^WM_WINDOW_ROLE:.*not found") < 0
    call add(res, 'SetWindowRole ' . l:window_role)
  endif

  return join(res, ' | ')
endfunction

let g:restart_save_fn = [function('s:OnRestart')]

できた!

第三部完

起動時の role の設定

ちなみに、gVim の場合、以下のようするだけでウィンドウの WM_WINDOW_ROLE プロパティを設定できます。
初めに起動するときは、これで適当な名前をつけてやれば OK です。

gvim --role notes ~/notes.txt

XMonad の設定はこちら

https://bitbucket.org/anekos/xmonad-conf/

スクラッチパッドの設定は lib/Anekos/Config/Scratchpad.hs