2016 Emacs

Table of Contents

ホーム / 講義 / ruby / OO / poker開発 / emacs / meta-ruby / note / github-repos / svn-repos 2015 /

1 org文書の構造

1.1 #10 巨大なオーガナイズシステム「org-mode」の世界 (Software Design 2015年2月号掲載記事) Emacs org-mode インストール 設定 使い方

1.2 文書の構造

Emacs で M-x info で,Org-mode を開き,Document Structure を読みましょ う。

  • headlines
  • lists
  • drawers
  • blocks

1.4 example

package Package #GreenYellow/LightGoldenRodYellow {
Class01 <|-- Class02
Class03 *-- Class04
Class05 o-- Class06
Class07 .. Class08
Class09 -- Class10
}

1.5 設定

setenv GRAPHVIZ_DOT /opt/local/bin/dot
export GRAPHVIZ_DOT
;; plantuml.jarへのパスを設定
(setq org-plantuml-jar-path "~/local/jar/plantuml.jar")
  ...
  (plantuml . t)

1.6 org-toggle-inline-images

(org-toggle-inline-images) で画像のインライン表示を on/off

2 文芸的プログラミング (literate programming)

programming と documentation を同じ文書で行なうこと

2.1 参考サイト

2.2 ruby ソースコードの埋め込み方

org#working with source code

org#Structure of code blocks

#+name: 
#+begin_src ruby <arguments...>
body
#+end_src

2.3 ruby ソースコードのedit

2.4 ruby ソースコードの実行方法

2.5 ruby ソースコードの export

org#Exporting code blocks

#+begin_src ruby :exports both
body
#+end_src

2.6 ruby ソースコードの extract

org#Extracting source code

#+name: 
#+begin_src ruby :tangle <file>
body
#+end_src

3 emacs アレコレ

3.1 emacs

C-x SPC (rectangle-mark-mode &optional ARG) 
M-q 整形
C-x r x register 
C-x r g register 
C-x n n narrow region
C-x n w widen regions
M-x string-insert-rectangle

3.2 C-x r コマンド レジスタ関連

C-x r C-@     point-to-register
C-x r ESC     Prefix Command
C-x r SPC     point-to-register
C-x r +               increment-register
C-x r N               rectangle-number-lines
C-x r b               bookmark-jump
C-x r c               clear-rectangle
C-x r d               delete-rectangle
C-x r f               frameset-to-register
C-x r g               insert-register
C-x r i               insert-register
C-x r j               jump-to-register
C-x r k               kill-rectangle
C-x r l               bookmark-bmenu-list
C-x r m               bookmark-set
C-x r n               number-to-register
C-x r o               open-rectangle
C-x r r               copy-rectangle-to-register
C-x r s               copy-to-register
C-x r t               string-rectangle
C-x r w               window-configuration-to-register
C-x r x               copy-to-register
C-x r y               yank-rectangle
C-x r C-SPC   point-to-register

C-x r M-w     copy-rectangle-as-kill

3.3 recentf

~/.emacs.d/.recentf に最近使ったfile一覧を保存し、 M-x recentf-open-file で使う

helm と組合せると検索もできて便利

;; recentf and recentf-ext.el
;; https://keisanbutsuriya.hateblo.jp/entry/2015/02/15/174758

