Stargazer の日本語化

rm(list=ls())
library(knitr)
opts_chunk$set(warning=FALSE, message =FALSE)

stargazer は簡単に作表するパッケージである. 基本的にこのチートシート をみれば大体どのようにカスタマイズすればよいかわかるだろう. 日本語での紹介は以下が参考になる.

実際に stargazer を用いれば簡単に基本統計量を表示することができる.

library(stargazer)
stargazer(cars,type="html")
Statistic N Mean St. Dev. Min Max
speed 50 15.400 5.288 4 25
dist 50 42.980 25.769 2 120

また複数の回帰分析の比較表も簡単である.

data(cars)
fm0<-lm(dist~speed, data=cars) 
fm1<-lm(dist~speed + I(speed^2), data=cars) 
stargazer(fm0,fm1,type="html")
Dependent variable:
dist
(1) (2)
speed 3.932*** 0.913
(0.416) (2.034)
I(speed2) 0.100
(0.066)
Constant -17.579** 2.470
(6.758) (14.817)
Observations 50 50
R2 0.651 0.667
Adjusted R2 0.644 0.653
Residual Std. Error 15.380 (df = 48) 15.176 (df = 47)
F Statistic 89.567*** (df = 1; 48) 47.141*** (df = 2; 47)
Note: p<0.1; p<0.05; p<0.01

日本語にするために, 変数名は可能であっても, 統計量の名前の変更方法を私は知らない. さらに出力オプションが latex か html なので, docx 形式の出力はできない. マークダウン形式での出力が望ましいが  stargazer では不可能である.

ここでは基本統計表とモデルの比較表を日本語化してマークダウン形式で出力する方法を示す.

基本統計表

まず tidyverse の助けを借りて, 次のようにデータフレームを作成する.

library(tidyverse)
tab <- gather(cars,key=variables, values) %>% 
  group_by(variables) %>%
  summarize(観測数=n(),平均=mean(values),標準偏差=sd(values),
               最小値=min(values),最大値=max(values)) %>% 
  dplyr::rename(変数=variables)

その上で pander を用いて作成する.

library(pander)
pander(tab)
変数 観測数 平均 標準偏差 最小値 最大値
dist 50 42.98 25.77 2 120
speed 50 15.4 5.288 4 25

モデル比較表

モデルの比較にはパッケージ memiscmtable を使う.

library(memisc)
mtab <- mtable("Model 1"=fm0,"Model 2"=fm1, 
                summary.stats=c("sigma","R-squared","N")) %>%
  relabel("(Intercept)"="定数項","speed"="速度","I(speed^2)"="速度自乗",
              "sigma"="標準誤差","R-squared"="決定係数","N"="観測数")
pander(mtab)
Model 1 Model 2
定数項 -17.579*

(6.758)

2.470

(14.817)

速度 3.932***

(0.416)

0.913

(2.034)

速度自乗 0.100

(0.066)

標準誤差 15.4 15.2
決定係数 0.7 0.7
観測数 50 50

.

 

 

docker で RStudio Server を起動し, bookdown で日本語 pdf を作成する.

以前 bookdown で日本語 PDF を出力する方法を前のブログ または qiita で紹介しました. ここでは表題のように docker で RStudio Server を起動し, bookdown で日本語 pdf を表示する方法を紹介します.

docker で RStudio Server を起動するやり方は知られていて, kazutan さんにより

http://qiita.com/kazutan/items/76c4b478293a5d81296b

および

http://qiita.com/kazutan/items/f1447cbabed8d4dd50b8

で紹介されてます. 基本は

https://github.com/rocker-org/hadleyverse

および

https://github.com/tokyor/rstudio

を参考に作成しています. ただこれだけだと, bookdown で 日本語 PDF は出力できません. 最大の困難は Debian がインストールする texlive が 2014 のため色々必要なのものが導入されていないことです. 個別に導入してもよいかもしれませんが, わたしは

https://github.com/rchurchley/docker-texlive/

