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.3 org-mode UML図の埋め込み diagram emacs org mode
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 参考サイト
Introduction to Literate Programming
英語ですが,シンプルで, 知りたいことがほぼ完璧に書いてあります。
- org-babel-perlを使う1/4 - 屯遁のパズルとプログラミングの日記
2.2 ruby ソースコードの埋め込み方
#+name: #+begin_src ruby <arguments...> body #+end_src
2.3 ruby ソースコードのedit
C-c '
2.4 ruby ソースコードの実行方法
2.5 ruby ソースコードの export
#+begin_src ruby :exports both body #+end_src
2.6 ruby ソースコードの extract
#+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 について
設定
(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)