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)