を参考に, texlive 2016 を一括に導入する Dockerfile を作成することにしました. その Dockerfile は以下にあります.

https://hub.docker.com/r/kenjimyzk/rstudio-latex/~/dockerfile/

使い方

まず Docker を導入する. そしてターミナル上で以下のコマンドを実行する.

docker pull kenjimyzk/rstudio-latex

つぎに RStudio Server の作業ディレクトリ, 例えば ~/work を作成する. そしてターミナル上で以下のコマンドを実行する.

docker run -d -p 8787:8787 -v ~/work:/home/rstudio/work kenjimyzk/rstudio-latex

そしてブラウザ上のアドレスで

localhost:8787

とする. ログイン時にユーザー名とパスワードを聞かれるのでともに rstudio とする.

RStudio Server が立ち上がるので, [tools] => [shell] としてシェルを立ち上げる. そこで

git clone https://github.com/kenjimyzk/bookdown_ja_template

とする. そうするとテンプレートがクローンできる.

RStudio Server の Files ペイン で, 先程クローンしたフォルダを開き, bookdown_ja_template をクリックして, プロジェクトを立ち上げる.

RStudio Server の Build ペイン で, Build book をクリック. 最初, いくつかのパッケージを導入するために名前空間がおかしくなって上手くコンパイルしない場合があるかもしれないけれど, 少なくとも二度目で上手くいくようです.

なお, 最後のクローンや私がよく使うライブラリを事前に導入した dockerfile が以下にあります. https://hub.docker.com/r/kenjimyzk/myrstudio/~/dockerfile/

まとめ

以上, Docker で booddown をつかって日本語 pdf を作成するやり方を紹介しました. xelatex や cairopdf ではフォントが機種依存になってしまうので, Docker を導入することでそれらが回避できます.

ただ現状 Docker コンテナが 6G というありえない大きさになっています.
今後は

https://raw.githubusercontent.com/kenjimyzk/rstudio-latex/master/installation.profile
を編集し, 導入パッケージの取捨選択し, サイズを小さくしたいと考えています.

投稿者: kenjimyzk カテゴリー: computer

bookdown_ja_template

bookdown で日本語の PDF ファイルを出力できるテンプレートを作成しました.

https://github.com/kenjimyzk/bookdown_ja_template/

基本的には

https://github.com/kazutan/bookdown_ja_template/

をフォークしたものです. kazutan さんは主に html ファイルにおいていろいろ貢献しています.
わたしの貢献は日本語 PDF を作るための設定です.

主な違いは以下です:

  • lualatex でなく (宗教的理由で) xelatex にしている.
  • IPA font でなく IPAex font にしている
  • pdf で bxjsbook を使用していている
  • 日本語付きの図表の例を示している.
  • 日本語の索引と参考文献の例を示している.

使い方は全く同じで, 先のサイトや index.Rmd にかかれています.
ここでは色々補足をします.

bxjsbook

PDF のためのスタイルファイルで bxjsbook を使いました. これについて

http://qiita.com/naqtn/items/7469a07ea797df5e2ecc

が参考になりました. ただ, このままだとなぜかコードの内の日本語が明朝体になってしまいます.
原因不明なので, 冗長ですが preamble.tex

\usepackage[ipa]{zxjafont}

をつけています.

また bxjsbook だと上手く章立てできないので,

pandoc_args: --chapters

を pandoc の引数にしております. ただこれは最新の pandoc だと機能が古いと怒られ

pandoc_args: --top-level-division=chapter

とするようにいわれますが, 現在の windows の RStudio に同封の pandoc ではバージョンが古いため後者は設定できません.

texlive 2016

texlive 2016 が導入されているのが前提になっています. 現在の最新版 2016 でないとスタイルファイル bxjsbook やユニコードに対応した索引作成ソフト upmendex が使えません. Ubuntu で apt-get install でインストールした場合だと上手く動きません. これを機にこちらでインストールすることをオススメします:

https://github.com/scottkosty/install-tl-ubuntu

jeconunicode.bst

