技術memo

関数型ゴースト

キーカスタマイズツールKeyhacと日本語入力システムSKKがオススメだけどオススメしづらい話

Keyhacの話

WindowsMac限定ですけど、Keyhacって常駐アプリがあります。

たとえば通常ではCtrl+cでテキストやファイルをコピーするところを、Alt+wでコピーするように変更したりできます。 つまり、Emacsキーバインドに洗脳されてしまった人がOS全体の操作感をEmacs風にできます。オススメ層が狭いですね。 まあそれに限らず、どこでも使えるクリップボード履歴が便利なので、それだけでもオススメだとは思います。

設定は Windows の操作を emacs のキーバインドで行うための設定 (Keyhac版) - NTEmacs @ ウィキ - アットウィキを参考にしてやるといい感じです。でもどうしてwikiなんでしょうか、githubにでも上げてほしいです。

私は最近は開発にEmacsを使うことも増えたのでそこまで不便してないのですが、.NET開発だとVisual Studioなので、キーバインドが辛いという問題がありました。 ここにも以前XKeymacsがおすすめと書いたのですが、なぜだかどうにも処理が不安定なことがあり、最近はKeyhacを常用しています。

設定がファイル(Pythonコード)で保存できるのもいいかんじですね。設定をdotfileリポジトリにアップしておいて自動で同期とか、そこまではちょっとできてないのですが、今後の課題です。設定ファイルのパスを環境変数で指定したりできないんでしょうか。よくわかりません。

SKKの話

日本語入力するとき、皆さんMSIMEとかGoogleIMEを使っていると思うんですけど、SKKという種類のものに最近(ここ1年くらい)はまっています。

入力時に、たとえば「私は走る」って入力しようと思ったら watashi<space>(変換候補を選ぶ)<enter>ha<enter>hashiru<space>(変換候補を選ぶ)<enter> みたいに入力するのが普通です。それがSKKだとWatashi<space>(変換候補を選ぶ)haHashiRu(変換候補を選ぶ)<enter> みたいに入力します。くわしくはググってください。SKKとは (エスケイケイとは) [単語記事] - ニコニコ大百科このあたりとか。

特徴としては以下です。

  • 送り仮名位置の指定を大文字入力にします(例: HashiRu → 走る)
  • 漢字変換しないときはひらがなモード、カタカナモードで変換なしに入力し続けられます
  • 変換候補の選択がしやすいです
    • 直近2, 3候補で出なければ一覧表示され、ホームポジションのどれかのキーで確定するか、ページ送りできます
    • 使用した変換候補は次の変換時には上位に表示されるようになるので、多用する変換はラクになります
  • 辞書の登録、削除がスムーズです
    • 変換候補が一番最後まで無かった場合、自動で登録処理に移ります
    • 削除する場合は変換候補を選択している状態で特定のキーを押すだけです
  • 中毒性があります
    • もう普通の入力には戻れません
  • typoや誤変換が減ったりはしません
    • 一緒に仕事してるチームメンバー複数の証言があります

実際にインストールするツールとしては、OSや環境によって複数の選択肢がありますが、例えば以下です。

CorvusSKKだとカタカナモードからCtrl+jでひらがなモードに戻るのですが、ibus-skkだとそうはならないので、そこだけは慣れでカバーするしかないかなあと思っています。

オススメしづらい話

どちらもマシン全体のキー操作に影響するツールなので、慣れると便利ですが、他の人に操作を替わるときには戸惑いがあります。 解決策としては、一時的にKeyhacやSKKをオフにするとか、周りの皆をSKKユーザーにする等があります。

こまってる話

WebブラウザでもEmacs風のキーバインドにしたいとか、マウスにあまり触れずに操作したいという欲求はあるのですが、Chromeだとあまりいいかんじのソリューションが見当りません。 FirefoxならKeySnailがあったのですが、それも開発が続く(続いている)のか怪しいですし……。

Keyhacが動作しているときはブラウザ上でもさほどストレスないのですが、対応外のOSでは代替案がないです。 こまりました。

雑な感じですけど、とりあえずこんなところで。

Spacemacsを使い始めた話 #emacs #spacemacs

Spacemacsってなに?

  • Emacsの拡張(魔改造?)
  • 全体的に人間に優しくなった(キーボードショートカットのサジェストとか出たりする)
  • 設定管理をいいかんじにしてくれる(layerシステム)
  • キーバインドVim(Evil)かEmacsか選べる
    • 私はEmacsバインドで使ってます

おすすめする理由

  • 素のEmacsよりはいろいろ親切(上記)
  • とりあえず各種プログラミング言語IDEとか覚えなくても開発し始められて便利
    • デバッガとかは諦めてください
    • Emacsキーバインドに洗脳されることさえ受け入れれば入力で迷わなくなります
      • Vim派でもEvilなら大丈夫(たぶん)
  • (Spacemacsに限った話ではないけど)ターミナルまでEmacs上で操作できるようになってくると、マウス触ることがほぼなくなるくらいにはキーボードだけで操作できる時間が増えてうれしいです
  • Vim派のひとと宗教戦争(笑)でネタにできて楽しいです(冗談です)

導入方法

めんどうなのでググってください

使っててオススメの拡張

利用中のバージョンはSpacemacs 0.200.7、Emacs 24.5.1、Ubuntu 16.04.2 LTS(デスクトップ)です。

