Emacs

ac-mozc : モードレス日本語入力を試してみた

随分前に一度試してみたが、mozc.elと併用する時に若干変換ルールに違いがあって使いにくく、そのうち使わなくなっていた。 その後、elispの勉強も進み Emacsのスキルも多少向上したので、再度工夫して試してみることにした。

mozc.el導入時には、ローマ字テーブルに azik を使っていたが、これが曲者だということに最近気づいた。結局、標準の mozc.elの romotableを使って、azikのうち手慣れたものだけ追加して試してみたところ、快適に使えるようになったので備忘録に残しておくことにした。

アルファベットと日本語との間に半角スペースを空けるかどうかについては諸論あるけれど、見やすさを優先した。

pangu-spacing.elというパッケージを使うときは自動的に処理してくれるのでいのだけれど、数字にも反応するので日付表示のときはどうにも間の抜けた感じになる。 なので数字には対応させないようにした。

使ってみた感想

スムーズに変換できているときにはとても効率がいいのだけれど、一度ミスタイプになったものを修正しようとするとおかしな変換になるときがあり、 修正するときは mozc-modeにして対応するということが多い。結局、どちらが快適という点はよくわからない。

変換スピードがもう少し改善されたら更に使いやすくなると思うので、誰か companyと連携した ac-mozc作ってくれないかしらと思う。

 ;; ac-mozc with extended auto-complete
  (leaf auto-complete
	:ensure t
	:bind (:ac-completing-map
		   ("<tab>" . ac-next)
		   ("<backtab>" . ac-previous))
	:hook ((text-mode-hook markdown-mode-hook) . auto-complete-mode)
	:custom (ac-comphist-file . "~/.emacs.d/tmp/ac-comphist.dat")
	:config
	(leaf ac-mozc
	  :ensure t
	  :hook ((text-mode-hook markdown-mode-hook) . my-ac-mozc-setup)
	  :config
	  (add-to-list 'ac-modes '(text-mode . markdown-mode))
	  (bind-key* "<henkan>" 'ac-complete-mozc ac-mode-map)
	  (defun my-ac-mozc-setup ()
		(setq ac-sources
			  '(ac-source-mozc ac-source-ascii-words-in-same-mode-buffers))
		(set (make-local-variable 'ac-auto-show-menu) 0.2)))
	;; auto add space between Japanese and English characters.
	(leaf pangu-spacing
	  :ensure t
	  :hook (markdown-mode-hook . pangu-spacing-mode)
	  :custom (pangu-spacing-real-insert-separtor . t)))

Emacs : Open Last Closed Buffer

darkroom-modeを使うときは、Syntax Highlightが邪魔なので、どのモードのファイルであっても強制的に text-modeで開くように設定している。 当然ながら darkuroom-modeから抜けるときにはもとのモードに戻す必要がある。

もとの major-modeを記憶させておいて restoreすればいいのだが、 auto-save-buffers-enhanced で自動保存しているので、回りくどいことをしなくても一度 Kill-bufferして再び読み込めばよい。

いろいろググって下記の Tipsを見つけた。

原案では、多機能で長いコードになっていましたが、私には必要のない部分は削って dietしました。

;; Open last closed file
(defvar my:recently-closed-buffers nil)

(defun my:close-current-buffer ()
  "Close the current buffer."
  (interactive)
  (setq my:recently-closed-buffers
		(cons (cons (buffer-name) (buffer-file-name)) my:recently-closed-buffers))
  (kill-buffer (current-buffer)))

(defun my:open-last-closed ()
  "Open the last closed file."
  (interactive)
  (find-file (cdr (pop my:recently-closed-buffers))))

ようは、kill-buffer の代りに my:close-current-buffer を使い、再読込したいときに my:open-last-closed すればよいことになる。

darkroom-modeの in/out 設定は以下のようになった。

(leaf darkroom
  :ensure t
  :bind ("<f12>" . my:darkroom-in)
  :config
  (bind-key "<f12>" 'my:darkroom-out darkroom-mode-map)

  (defun my:darkroom-in ()
	(interactive)
	(display-line-numbers-mode 0)
	(setq line-spacing 0.4)
	(darkroom-tentative-mode 1))


  (defun my:darkroom-out ()
	(interactive)
	(darkroom-tentative-mode 0)
	(setq line-spacing 0.1)
	(display-line-numbers-mode 1)
	(my:close-current-buffer)
	(my:open-last-closed)))

つまり、darkroom-outのとき、一度 bufferを閉じて(kill-buffer)、再度読み込むという処理をしているわけである。

Emacs : 作業目的別にテーマを切り替えて使う

Melpaから package installできる Emacsテーマは、たくさんあってお好みで選べるようになりとても便利なのですが、一つに絞り込むのは難しいですね。

私の場合、作業目的に応じて3つのテーマを切り替えて使えるようにしています。

1. iceberg-themes

普段使いで目に優しいテーマ:iceberg-theme(自作テーマ)

私の Emacsは、執筆むけに使うことが多く、日本語の文章作成、編集が大半ですので、目に優しいこのテーマを愛用しています。

もともとは、Vim向けに開発された、目に優しいダークブルーの配色です。

Emacs向けに移植されたものは、幾つか存在しますが、お好みにカスタマイズしたかったので自作しました。GitHubに置いてます。

Alt Text

2. doom-doracura.theme

コード編集するときのテーマ:doom-dracura.theme

ごくたまに Emacs-Lispや Perlスクリプトなどを編集することもあるので、そのときは視認性に優れていて多くの Emacserの間でも普及しているこのテーマを愛用しています。

Alt Text

3. doom-solarized-light.theme

執筆モードでリラックスできるテーマ:doom-solarized-light.theme

Darkroom-mode で、短い文章を書いたり、エッセイの下書き、編集などをするときに珈琲を飲みながらゆったりした気分で文字書きできるので愛用しています。メニューバーもモードライも一切なしの Fullscreen画面は白紙の上になぐり書きしているかのようで快適です。

別途 installしてもよかったのですが doom-themesの中に solarized-light.themeもあったので、そちらを使っています。

Alt Text

4. テーマを切り替えて使うための設定

同様の趣旨で作られたものが Melpaでも見つかったのですが、私の場合うまく作動しなかったので独自に関数を作りました。

というより下記記事からのパクリです。

(leaf doom-themes
  :ensure t
  :init
  (leaf iceberg.emacs :el-get minorugh/iceberg.emacs)
  (add-to-list 'custom-theme-load-path "~/.emacs.d/el-get/iceberg.emacs/"))

(leaf cycle-custom-theme
  :config
  (setq my:themes (list 'iceberg 'doom-solarized-light 'doom-dracula))
  (setq curr-theme my:themes)

  (defun cycle-custom-theme ()
	"Switch themes to cycle."
	(interactive)
	(disable-theme (car curr-theme))
	(setq curr-theme (cdr curr-theme))
	(if (null curr-theme) (setq curr-theme my:themes))
	(load-theme (car curr-theme) t)
	(message "%s" (car curr-theme)))

  (bind-key "<f11>" 'cycle-custom-theme)
  (setq curr-theme my:themes)
  (load-theme (car curr-theme) t))

Gist on Emacs

みなさん、Emacsで Gist 使ってますか?

私も気軽に使っているのですが GitHub Gist の Webページを開いて直接コード書き込んだりコピペするというのは何げに中途半端ですね。

ローカルに cloneして git管理するという Tipsも見かけましたが、そもそもバージョン管理がしたいのであればGistにこだわらず、素直にリポジトリで管理すれば済むことです。

何がしたいのか整理してみる

  • Emacsで開いている Buffer(or region)をそのまま即 gistしたい。
  • gistに成功したら、結果をブラウザで開いてほしい。
  • 自分の GitHub Gist ページを一発で開きたい。

試行錯誤しましたが、yagist.el を package installすれば簡単だと気づきました。 yagist.el には、いろいろ機能があるのですが、私の場合は必要な関数だけ利用しています。

ターミナルで gist コマンドが扱えること

このTipsは、ターミナルからコマンドラインで gist が扱えるように設定済であることが前提です。

ターミナルで gist -help を打つといろいろオプションパラメターがわかります。

Usage: gist [-o|-c|-e] [-p] [-s] [-R] [-d DESC] [-u URL]
                          [--skip-empty] [-P] [-f NAME|-t EXT]* FILE*
       gist --login
       gist [-l|-r]

        --login                      Authenticate gist on this computer.
    -f, --filename [NAME.EXTENSION]  Sets the filename and syntax type.
    -t, --type [EXTENSION]           Sets the file extension and syntax type.
    -p, --private                    Makes your gist private.
        --no-private
    -d, --description DESCRIPTION    Adds a description to your gist.
    -s, --shorten                    Shorten the gist URL using git.io.
    -u, --update [ URL | ID ]        Update an existing gist.
    -c, --copy                       Copy the resulting URL to the clipboard
    -e, --embed                      Copy the embed code for the gist to the clipboard
    -o, --open                       Open the resulting URL in a browser
        --no-open
        --skip-empty                 Skip gisting empty files
    -P, --paste                      Paste from the clipboard to gist
    -R, --raw                        Display raw URL of the new gist
    -l, --list [USER]                List all gists for user
    -r, --read ID [FILENAME]         Read a gist and print out the contents
        --delete [ URL | ID ]        Delete a gist
    -h, --help                       Show this message.
    -v, --version                    Print the version.

Emacsの設定

1. yagist-region-or-buffer

名前の通り Emacsで開いている Buffer(or region)を POSTしてくれます。

GitHub Pagesにサイトを開設

Emacsの設定に関する情報を備忘録としてまとめたので GitHub Pagesに置くことにした。

GitHub Pagesの場合は Jekyllプロジェクトを pushするだけで HTMLに変換してくれるらしい…ということなので試してみたらすんなり成功した。

Alt Text

jekyllには、sphinx_rtd_theme に似た jekyll-rtd-theme があるのでこれを採用した。

Deplpy環境

この themeは特殊なのか、設定がまちがっているのかよくわからなかったが、ローカルでのプレビューはエラーが出てうまく行かなかった。

結局、git pushするだけになったので deploy.shmakefile を書いて自動化しました。deployに成功すると自動的にプラウザーで GitHub Pqgesを開くというものです。markdownファイルの編集が終わったら make k するだけで自動処理します。

deploy.sh

#!/bin/bash
git checkout master
git add -A
git commit -m "Update blog"
git push origin master

makefile

a.out: github

github:
	~/src/github.com/minorugh/minorugh.github.io/deploy.sh
	chromium https://minorugh.github.io

Emacs27.2をInstall

Emacs27.2の安定版がリリースされたのでInstallした。

私の場合は、makefileを下記のように修正してmakeコマンドを実行するだけで簡単にInstallできるようにしている。

## makefile
emacs-latest: ## Install latest version of emacs
	cd ${HOME}/src;\
	wget https://ftp.gnu.org/pub/gnu/emacs/emacs-27.2.tar.gz;\
	tar -xzvf emacs-27.2.tar.gz;\
	cd emacs-27.2;\
	./configure;\
	make;\
	sudo make install;\
$ make emacs-latest

スクリーンショット

Emacs27.2を起動し、Dashboard画面を表示させたスクショです。

Alt Text

  • Debianも10(buster)から11(bullseye)になったみたいなのでアップデートする予定。

EmacsのときにXIMを無効化する

emacs-mozcを使っているときは、紛らわしいのでfcitxをOFFにしておきたい…と、あれこれ悩んでいたのですが、「Emacs利用時にはXIMを無効にする」というのはが常識だったようで今更ながら ~/.Xresources を設定しました。これを設定すると何故かEmacsの起動も若干早くなる。不思議

!~/.Xresources
! Emacs XIMを無効化
Emacs*useXIM: false

私の場合、fcitxのON/OFFをWindowsにあわせて hiragana-katakana に設定しているのですが、 上記を設定することでEmacs利用時にはこのキーが空いてくるので、emacs-mozcのON/OFFも hiragana-katakana に割り当てることにしました。

ようするに、emacs利用時でもそうでないときでも同じキーでFEPのON/OFFが可能となりました。

参考

Scratch bufferを付箋として使う

Alt Text

Emacsのscratchバッファーを簡易メモとして使うために作られたパッケージはいくつかありますが、設定だけで実現できる簡単なものを紹介します。必要な手順は以下の通りです。

  1. Scratch buffer を kill させない。
  2. Scratch buffer の内容を記憶させる。
  3. ワンキーで Scratch bufferを表示させる。

Scratch buffer を kill させない

特にpackageを導入せずともemacsの標準機能で実現できます。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Set buffer that can not be killed.

(with-current-buffer "*scratch*"
  (emacs-lock-mode 'kill))

設定反映後、scratch bufferを kill-buffer すると Buffer "*scratch*" is locked and cannot be killed とmessageがでます。

Scratch buffer の内容を記憶させる

persistent-scratch というpackageもありますが、大方のemacserは使っていると思う auto-save-buffers-enhanced の設定で実現できます。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; auto-save-buffers-enhanced

(setq auto-save-buffers-enhanced-quiet-save-p t)
;; scratch bufferを `~/.emacs.d/scratch` に保存
(setq auto-save-buffers-enhanced-save-scratch-buffer-to-file-p t)
(setq auto-save-buffers-enhanced-file-related-with-scratch-buffer
      (locate-user-emacs-file "scratch"))
(auto-save-buffers-enhanced t)

ワンキーで Scratch bufferを表示させる

popwinの機能を使います。my:pop-scratch を起動するとscratch bufferがpopupします。メモしたあと C-g で隠せるので便利です。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Popup the scratch buffer

(bind-key
 "s-x"
 (defun my:pop-scratch ()
   "Popup the scratch buffer."
   (interactive)
   (setq popwin:special-display-config '("*scratch*"))
   (display-buffer "*scratch*")))

mac⌘英かな.appをEmacs専用に使う

macのkeyboard customizerとしては、 Karabiner-Element が有名ですが、Emacs専用として使うなら ⌘英かな.app が超簡単でおすすめです。

コンセプト

通常は、他のキーと組み合わせて機能させる修飾キー、Command_L command_R Option_L Fn かな は単独では何も仕事をしません。そこで、⌘英かな.appを使ってEmacsのキーバインドを割り当てようというものです。

比較的頻繁に操作するキーバインドを以下のように設定すればワンキー操作で動きます。いづれもFunctionキーに割り当てるという発想もありますが、手近な修飾キーを利用することでより便利に操作できます。

キーリマップ

key remap command
Command_L C-g keyboard-quit
Command_R s-m mozc-temp-convert
Option_L s-n neo-tree-toggle
Fn C-j emmet-expand-line
かな s-j toggle-input-method

設定法

EmacsのFunction key設定を公開

あまり役に立つTipsではありませんが、自分の設定を公開します。みなさんの「私の場合は…」というのを教えていただけると嬉しいです。

F1:help-command

F1は、Deaultでいろんなhelp-commadへのprifixとして設定されているのでそのまま使います。which-key.el を導入することで各コマンドのガイドがミニバファーに表示されるので便利です。 Alt Text

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; which-key
(require 'which-key)
(add-hook 'after-init-hook #'which-key-mode)

F2:hydra-compile

一般的には此処に、M-x compileを割り当てている人が多いと思います。私はいろんな作業をmakefaileで自動化しているので目的に応じてコマンドが使えるようにhydraでメニューを設定して割り当てています。

Alt Text

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; compile

(bind-key
 [f2]
 (defhydra hydra-compile (:color red :hint nil)
   "
 🗿 Compile: make _k_  _a_ll  _u_pftp  _m_ove  _b_klog  _g_it  _c_lean   🐾 "
   ("k" my:make-k :exit t)
   ("a" my:make-all :exit t)
   ("u" my:make-upftp :exit t)
   ("m" my:make-move :exit t)
   ("g" my:make-git :exit t)
   ("b" my:make-bklog :exit t)
   ("c" mymake-clean)))

F3:iconify-or-deiconify-frame

emacsclient使用時という条件下でフレームのポップアップ/最小化をtoggleさせます。

;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; iconify-or-deiconify-frame

(bind-key "<f3>" 'iconify-or-deiconify-frame)

F4:Toggle current buffer and scratch buffer.

カレントバッファーとScrtchバッファーとをtoggleさせます。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Toggle current buffer and `*scratch*` buffer

(defvar toggle-scratch-prev-buffer nil)
(defun toggle-scratch()
  "Toggle current buffer and *scratch* buffer."
  (interactive)
  (if (not (string= "*scratch*" (buffer-name)))
      (progn
	(setq toggle-scratch-prev-buffer (buffer-name))
	(switch-to-buffer "*scratch*"))
    (switch-to-buffer toggle-scratch-prev-buffer)))
(bind-key "<f4>" 'toggle-scratch)

F5:quickrun

ごくたまに perlruby などのミニスクリプトを自作することもあるのでquickrunで簡単に試運転できるようにしています。