(require 'recentf)
(setq recentf-save-file (expand-file-name "~/.emacs.d/.recentf"))
(setq recentf-max-saved-items 100)            ;; recentf に保存するファイルの数
(setq recentf-exclude '(".recentf"))           ;; .recentf自体は含まない
(setq recentf-auto-cleanup 10)                 ;; 保存する内容を整理
(run-with-idle-timer 30 t 'recentf-save-list)  ;; 30秒
(recentf-mode 1)

3.4 Emacs での テキストブラウザ eww を使えるレベルにする

https://futurismo.biz/archives/2950

KeyBindings

N (eww-next-url) P (eww-previous-url) l (eww-back-url) r (eww-forward-url) H (eww-list-histories) & (eww-browse-with-external-browser) b (eww-add-bookmark) B (eww-list-bookmarks) q (quit-window) 見にくいときは, R eww-readable

3.5 eww-mode (eww.el) binding

key             binding
---             -------

ESC             Prefix Command
SPC             scroll-up-command
&               eww-browse-with-external-browser
-               negative-argument
0 .. 9          digit-argument
B               eww-list-bookmarks
C               url-cookie-list
H               eww-list-histories
b               eww-add-bookmark
d               eww-download
g               eww-reload
l               eww-back-url
n               eww-next-url
p               eww-previous-url
q               quit-window
r               eww-forward-url
t               eww-top-url
u               eww-up-url
  (that binding is currently shadowed by another mode)
v               eww-view-source
  (that binding is currently shadowed by another mode)
w               eww-copy-page-url
  (that binding is currently shadowed by another mode)
DEL             scroll-down-command
S-SPC           scroll-down-command
<delete>        scroll-down-command
<remap>         Prefix Command

M-n             eww-next-bookmark
M-p             eww-previous-bookmark

This mode runs the hook `eww-mode-hook', as the final step during initialization.

3.6 Emacs24.4組み込みブラウザewwで目の疲れを1/10にする方法 | るびきち「日刊Emacs」

3.7 Emacs24.5日本語マニュアル登場!!info作成方法

https://emacs.rubikitch.com/emacs245-manual-ja/

suzuki@cis.iwate-u.ac.jp:local/info

3.8 #11 Emacs に革命を起こすパッケージ「helm」 (Software Design 2015年3月号掲載記事) Emacs helm インストール 設定 使い方

4 emacs 設定 for meta-ruby

4.1 emacs-24.5

emacs-24.5 を ~suzuki/local/ にインストールしました。

  • org-mode が 8系になっている。babel/tangle が改善されているような 気がします。
  • emacs内で動く web ブラウザ eww が入っている。

コマンド PATH の設定は下記です:

export PATH=~suzuki/local/bin:$PATH

4.2 emacsのパッケージと設定

emacs の設定などは,~suzuki/local/share/emacs/site-lisp/ に置きまし た。 ~/.emacs.d/init.el に下記を追加してください:

(load (expand-file-name "~suzuki/local/share/emacs/site-lisp/init.el"))

~suzuki/local/share/emacs/site-lispの下にあるファイルは:

init.el
パッケージの初期化と設定
package-update.el
講義に必要なパッケージの更新
init_loader/*.el
パッケージ毎の設定

init.elの中身です:

(load (expand-file-name "~suzuki/local/share/emacs/site-lisp/package-update.el"))
(unless (package-installed-p 'init-loader)
  (package-install 'init-loader))
(require 'init-loader)
(init-loader-load "~suzuki/local/share/emacs/site-lisp/init_loader")

4.3 package

emacs package について

package.el - Emacs JP のまとめ

設定
(require 'package)

;; MELPAを追加
(add-to-list 'package-archives 
	     '("melpa" . "https://melpa.org/packages/") t)

;; MELPA-stableを追加
(add-to-list 'package-archives
	     '("melpa-stable" . "https://stable.melpa.org/packages/") t)

;; Marmaladeを追加
(add-to-list 'package-archives  
	     '("marmalade" . "https://marmalade-repo.org/packages/") t)

;; Orgを追加
(add-to-list 'package-archives 
	     '("org" . "https://orgmode.org/elpa/") t)

;; 初期化
(package-initialize)
利用方法
M-x package-install

指定したパッケージをインストールする.

M-x package-refresh-contents

パッケージ情報を更新する. 最新のものをインストールしたい場合は, 事 前に実行して置くと 良い. 後述の package-list-packagesからインストー ルを行う場合は不要.

M-x package-list-packages

パッケージ操作バッファを開く.

管理例

(package-installed-p package-name)で package-nameがインストール済み で あるかを確認することができるので, package-installed-pが nilを返 すパッケージを インストールすれば, 同じ環境を構築することができる.

以下のようなファイルを用意し, M-x eval-bufferを実行することで, イン ストールされて いないパッケージをインストールすることができる.

;; パッケージ情報の更新
(package-refresh-contents)

;; インストールするパッケージ
(defvar my/favorite-packages
  '(
    ;; for ruby
    ruby-end
    inf-ruby
    ruby-mode

    ;; for org-mode
    htmlize
    auto-complete
    fuzzy
    popup
    robe
    inf-ruby
    rbenv
    smart-newline

    recentf
    elscreen
    ))

;; my/favorite-packagesからインストールしていないパッケージをインストール

(dolist (package my/favorite-packages)
  (unless (package-installed-p package)
    (package-install package)))

package-installed-p関数はあくまでインストールしているかどうかを 知らせるだけなので, アップグレードできるかどうかを検知できるわけではない.

更新

package-list-packagesを実行し, U, xとすることで, インストール済みの パッ ケージをすべて upgradeできる.

emacsのruby環境をセットアップする

ruby-mode,ruby-end,ruby-blockをインストール

packages
  • ruby-mode
  • ruby-end
  • ruby-block
設定
;; --------------------------------------------------
;; ruby-mode
;; https://shibayu36.hatenablog.com/entry/2013/03/18/192651
;; --------------------------------------------------
(autoload 'ruby-mode "ruby-mode"
  "Mode for editing ruby source files" t)
(add-to-list 'auto-mode-alist '("\\.rb$" . ruby-mode))
(add-to-list 'auto-mode-alist '("Capfile$" . ruby-mode))
(add-to-list 'auto-mode-alist '("Gemfile$" . ruby-mode))
;; shebangがrubyの場合、ruby-modeを開く
(add-to-list 'interpreter-mode-alist '("ruby" . ruby-mode)) 

;; ruby-modeのインデントを改良する
(setq ruby-deep-indent-paren-style nil)
(defadvice ruby-indent-line (after unindent-closing-paren activate)
  (let ((column (current-column))
	indent offset)
    (save-excursion
      (back-to-indentation)
      (let ((state (syntax-ppss)))
	(setq offset (- column (current-column)))
	(when (and (eq (char-after) ?\))
		   (not (zerop (car state))))
	  (goto-char (cadr state))
	  (setq indent (current-indentation)))))
    (when indent
      (indent-line-to indent)
      (when (> offset 0) (forward-char offset)))))


;; --------------------------------------------------
;; ruby-end
;; endや括弧などを自動挿入する
;; https://blog.livedoor.jp/ooboofo3/archives/53748087.html
;; --------------------------------------------------
(require 'ruby-end)
(add-hook 'ruby-mode-hook
  '(lambda ()
    (abbrev-mode 1)
    (electric-pair-mode t)
    (electric-indent-mode t)
    (electric-layout-mode t)))

;; --------------------------------------------------
;; ruby-block
;; endにカーソルを合わせると、そのendに対応する行をハイライトする
;; --------------------------------------------------
(require 'ruby-block)
(ruby-block-mode t)
(setq ruby-block-highlight-toggle t)

auto-completeのインストール

packages
  • auto-complete
  • fuzzy
  • popup
設定
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/.cask/24.3.1/elpa/auto-complete-20140824.1658/dict")
(ac-config-default)
(setq ac-use-menu-map t)

robeのインストール

pryのインストール
gem install pry pry-doc bundler
source ~/.bashrc
which pry
package
  • robe
  • inf-ruby
設定
;; --------------------------------------------------
;; robe
;; https://codeout.hatenablog.com/entry/2014/02/04/210237
;; --------------------------------------------------
(add-hook 'ruby-mode-hook 'robe-mode)
(autoload 'robe-mode "robe" "Code navigation, documentation lookup and completion for Ruby" t nil)
(autoload 'ac-robe-setup "ac-robe" "auto-complete robe" nil nil)
(add-hook 'robe-mode-hook 'ac-robe-setup)
robeの起動方法

robeを利用するには、

M-x inf-ruby   ;; を実行し、裏でirb(pry)を起動させ、
M-x robe-start ;; で初めてrobeが使えるようになります。

rbenvのパスを通す

Emacs の中で,rbenvのパスを通してくれます。

package
  • rbenv
設定
(require 'rbenv)
(global-rbenv-mode)
(setq rbenv-installation-dir "~/.rbenv")

smart-newlineを導入する

改行をよしなにやってくれます。素敵です。

package
  • smart-newline
設定
(add-hook 'ruby-mode-hook
  (lambda ()
  (smart-newline-mode t)))

Todo emacsの org-mode 環境をセットアップする

(require 'org)
(require 'org-compat)
(require 'org-list)

;; キーバインドの設定
(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map "\C-ca" 'org-agenda)

;; 拡張子がorgのファイルを開いた時,自動的にorg-modeにする
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))

;; org-modeでの強調表示を可能にする
(add-hook 'org-mode-hook 'turn-on-font-lock)

;; 見出しの余分な*を消す
(setq org-hide-leading-stars t)

;; org-default-notes-fileのディレクトリ
;;(setq org-directory "~/org/")

;; org-default-notes-fileのファイル名
;;(setq org-default-notes-file "notes.org")

;; TODO状態
(setq org-todo-keywords
      '((sequence "Todo(t)" "Quest(?)" "Sched(@)" "Search(/)" "Doing(i)" "Waiting(w)" "|" "Done(d)" "Someday(s)" "Cancel(c)")))

;; DONEの時刻を記録
(setq org-log-done 'time)

;; アジェンダ表示の対象ファイル
(setq org-agenda-files (list org-directory))

;; アジェンダ表示で下線を用いる
(add-hook 'org-agenda-mode-hok '(lambda () (hl-line-mode 1)))
(setq hl-line-face 'uderline)

;; tags
(setq org-tag-alist
      '(;; where
	("@UNIV" . ?u) ("@HOME" . ?h) 
	;; do
	("BUY" . ?b) ("MAIL". ?m) 
	;; what to use
	("PROJECT" . ?p) ("LECT" . ?l) ("SEMI" . ?z)))

(defun org-insert-upheading (arg)
  (interactive "p")
  (org-insert-heading arg)
  (cond ((org-on-heading-p) (org-do-promote))
	((org-at-item-p) (org-indent-item -1))))

(defun org-insert-heading-dwim (arg)
  (interactive "p")
  (case arg
    (4 (org-insert-subheading nil))
    (16 (org-insert-upheading nil))
    (t (org-insert-heading nil))))

(define-key org-mode-map
  (kbd "<C-return>") 'org-insert-heading-dwim)

;; latex export setting

(setq org-export-latex-coding-system 'utf-8-unix)
(setq org-export-latex-date-format "%Y-%m-%d")
(setq org-export-latex-classes nil)
(add-to-list 'org-export-latex-classes
	     '("jarticle"
	       "\\documentclass[a4j]{jarticle}"
	       ("\\section{%s}" . "\\section*{%s}")
	       ("\\subsection{%s}" . "\\subsection*{%s}")
	       ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
	       ("\\paragraph{%s}" . "\\paragraph*{%s}")
	       ("\\subparagraph{%s}" . "\\subparagraph*{%s}")
	       ))

(add-to-list 'org-export-latex-classes
	     '("article"
	       "\\documentclass[a4j]{jarticle}"
	       ("\\section{%s}" . "\\section*{%s}")
	       ("\\subsection{%s}" . "\\subsection*{%s}")
	       ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
	       ("\\paragraph{%s}" . "\\paragraph*{%s}")
	       ("\\subparagraph{%s}" . "\\subparagraph*{%s}")
	       ))

(setq org-export-latex-hyperref-format "\\ref{%s}")

(setq org-beamer-sectioning
      '(
	("\\section{%s}" . "\\section*{%s}")
	("\\subsection{%s}" . "\\subsection*{%s}")
	("\\subsubsection{%s}" . "\\subsubsection*{%s}")
	("\\paragraph{%s}" . "\\paragraph*{%s}")
	("\\subparagraph{%s}" . "\\subparagraph*{%s}")))

(add-to-list 'org-export-latex-classes
	     `("beamer"
	       "\\documentclass[compress,dvipdfm]{beamer}"
	       ,@org-beamer-sectioning))


(global-set-key "\C-c L" 'org-insert-link-global)
(global-set-key "\C-c o" 'org-open-at-point-global)


(require 'org-install)
(setq org-startup-truncated nil)
(setq org-return-follows-link t)
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
(setq org-directory "~/howm/org/")
(setq org-default-notes-file (concat org-directory "CAPTURE.org"))
(setq org-capture-templates
      '(("t" "Todo" entry
	 (file+headline nil "Inbox")
	 "** TODO %?\n   %i\n   %a\n   %t")
	("b" "Bug" entry
	 (file+headline nil "Inbox")
	 "** TODO %?   :bug:\n   %i\n   %a\n   %t")
	("i" "Idea" entry
	 (file+headline nil "New Ideas")
	 "** %?\n   %i\n   %a\n   %t")))

(global-set-key (kbd "C-c c") 'org-capture)

(setq org-capture-templates
      '(("a" "ふつうのエントリー後に追加" entry
	 (file+headline nil "entry")
	 "* %?\n%U\n%a\n")
	("b" "ふつうのエントリー前に追加" entry
	 (file+headline nil "entry")
	 "* %?\n%U\n%a\n" :prepend t)
	("c" "即座に書き込み" entry
	 (file+headline nil "entry")
	 "* immediate-finish\n" :immediate-finish t)
	("d" "ナローイングしない" entry
	 (file+headline nil "entry")
	 "* 全体を見る\n\n" :unnarrowed t)
	("e" "クロック中のエントリに追加" entry (clock)
	 "* clocking" :unnarrowed t)
	("f" "リスト" item
	 (file+headline nil "list")
	 "- リスト")
	;; うまく動かない
	("g" "チェックリスト" checkitem
	 (file+headline nil "list")
	 "チェックリスト")
	("h" "表の行" table-line
	 (file+headline nil "table")
	 "|表|")
	("i" "そのまま" plain
	 (file+headline nil "plain")
	 "あいうえお")
	("j" "ノードをフルパス指定して挿入" entry
	 (file+olp nil "test" "entry")
	 "* %?\n%U\n%a\n")
	;; これもうまく動かない
	("k" "ノードを正規表現指定して挿入" entry
	 (file+regexp nil "list")
	 "* %?\n%U\n%a\n")
	;; 年月日エントリは追記される
	("l" "年/月/日のエントリを作成する1" entry
	 (file+datetree nil))
	("m" "年/月/日のエントリを作成する2" item
	 (file+datetree nil))
	("o" "年/月/日のエントリを作成する prepend" entry
	 (file+datetree nil) "* a" :prepend t)))


;; (require 'ox-freemind)

(defun org-font-lock-ensure ()
  (font-lock-fontify-buffer))

;;(setq org-doing-file "~/howm/org/doing.org")

;; babel, makefile 中のtabをexpandしないように
(setq org-src-preserve-indentation t)

(org-babel-do-load-languages
 'org-babel-load-languages
 '((R . t)
   (emacs-lisp . t)
   (ruby . t)
   (dot . t)
   (ditaa . t)
   (sh . t)))

; Enable literal links 
(defun org-turn-on-literal-links ()
  "enable literal links."
  (interactive)
  (org-remove-from-invisibility-spec '(org-link))
  (org-restart-font-lock))

(defun org-turn-off-literal-links ()
  "disable literal links."
  (interactive)
  (setq buffer-invisibility-spec
	(cons '(org-link) buffer-invisibility-spec))
  (org-restart-font-lock))

;; (add-hook 'org-mode-hook 'org-turn-on-literal-links)

Author: suzuki@cis.iwate-u.ac.jp

Created: 2017-01-30 月 06:43

Validate