もろもろ検索 ivy

Spacemacsのデフォルトではhelmが推奨ですが、ivy(swiper)もいい感じに動いてくれます。 migemoローマ字入力でいいかんじに日本語を検索してくれるやつです。 ivyでmigemoを使うのにググってもよくわからなかったのですが、avy-migemo-e.g.swiperでいいみたいです。 cmigemoは別途インストールしてください。 クリップボード履歴の検索はcounselってやつみたいです。

設定

  • dotspacemacs-configuration-layersに ivy
  • helm関連のデフォルト設定は全部コメントアウト
  • dotspacemacs-additional-packagesに avy-migemo
  • dotspacemacs/user-configで以下
  ;; migemo
  (require 'migemo)
  (setq migemo-command "cmigemo")
  (setq migemo-options '("-q" "--emacs" "-i" "\a"))
  (cond
   ((eq system-type 'darwin)
    (setq migemo-dictionary "/usr/local/share/migemo/utf-8/migemo-dict")
    )
   ((eq system-type 'gnu/linux)
    (setq migemo-dictionary "/usr/share/cmigemo/utf-8/migemo-dict")
    )
   ((eq system-type 'windows-nt)
    (setq migemo-dictionary "c:/app/cmigemo-default-win64/dict/utf-8/migemo-dict")
    ))
  (setq migemo-user-dictionary nil)
  (setq migemo-regex-dictionary nil)
  (setq migemo-coding-system 'utf-8-unix)
  ;; initialize migemo
  (migemo-init)
  ;; avy-migemo
  (require 'avy-migemo)
  (avy-migemo-mode 1)
  (require 'avy-migemo-e.g.swiper)
  ;; M-yでkill-ring履歴から検索
  (global-set-key (kbd "M-y") 'counsel-yank-pop)

シェル multi-term

Emacs上でシェルを動かす場合はいくつか選択肢があるのですが、なんかよさそうだったのでmulti-termにしてみました。 シェル上でのコピペがつらいなーという感じだったのですが、コピーしたいときはモード切り替えするのが無難みたいです。 Windows上でシェルを動かすのは諦めたので、もっぱらUbuntuでしか使ってないです。

設定

  • dotspacemacs-configuration-layersに shell
  • dotspacemacs/user-configで以下。キーバインドはお好みで。
  ;; multi-term
  ;; emacs に認識させたいキーがある場合は、term-unbind-key-list に追加する
  (require 'multi-term)
  (dolist (x '("C-q"))
    (add-to-list 'term-unbind-key-list x))
  ;; terminal に直接通したいキーがある場合は、term-unbind-key-listからdeleteする
  ;(dolist (x '("C-c"))
  ;  (delete x term-unbind-key-list))
  ;; term-mode-hook
  (add-hook
   'term-mode-hook
   '(lambda ()
      (define-key term-raw-map "\C-h" 'term-send-backspace)
      (define-key term-raw-map "\C-y" 'term-paste)
      (define-key term-raw-map term-view-toggle-key 'toggle-term-view)))
  ;; C-q c で multi-term を起動する
  (define-key ctl-q-map (kbd "c") 'multi-term); 事前に (defvar ctl-q-map (make-keymap)) (define-key global-map (kbd "C-q") ctl-q-map) とかしてるのが前提なので普通は global-set-keyとかでいけるはずなので適当にしてください
  ;; C-t で term-mode と fundamental-mode + view-modeを切り替える
  (setq term-view-toggle-key (kbd "C-t"))
  (defun toggle-term-view () (interactive)
         (cond ((eq major-mode 'term-mode)
                (fundamental-mode)
                (view-mode)
                (local-set-key term-view-toggle-key 'toggle-term-view)
                (setq multi-term-cursor-point (point)))
               ((eq major-mode 'fundamental-mode)
                (View-exit)
                (goto-char multi-term-cursor-point)
                (multi-term-internal))))

ファイルツリーをEmacs上で見る neotree

spacemacsのデフォルトで使えます。 M-x neotreeとかやると起動します。面倒ならglobal-set-keyしてください。 M-x neotree-dirまたはneotreeのバッファ上でC-c cとやるとツリー表示のルートディレクトリを移動できます。 neotreeのバッファに移動してからのswiperでのバッファ内検索が本当に捗るのでおすすめです。そうでもないか。

その他雑感

あとは各言語のlayerいれたりキーバインドをいじったりしてるくらいです。 オレオレレイヤーは作らずに、dotspacemacs/user-configを秘伝のタレ置き場として雑につかっても、とりあえずなんとかなってます。

ところでキーバインドでC-hをバックスペースにしたい派なんですが、その場合spacemacsキー(EvilのひとはSPC, Emacsバインドの人はM-m)を押したときのヘルプのページングとバインドが被ります。いろいろ試したんですが、とりあえず下記にしたらうまくいきました。理由はよくわかりません。とりあえずC-hかF1押しておけばいいかんじに解釈してくれます。

  (global-set-key (kbd "C-h") 'delete-backward-char)
  (global-set-key (kbd "<F1>") help-map)

あとWindows10でNTEmacs使ってる場合、M-mを押すとウィンドウが最小化されて「ウオアアアアア!!!」ってなるんですが未解決です。たすけてください。

とりあえずこんなところで。