bibtex のスタイルファイルは

http://shirotakeda.org/ja/tex-ja/jecon-ja.html

にある jcon.bst のユニコード版 jecon_unicode.bst を使います. 最近第7版が出版された有名な「LaTeX2 ε美文書作成入門」技術評論社で bibtex の章の最後の文章で natbib に対応した日本語パッケージがないといっていますが, それは間違いです. この武田さんの jcon.bst でバッチリ natbib に対応して 著者 (年) という社会科学で標準的に使われる表記で参考文献が作れます. なお現在 texlive 2016 での upbibtex にバグがあるために一部機能がうまくいかないのですが, バグが直り, texlive 2017 で反映されるようです.

http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2006

あと YAML がうまく jecon_unicode.bst を読み込んでくれないので jeconunicode.bst にファイル名を変更してフォルダにおいています. さらにこのファイルは自分用に少しだけ修正しております (Pull Request 中).

ipaex

日本語のフォントを R で表記するために IPAex フォントを使用しています. 古い IPA フォントとの違いは欧米フォントがプロポーシャルになってることです. 以下からダウンロードしてください。

http://ipafont.ipa.go.jp/

作図の際, 日本語フォントを含めた各種のフォントを作図に用いると警告が出る場合があります. 警告無しで使用するために extrafont というパッケージを用います. まず最初に

install.packages("extrafont")
extrafont::font_import(prompt=FALSE)

として読み込みます. 実際に使えるフォントは

extrafont::fonts()

で確認できます. その上でセッションごとに

extrafont::loadfonts(quiet=TRUE)

と実行するとよいでしょう.

R での日本語付きの作図について, いろいろ情報が錯綜し, 私自身いろいろ試行錯誤しました. 現時点の結論として, html 出力では png をデバイスとし, pdf 出力では cairo_pdf をデバイスとし, grDevices の設定を直接いじるのでなく, グラフィクパッケージごとにフォントファミリーを指定するのがよい考えております. そのために IPA フォントは事前にインストールするのが不可欠ですが…

まとめ

以上 bookdown で日本語の pdf を作成するための紹介をしました. この bookdown が広まれば, 編集者にチェックをまかせていた参考文献や索引づくりが自分でできるようになり, ますます出版の敷居が下がってくるのではないでしょうか.

共立出版のホームページをみると

http://www.kyoritsu-pub.co.jp/series/205/

をみると, 「RStudio による Reproducible Research」高橋康介著が予定されています. きっと「ドキュメント・プレゼンテーション生成」の続編で, bookdown が言及されていると思いますので楽しみです.

現在 OS や環境依存を避けるための Docker 環境を構築することを模索しています. それが上手くいけばまた報告させていただきます.

spacemacs の日本語設定 (5: lookup.el)

昔 EPWING というファイル形式があった. 現在その形式の辞書ソフトは発売されていないが, 昔は多数あった. またそうでない形式の辞書ソフトを変換するツールもネットで公開されていた. この EPWING 形式の辞書ソフトを emacs で利用するツールとして lookup.el がある. わたしの記憶が正しければ, Carbon Emacs に標準搭載されていた. 現在も

で公開されているが, melpa などに登録されていない. そのため私のように EPWING 形式の辞書をもっている人間は自分でインストールする必要がある. 情報が古いが, 以下にインストール方法が公開されている.

つい数年前まで, こうした el ファイルをいちいち自分でインストールしていたのが信じられない. 以下, spacemacs でどのように導入し, 利用しているのか紹介する.

lookup.el の導入

ubuntu

以前の 投稿 で, ubuntu での導入方法を述べた. 同様の手順をとればよい. ターミナルから

sudo apt-get install lookup-el

でよい. なお自分で emacs をコンパイルした場合, これではうまくいかない.

mac

以前の 投稿 で, gnupack での導入方法を述べた. 今回, homebrew 経由で導入できるようにした. まず

brew tap kenjimyzk/ebu
brew install ebu
brew tap kenjimyzk/eblook
brew install eblook

とする.

から lookup-1.4+media-20160602.tar.gz を入手し, それを解凍する. ターミナルからそこに,

emacs -batch -l install.el '~/.spacemacs.d/lisp/lookup' '~/.spacemacs.d/info'

を実行する.

windows

以前の 投稿 で, gnupack での導入方法を述べた. 同様の手順をとればよい.

から eblook-1.6.1+media-20150724-ebu-4.4.3-20150301-win64.exe を入手し, それを eblook.exe にリネームしてどこかのフォルダに入れ, 環境変数にそこの PATH を通す. 次に lookup-1.4+media-20160602.tar.gz を入手し, それを解凍する. emacs を開き, M-x eshell を実行し, 解凍したフォルダにディレクトリを移動し,

emacs -batch -l install.el  '~/.spacemacs.d/lisp/lookup' '~/.spacemacs.d/info'

を実行する.

設定ファイル

init.el にある dotspacemacs/user-config に次の設定

(load-file "~/.spacemacs.d/00lookup.el")

を加え, 外部ファイル 00lookup.el として, 次の設定を読みこむように設定している.

;; lookup
(add-to-list 'load-path "~/.spacemacs.d/lisp/lookup/")
(setq lookup-enable-splash nil)
(autoload 'lookup "lookup" nil t)
(autoload 'lookup-region "lookup" nil t)
(autoload 'lookup-pattern "lookup" nil t)
(global-set-key (kbd "C-x l") 'lookup-pattern)
(global-set-key (kbd "C-x C-l") 'lookup-region)

(setq lookup-default-dictionary-options
      '((:stemmer .  stem-english)))
(setq lookup-use-kakasi nil)
(setq lookup-search-agents '(
    (ndeb "~/dict/Cobuild1")
    (ndeb "~/dict/Longman4")
    (ndeb "~/dict/OALD8")
    (ndeb "~/dict/NKEMEJ")
    (ndeb "~/dict/NKEMJE")
    (ndeb "~/dict/KANJIGEN")
    (ndeb "~/dict/KEIZAI")
    (ndeb "~/dict/KOJIEN5")
    (ndeb "~/dict/COLLOC")
    (ndeb "~/dict/SRD-FPW")
    (ndeb "~/dict/EIDAI6")
    (ndeb "~/dict/WADAI5")))

最後の設定は辞書のおいている場所や種類によって異なる. なお以前の投稿では日本語のフォルダ名にしていたが, windows ではうまくいかなくなっているので変更している. また info ファイルの設定はここでは省略する. 以上, 新しい設定は ここ になる.

使い方

先の設定のもと, 検索方法は次の 2 つである.

  • C-x l: 単語を入力して検索する. デフォルトでカーソルにある単語が候補として挙げられる.
  • C-x C-l: リージョンを選択した上でその単語が検索される.

注意することは, evil-mode で検索すれば, その辞書がきちんと操作できなくなっている. その場合, 焦らず C-zemacs-mode に変換すればよい. lookup での使い方は ? を押せばヘルプがでるので, それを参考すればよい. 大抵 SPC で辞書を選び, qlookup を閉じるだけでよいだろう.

spacemacs の日本語設定 (4: pangu-spacing)

日本語文書を作成する際, 全角文字と半角文字には半角スペースをいれるようにしているが, しばしば忘れてしまう. それを避けるために以下を参考にして pangu-spacing.el を導入する.

init.eldotspacemacs/layersdotspacemacs-additional-packages 内部に pangu-spacing を加える. そして init.el にある dotspacemacs/user-config に次の設定

(load-file "~/.spacemacs.d/00pangu-spacing.el")

を加え, 外部ファイル 00pangu-spacing.el として, 次の設定を読みこむように設定している.

;; pangu-spaceing
;;http://rubikitch.com/tag/packagepangu-spacing/
  ;;; chinse-two-byte → japanese に置き換えるだけで日本語でも使える
(setq pangu-spacing-chinese-before-english-regexp
      (rx (group-n 1 (category japanese))
          (group-n 2 (in "a-zA-Z0-9"))))
(setq pangu-spacing-chinese-after-english-regexp
      (rx (group-n 1 (in "a-zA-Z0-9"))
          (group-n 2 (category japanese))))
  ;;; 見た目ではなくて実際にスペースを入れる
(setq pangu-spacing-real-insert-separtor t)
;; text-mode やその派生モード(org-mode 等)のみに使いたいならこれ
(add-hook 'text-mode-hook 'pangu-spacing-mode)
;; すべてのメジャーモードに使ってみたい人はこれを
;; (global-pangu-spacing-mode 1)

以上, 新しい設定は ここ になる.

spacemacs の日本語設定 (3: japanese-holidays)

以下を参考にして, カレンダーに日本語の祝日を付け加える.

init.eldotspacemacs/layersdotspacemacs-additional-packages 内部に japanese-holidays を加える. そして init.el にある dotspacemacs/user-config に次の設定

(load-file "~/.spacemacs.d/00calendar.el")

を加え, 外部ファイル 00calendar.el として, 次の設定を読みこむように設定している.

;; calendar
;; http://d.hatena.ne.jp/rubikitch/20090216/1234746280
(require 'calendar)
;; (setq  number-of-diary-entries 31)
(define-key calendar-mode-map "f" 'calendar-forward-day)
(define-key calendar-mode-map "n" 'calendar-forward-day)
(define-key calendar-mode-map "b" 'calendar-backward-day)

(eval-after-load "holidays"
  '(progn
     (require 'japanese-holidays)
     (setq calendar-holidays ; 他の国の祝日も表示させたい場合は適当に調整
           (append japanese-holidays holiday-local-holidays holiday-other-holidays))
     (setq mark-holidays-in-calendar t) ; 祝日をカレンダーに表示
     ;; 土曜日・日曜日を祝日として表示する場合、以下の設定を追加します。
     ;; 変数はデフォルトで設定済み
     (setq japanese-holiday-weekend '(0 6)     ; 土日を祝日として表示
           japanese-holiday-weekend-marker     ; 土曜日を水色で表示
           '(holiday nil nil nil nil nil japanese-holiday-saturday))
     (add-hook 'calendar-today-visible-hook 'japanese-holiday-mark-weekend)
     (add-hook 'calendar-today-invisible-hook 'japanese-holiday-mark-weekend)
     ;; “きょう”をマークするには以下の設定を追加します。
     (add-hook 'calendar-today-visible-hook 'calendar-mark-today)))

以上, 新しい設定は ここ になる.

spacemacs の日本語設定 (2: SKK)

日本語入力では mac や windows で Google IME を用いている. ただ spacemacs であまり相性がよくない. インサートモードで日本語文章を入力して, ノーマルモードに移ってもひらがなのままになる. 一部のブログで mac でインラインパッチをあてた emacs を使えばよいと書かれているが, わたしの環境だとインサートモード入力中に変換が効かなくなることがあり, 安定して使えない. SKK を導入すると, こうしたことを一気に解決してくれる. SKK は Emacs のための日本語変換といってよい. 昔は導入が少しややこしかったが, 今は melpa 経由でパッケージをインストールすればよいのでとても簡単である. SKK については以下を参照されたい.

導入

SKK を導入するためには init.eldotspacemacs/layers の dotspacemacs-additional-packages '()ddskk を加える. これで SPC q r で再起動すればインストールされる. インストールの最初に Viperize をするか聞かれる. もしかしたら evil-mode としては yes とするべきところかもしれないが, 私はいつも no を選択している.

カスタマイズすることがあれば, .skk ファイルを作成するか, init.el にある dotspacemacs/user-config () に設定を加える. 私は別ファイル 00ddskk.el を作って読み込むようにしている. 私の設定ファイルは ここ にある.

使い方

始めてなら M-x skk-tutorial とする. 詳細は以下にある.

まとめ

spacemacs に日本語入力を便利扱うパッケージ ddskk の導入方法を述べた. 現時点の私の設定は ここ である.

spacemacs の日本語設定 (1: migemo)

前回, 前々回 に予告したように migemo を導入すれば, avy-jump 日本語にもローマ字入力で移動可能になり, helm-swoop でローマ字入力でバッファ検索が可能になる. spacemacs にmigemo を導入するとは, 正確にいうとmigemo という外部プログラムにアクセスするインターフェイスを導入することである. まずは外部プログラムの導入, そして spacemacsの設定を説明する.

C/Migemo の導入

まず外部ファイル migemo を導入する必要がある. 現在は C/Migemo を使うのが普通である.

windows

以下のサイト

にから, バイナリを入手し, 環境変数 PATH にバイナリの場所を追加する. 私は c:/app/cmigemo-default-win64/ にしている.

mac

homebrew を導入しているので

brew install cmigemo

で導入される.

linux

ubuntu だとつぎのコマンドでよい.

sudo apt-get install cmigemo

設定

migemoを導入するためには init.eldotspacemacs/layers の dotspacemacs-additional-packages '()migemoavy-migemo を加える. そして init.el にある 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)

機種によって辞書のディレクトリが違うため, 場合分けしている. これで C-s, C-r などのインクルメンタルサーチで migemo 対応が可能である.

helm をmigemo対応にするには以下でよい.

;;
(with-eval-after-load "helm"
  (helm-migemo-mode +1)
  )

古いブログの記事では helm-migemo の導入といっているが不要である.

avy をmigemo対応にするには以下でよい.

;; avy-migemo
(require 'avy-migemo)
(avy-migemo-mode 1)

まとめ

以上, spacemacs に migemo を導入する方法を記述した. これで avy-jump-word (SPC SPC) で日本語にもジャンプでき,  helm-swoop (SPC s s) でローマ字で日本語検索が可能になる.

機種ごとにまとめた設定ファイルは ここ にある. 前回からの差分は ここ である. なお, わたしはこれを外部ファイル 00migemo.el として, 読みこむように設定している.

spacemacs の使い方 (検索)

前回に続き spacemacs の使い方について, 検索を中心に述べる. 過去の ポスト でバッファの検索は color-moccur+moccur-edit で, 複数ファイルの一括検索 ag+wgrep+ag といったが, わずか 2 年でガラリと変わり, helm+swoophelm-ag になっている. この 2 つは特に設定することなく, spacemacs で利用可能である.

helm-swoop

helm-swoop について

が参考になる.

spacemacs では SPC s s で helm-swoop が起動できる. 単語を検索し, 該当箇所が複数あれば移動したい単語を選択しエンターを押せばその場所にジャンプする. リージョンを事前に選択していれば, SPC s S を使うまでもなくその文字を選択してくれる. リージョン選択していなくても, SPC s S で自動的に単語選択して検索しくれるが, 日本語単語は上手くいかないので事前にリージョン選択する必要がある.

紹介したブログにも書かれているが, helm-resume で以前の検索を再現してくれる. そのキーバインドは SPC h l である.

検索後, C-c C-e で編集することができる. 編集後, C-c C-c とすれば, 検索結果が反映される. 個人的に emacs の標準検索置換機能である M-% よりも使いやすいと感じている.

さらに SPC s C-s で複数のバッファを同時に検索することができる. また migemo を導入することで日本語検索が可能である.

helm-ag

さて当該ディレクトリのもとでの一括検索も可能である. grep が基本であるが, ag を導入していれば, helm-ag が使える. helm-ag について

が参考になる.

使い方の前にまず ag の導入について説明する. windows の場合,

により, バイナリを入手し, 環境変数 PATH にバイナリの場所を追加する.

mac の場合, homebrew を利用する. ターミナルから

brew install ag

を実行すればよい.

ubuntu の場合, ターミナル上から

sudo apt-get install silversearcher-ag

を実行すればよい.

さて使い方であるが, ほどんど helm-swoop と同じである. SPC / で helm-ag が起動できる. 単語を検索し, 該当箇所が複数あれば移動したい単語を選択しエンターを押せばその場所にジャンプする. SPC * だとカーソル上の単語についてリージョン選択することもなく検索してくれる.

検索後, C-c C-e で編集することができる. 編集後, C-c C-c とすれば, 検索結果が反映される. 個人的に M-% (query-replace) よりも使いやすいと感じている.

まとめ

今回は検索について helm-swoop (SPC s s) と helm-ag (SPC /, SPC *) について説明した. その他の検索についても SPC S からコマンドを選んでいけばよい.

なお 日本語のままで検索可能である. さらに migemo を導入すれば, helm-swoop においてローマ字から日本語の検索が簡単に拡張可能である. 次回は migemo の導入方法を説明する.

spacemacs の使い方 (編集)

前回 に続き spacemacs の使い方を編集を中心に述べる. 最低限必要なキーバインドは編集以外なら

  • SPC, M-m, C-z, C-g

だけでなんとかなるといった. 編集についてもカーソル移動と削除キーがついている普通のパソコンなら, アンドゥ, カット, コピー, ペーストのそれぞれのモードのショートカットを覚えればなんとかなる. そのうえで spacemacs でどのように使えばよいかを説明する.

インサートモード

evil-mode, つまり vim では複数のモードがある. ここではノーマルモードとインサートモードとヴィジュアルモードとがある. インサートモードは文字を入力するモードである. ノーマルモードからインサートモードに移るには i,a を押す. それによって, 文字が入力される. 通常の emacs-mode はある意味常時インサートモードといってよい. つぎにヴィジュアルモードは画面選択が可能になるモードである. これについては後で説明する.

移動

カーソル移動だけでなんとかなると言ったが, 以下の機能を覚えておいたほうが便利である.

emacs evil
カーソル移動 C-f/b/n/p l/h/j/k
単語移動 M-f/b w/b/e/W/B/E
行頭/尾 C-a/e 0/^/$
文移動 M-a/e (/)
段落移動 M-{/} {/}
一画面移動 C-v/M-v C-f/b
バッファ移動 M-</> gg/G

最初の行のカーソル移動のショートカットを覚えて, 最終的にはマウスとカーソルを使わないことを目指していきたい.

選択

通常のエディタのシフトと矢印キーかマウスで選択するのを, emacs ではそれらを使わず選択するこができる. emacs-mode では, C-SPC でマークし, さきほどの移動コマンドで範囲を変更する. C-M-SPC で範囲を (S 式のルールに従い) 拡大したり, C-x C-x でマークの始点を変更したりする. 昔の emacs は矩形編集の操作が面倒であったが, バージョン 24.4 以降 C-x SPC という操作でかなり楽になった.

evil-mode のノーマルモードから, また v を押し, ヴィジュアルモードに移行し, 移動コマンドで範囲を選択する. マークの始点の変更は o である. また行ごとの場合は V, 矩形選択の場合は C-v とすればよい.

なお移動コマンドだけでなく, 検索によって範囲を拡大させることができる. 検索については後述する.

さて, spacemacs は expand region というパッケージがすでに導入されていて単語の選択拡大・縮小を簡単に実行できる. SPC v で単語選択に拡大し, もういちど v を押せば文選択に拡大する.

なお単語選択について日本語では文節まで拡大してしまうので, 修正が必要である. そのとき emacs-mode では C-x C-x でマークの始点を変更し, カーソル移動を実施すればよい. evil-mode では o でマークの始点を変更すればよい.

コピペ

windows や linux の「標準」エディタの編集コマンド (cua) との比較でまとめると次のようになる.

emacs evil cua
undo C-/ u C-z
cut C-w c,d C-x
copy M-w y C-c
paste C-y p/P C-v

mac だと コントロールキーのかわりにコマンドキーを使うので併用できる.

windows や linux でも M-x cua-mode にすれば標準の操作が可能になる. C-x, C-c は制限時間内に何も操作なければ利用可能であるが, C-z と C-v は注意が必要である. C-v は PageDown キーを使えば問題無いが, C-z は使えなくなる. キーバインドを変更するか, どちらかのモードだけを利用すると決めておく必要がある. つまり mac を利用する以外は, emacs か evil のどちらかの編集コマンドは覚えたほうがよい.

emacs-mode のとき cut を kill-ring-save といい, copy を kill-region と呼ばれる. キルされたテキストはキルリングに保存される. 一文字削除の C-d や単語削除の M-d など選択を伴わず, キルリングに保存されたり, 保存されないコマンドがあるが, ここでは省略する. 貼り付けについて emacs-mode では貼り付けのことをヤンクといい, C-y で実施する. evil-mode でのヤンクと役割が違うので混乱のないようにされたい.

evil-mode のとき, cut は削除であり, copy はヤンクであり, それぞれコマンド c,d, y と割当てられている. ヴィジュアルモードで選択したものを削除するとき, c だとインサートモードに移動し, d だとノーマルモードに戻る. ヤンク y だとノーマルモードにもどる. ヴィジュアルモードからなにもしないのなら ESC でノーマルモードに戻る.

なお evil-mode では, モーションという動作組み合わせて, ヴィジュアルモードを経ないでノーマルモード上で c,d, y を実行することができる. これが使いこなせるようになると Vim が楽しくなるがここでは説明を省略する.

evil-mode では貼り付けのプットといい, ノーマルモードで p/P を押す. カーソルの後ろに貼り付ける場合 p で, 前に貼り付ける場合 P である. 通常の emacs の貼り付けは大文字の P に対応しているので注意されたい.

さて, emacs は過去のコピーしたものをキルリングに保存している. これは evil-mode で編集したものを保存されている. これを取り出すのは emacs-mode では M-y を実施し, evil-mode では レジスタを指定した貼り付けを実施する. どちらもいささかわかりにくい.

これについて spacemacs は SPC r y (helm-show-kill-ring) を実施すればよい. このときどちらともにキルリングに保存されたものをリストで表示し, 貼り付けたいものを選択することができる.

avy

移動について, カーソル移動だけで十分といったが, emacs は avy が導入されているからである. avy については

を参照されたい.

主な機能は SPC SPC として, 任意の候補が出るので該当キーを押し, 単語移動する. 同様に SPC y で行移動する. また SPC ` でジャンプ前にもどってくれる. たとえば, 文章作成中にスペルミスや誤植などが見つかった場合, ジャンプして直して元に戻ることがマウスを使わず簡単に実行できる.

さらに ayv には便利な機能がある. リスト化すると以下である.

  • 単語選択する前に m を押せば, その単語にジャンプし選択までしてくれる.
  • 単語選択する前に x を押せば, その単語にジャンプし削除までしてくれる.
  • 単語選択する前に n を押せば, その単語にジャンプし選択し, もとに戻ってくれる.

とくに最後の機能は文章作成中に過去に使用した単語を正確に再度使いたい時に重宝する.

なお spacemacs のデフォルトの avy は日本語に対応していない. 単語移動でなく文字移動 (avy-goto-char) をつかえば日本語の文字にジャンプできる. ただ単語選択中の m,x,n といった機能はつかえなくなる.

これについて migemo を導入すれば日本語での単語移動も可能になるので, 今回は変更せずこのままにしておく. migemo の導入について後日説明したい.

まとめ

コピペのキーバンドとカーソル移動だけで, 複雑な移動のキーバインドを覚えることなく spacemacs はかなり便利に扱える. 具体的に移動したい場所には

  • SPC SPC, SPC y, SPC `

で自在に移動する. 選択範囲の拡大・縮小を

  • SPC v

でおこない, 編集を実施する. 特に過去の編集でカットおよびコピーしたものを

  • SPC r y

で実施できる. なお spacemacs の avy は日本語に対応していない. ただ migemo を導入すれば簡単に拡張可能である. migemo の導入方法を説明する前に, 次回は検索について解説する.