-
Notifications
You must be signed in to change notification settings - Fork 3
/
init.el
executable file
·11033 lines (9981 loc) · 451 KB
/
init.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;;; init.el --- My Emacs Initialization/Customization file -*- lexical-binding: t -*-
;; Filename: init.el
;; Description: My Emacs Initialization/Customization file
;; Package-Requires: ((emacs "24.4"))
;; Author: KAWABATA, Taichi <kawabata.taichi_at_gmail.com>
;; Created: around 1995 (Since my first Emacs experience...)
;; Modified: 2016-01-07
;; Version: 14
;; Keywords: internal, local
;; Human-Keywords: Emacs Initialization
;; Namespace: tkw-
;; URL: https://github.com/kawabata/dotfiles/.emacs.d/init.el
;;; Commentary:
;;;; Emacsおよび関連ソフトのインストール方法
;;;;; Ubuntu
;; % sudo add-apt-repository ppa:cassou/emacs
;; % sudo apt-get update
;; % sudo apt-get install emacs-snapshot
;; % emacs-snapshot
;;;;; Ubuntu Source Build
;; % sudo apt-get install build-essential
;; % sudo apt-get build-dep emacs23
;; % sudo apt-get install git ccache
;; % export PATH=/usr/lib/ccache:$PATH
;; % git clone git://git.savannah.gnu.org/emacs.git
;; % cd emacs
;; % ./configure
;; % make
;; % sudo make install
;;;;; Macintosh (Yamamoto Patch)
;; http://www.math.s.chiba-u.ac.jp/~mituharu/emacs-mac.git
;; - 更新履歴
;; * emacs-24.5-mac-5.15 (2015-12-13)
;; * emacs-24.5-mac-5.14 (2015-12-09)
;; * emacs-24.5-mac-5.13 (2015-10-31)
;; * emacs-24.5-mac-5.12 (2015-10-30)
;; * emacs-24.5-mac-5.11 (2015-09-27)
;;
;; - Brew
;; 日本語インラインパッチ付き
;; % brew install --cocoa --srgb --with-gnutls --japanese emacs -v
;;
;; - git
;; % git clone http://www.math.s.chiba-u.ac.jp/~mituharu/emacs-mac.git/
;; % cd emacs-mac
;; % ./autogen.sh
;; % ./configure --enable-mac-app --with-mac CC="/usr/bin/gcc"
;; % make
;; % sudo make install
;;
;; - パッチを使う場合
;; % wget ftp://alpha.gnu.org/gnu/emacs/pretest/emacs-24.5-rc3.tar.xz
;; % wget ftp://ftp.math.s.chiba-u.ac.jp/emacs/emacs-24.5-rc3-mac-5.6.tar.gz
;; % tar xfz emacs-24.5-rc3-mac-5.6.tar.gz
;; % tar xfJ emacs-24.5-rc3.tar.xz
;; (アイコンを変更したい場合)
;; % wget ftp://ftp.math.s.chiba-u.ac.jp/emacs/emacs-hires-icons-1.0.tar.gz
;; % tar xfz emacs-hires-icons-1.0.tar.gz
;; % cd emacs-24.5
;; (ここまで)
;; % cat ../emacs-24.5-rc3-mac-5.6/patch-mac | patch -p1 # (注意。場合によっては -p0)
;; % rsync -av ../emacs-24.5-rc3-mac-5.6/mac/ ./mac/
;; % rsync -av ../emacs-24.5-rc3-mac-5.6/src/ ./src/
;; % rsync -av ../emacs-24.5-rc3-mac-5.6/lisp/ ./lisp/
;; (アイコンを変更したい場合)
;; % cp ./nextstep/Cocoa/Emacs.base/Contents/Resources/Emacs.icns ./mac/Emacs.app/Contents/Resources/Emacs.icns
;; % cp -pr ../emacs-hires-icons-1.0/etc/images/* ./etc/images
;; (ここまで)
;; % ./configure --enable-mac-app --with-mac CC="/usr/bin/gcc"
;; ※ 注意 :: --enable-profiling は絶対に指定してはいけない。(速度が極端に遅くなる。)
;; ※ 注意 :: 'unrecognized command line option "-fconstant-cfstrings" ならば、/usr/bin/gcc の代わりに /usr/local/bin/gcc が使われている。
;; % make # -j CC="/usr/bin/gcc -std=gnu99" CFLAGS=-g3 bootstrap
;; % sudo make install
;;;;; Macintosh (HEAD / NS)
;;
;; - ccache による再コンパイルの高速化
;; : brew install ccache
;; : export PATH=/usr/local/opt/ccache/libexec:$PATH
;; : ./configure --with-ns
;; : make bootstrap
;; : make install
;; - パッケージのインストール
;; : cd ~/.emacs.d/
;; : EMACS=/Users/kawabata/cvs/emacs/nextstep/Emacs.app/Contents/MacOS/Emacs cask install
;; (およそ20分程度かかる。~/.emacs.d/.cask/25.1.50.1/elpa/ のタイムスタンプで進捗を確認)
;; - 起動
;; (バイトコンパイル済の init.elc の読み込みは抑止する)
;; : /Users/kawabata/cvs/emacs/nextstep/Emacs.app/Contents/MacOS/Emacs -q
;; : M-x load-file ⏎ ~/.emacs.d/init.el
;;
;; + トラブルシューティング
;; tputs がない、というエラーが出たら、config.log のエラー出力場所をよく見る。
;; librsvg 等、思わぬライブラリが悪さをしていることがある。関係ライブラリを一度、
;; アンインストールして再度インストールする。
;; freetype がないと、フォントはまともに表示できない。
;; ./configure 時に、freetype=no と出る場合は、以下を試すとうまくいく場合がある。
;; % ln -s /usr/local/opt/freetype/include/freetype2 /usr/local/include/freetype
;;;;; Macintosh (HEAD / X-Windows)
;; - Troubleshooting
;; : unexec: not enough room for load commands for new __DATA segments
;; : make[2]: *** [bootstrap-emacs] Error 1
;; : make[1]: *** [src] Error 2
;; : make[1]: *** Waiting for unfinished jobs....
;; : make: *** [bootstrap] Error 2
;;
;; 上記のエラーがでたら、{src,lib}/Makefile の
;; LD_SWITCH_SYSTEM_TEMACS の headerpad_extra の値に注意する。
;; 変更:690→6C8
;; configure.ac のif文がミスしている場合あり。
;;;;; Windows
;; - GnuPack (13.00-2015.05.05)
;; + URL :: http://sourceforge.jp/projects/gnupack/releases/p10360
;; + GnuPack の機能をフルに活かすには、Cygwin のgpgなどのコマンドが必要。
;; + ホームディレクトリに .emacs.d のシンボリックリンクを作成する。
;; mklink を使ってもよいが、CYGWIN で、export CYGWIN="winsymlinks:nativestrict"
;; を宣言すれば、ln コマンドも利用できる。
;;
;; + コマンドプロンプトで emacs.exe を --debug-init で起動可。
;; + Windows では Cask は動かないので、use-package の :ensure を利用。
;;
;; + Cygwin と Emacs ではパスは以下のように異なるので注意。
;; - "c:/Windows/system32" → "/cygdrive/c/windows/system32"
;; - "path1;path2;path3" → "path1:path2:path3"
;; parse-colon-path 関数が自動的に環境に応じて処理してくれる。
;; なお、cygwin の rootディレクトリは
;; HKEY_LOCAL_MACHINE\SOFTWARE\Cygwin\setup\rootdir = C:\cygwin64
;; となっているが、これは当然、Emacsからは見えないので、
;; (getenv "SHELL") に /bin/sh があってもアクセスできない。
;;
;; - 個別設定
;; [SetEnv]
;; CYGWIN_DIR = C:\cygwin64
;; + HOME を自分のディレクトリにする。
;; + color_theme をコメントアウトする。
;;;;; Cask
;; - マニュアル
;; http://cask.github.io/dsl.html
;; - 開発ガイド
;; http://www.kaichan.info/blog/2014-02-23-emacs-cask.html
;; - Linux
;; : $ curl -fsSkL https://raw.github.com/cask/cask/master/go | python
;; - Mac
;; : $ brew install cask
;; : % cask upgrade # upgrade-cask でもOK
;;;;; 個別パッケージインストール
;; - m17n-lib (https://savannah.nongnu.org/projects/m17n)
;; - コンパイルには libintl.h が必要なため、
;; : brew install gettext
;; : brew link gettext (gettext はkeg onlyなため)
;; を実行する。
;; - TeX (MacTeX, W32TeX, TexLive) (/usr/texbin/)
;; - Go Language (/usr/local/go)
;; - Digital Mars D language
;; - GnuPG (Agent)
;; MacGPGの場合はシステム環境設定のGPGPreferencesにおいて
;; "Store Password in KeyChain" を設定
;; - R (http://cran.r-project.org/bin/macosx/)
;; - X Windows (XQuartz)
;; - csharp
;; MDK (http://www.mono-project.com/download/)
;; 自動的に /usr/bin に mcs がインストールされる。
;; - パッケージマネージャ (MacPorts/HomeBrew) でインストール
;; + Haskell / Cabal (Pandoc via Cabal)
;; - インストール
;; : % export PATH=$HOME/Library/Haskell/bin:$PATH
;; : % cabal update
;; : % cabal install cabal-install
;; - トラブルシューティング
;; : % ghc-pkg check
;; : % sudo ghc-pkg recache
;; : % cabal install --reinstall --force-reinstall <pkg-name>
;; - 全削除
;; : % rm ~/.ghc ~/.cabal
;; + Maxima
;;;; Emacsの公式ドキュメント一覧
;; - [[info:emacs#Top][Emacs]]
;; - [[info:eintr#Top][An Introduction to Programming in Emacs Lisp]]
;; - [[info:elisp#Top][Emacs Lisp]]
;; - Reference Cards (/etc/refcards)
;; - refcard.pdf :: Emacs
;; - calccard.pdf :: Calc
;; - dired-ref.pdf :: Dired
;; - gnus-booklet.pdf :: Gnus
;; - gnus-refcard.pdf :: Gnus
;; - orgcard.pdf :: Org
;;; Code:
(eval-when-compile (require 'cl))
(setq init-file-debug t)
(cd "~/") ; ホームディレクトリにcd
(setq force-load-messages t)
(message (format "Startup time: %s" (format-time-string "%Y/%m/%d %H:%M:%S")))
;;; マクロ・関数
;; 本ファイルで使用するマクロと関数の定義
;;;; ライブラリ遅延読み込み
;; hinted by http://lunaryorn.com/blog/2013/05/31_byte-compiling-eval-after-load.html
;; * with-eval-after-load (Emacs 24.4 から)
;; バイトコンパイル時は、未定義マクロは関数とみなすので注意。
(unless (fboundp 'with-eval-after-load)
(defmacro with-eval-after-load (file &rest body)
`(eval-after-load ,file
`(funcall (function ,(lambda () ,@body))))))
;;;; 関数のコマンド化
(defmacro command (&rest body)
`(lambda () (interactive) ,@body))
;;;; major-mode のモードライン名を変更
;; - minor-mode は diminishを使用する。
(defun tkw-major-mode-lighter (mode string &optional face)
"Change the mode-line MODE lighter to STRING with FACE."
(let ((string (if face (propertize string 'face face) string)))
(add-hook (intern (concat (symbol-name mode) "-hook"))
`(lambda () (setq mode-name ,string)))))
;;;; 大きすぎるファイルでは適用しないモードの判定
(defun tkw-large-file-p (&optional char-size)
"現在のバッファの文字数が CHAR-SIZE を越えるか判定する.
デフォルト値は 100,000."
(< (or char-size 100000) (point-max)))
;;;; そのほかの関数
;; (defun add-to-auto-mode-alist (pair)
;; (pushnew pair auto-mode-alist :test 'equal))
;; (defun remove-from-auto-mode-alist (pair)
;; (callf2 delete pair auto-mode-alist))
;; (defun tkw-assoc-delete-all (key alist)
;; (callf2 'remove-if (lambda (equal key (car item))) alist))
;;;; cask
(eval-and-compile
(if (or (require 'cask "/usr/local/share/emacs/site-lisp/cask/cask.el" t) ;; MacOS X (homebrew)
(require 'cask "~/.cask/cask.el" t)) ;; Linux (install by curl)
(cask-initialize)
(warn "Cask is not installed!")))
;;;; 初期化
;; Emacsは init.el 読み込み後に各パッケージへのload-path設定を行い
;; XXX-autoloads.el を読み込む。このままでは init の段階では
;; require/locate-library ができないため、(package-initialize) を事前
;; に実行する。
;;(require 'autoinsert) ; abc-mode-autoloads.el 対策。
(package-initialize)
(setq package-enable-at-startup nil) ; 初期化済みなので自動初期化は停止。
;; パッケージの情報は、~/.emacs.d/elpa/archives/ に格納される。自分で
;; パッケージを作る場合は、 package-x.el の、
;; `package-upload-{buffer,file}' を利用する。archive-contents ファイ
;; ルが自動生成される。
;; パッケージ読み込み後は、読み込みライブラリを表示する。
;; (繁雑な XXXX-autoload は表示させない。)
;; ただし、package-menu-execute 時のみ、(XXX-autoload.elを) 表示させない。
(defadvice package-menu-execute (around tkw-package-menu-execute-suppress-load-messages)
"Suppress displaying load file messages."
(let ((force-load-messages nil))
ad-do-it))
(ad-activate 'package-menu-execute)
;;;; Package Archives
(set-variable 'package-archives
'(("gnu" . "http://elpa.gnu.org/packages/")
("melpa" . "http://melpa.milkbox.net/packages/")
;; sunrise-commander
;; ("SC" . "http://joseito.republika.pl/sunrise-commander/")
;; org-mode
("org" . "http://orgmode.org/elpa/")
))
;; ローカルレポジトリを追加
;; (when (file-exists-p "~/.emacs.d/local-packages/archive-contents")
;; (pushnew '("local" . "~/.emacs.d/local-packages/")
;; package-archives :test 'equal))
;;;;; Marmalade について
;;
;; MELPAとMarmalade の違い
;; | archives | MELPA | Marmalade |
;; |------------+-------------------------+----------------------|
;; | source | Public Repository | Upload manually |
;; | update | Automatic | Manual |
;; | XXX-pkg.el | automatically generated | prepare by oneself |
;; | version | year-date-revision | prepaed by oneself |
;; | curaton | relatively safe | random fork possible |
;;
;; marmalade は危険なファイルが入る可能性があるので、専用の関数で処理する。
;; 利用後は M-x init-package-archives して、もとに戻す。
;;(defun list-packages-marmalade ()
;; (interactive)
;; (setq package-archives '(("marmalade" . "http://marmalade-repo.org/packages/")))
;; (list-packages))
;;;; Emacs 25 対策
;; 2015年1月時点では、use-package の前にこれを読まないと Emacs 25 ではエラーになる。
(require 'xref nil t)
;;;; use-package
;; - url :: https://github.com/jwiegley/use-package
;; 非標準パッケージは use-package で管理する。
;; (標準ライブラリは use-package では管理しない)
;; これを利用できない環境では、パッケージ管理のソフトはインストールしない。
;;;;; 起動時の use-package の抑止
;; - init.el を外部に持ちだした時など、use-package を抑止したいときは
;; Emacs を、オプション "--qq" で起動する。
;; - use-package が未インストールか、抑止されている場合は空マクロにする。
(eval-and-compile
(when (or (member "--qq" command-line-args)
(null (require 'use-package nil t)))
(warn "`use-package' is unavailable! Please install it via `M-x list-packages' if possible.")
(defmacro use-package (&rest _args))))
;; 後の startup.el におけるオプション認識エラーを防止
(add-to-list 'command-switch-alist '("--qq" . (lambda (switch) nil)))
;;;;; 形式的宣言
(use-package use-package :no-require t :ensure t :defer t)
;;;; pallet
;; 自動的に ~/.emacs.d/Cask ファイル と Packaging を同期する。
;; Network に繋がっていないとエラーになる。要対策。
(use-package pallet :no-require t :ensure t
:commands (pallet-init)
:config
(condition-case nil
(pallet-init)
(error nil)))
;;;; 要チェックライブラリ
;; - logito
;; - org-journal
;; - org-magit
;; - org-toc
;; - polymode
;; - prodigy
;; - sourcemap
;; - strie
;; - sync-env
;; - tern
;; - theme-changer
;; - ucs-cmds
;; - ucs-utils
;; - unicode-fonts
;; - wisi
;; - xmlgen
;;; キーボード設定
;;;; bind-key
;; bind-key* は、emulation-mode-map-alists を利用することにより、
;; minor-mode よりも優先させたいキーのキーマップを定義できる。
;; bind-key.el がない場合は普通のbind-key として振る舞う。
(use-package bind-key :no-require t :defer t :ensure t)
(eval-and-compile
(unless (require 'bind-key nil t)
(defun bind-key (key cmd &optional keymap)
(define-key (or keymap global-map) (kbd key) cmd))
(defun bind-key* (key cmd) (global-set-key (kbd key) cmd))))
(defun tkw-this-command-char ()
"Last character of `this-command'."
(string-to-char (substring (format-kbd-macro (this-command-keys)) -1)))
;;;; 回転系コマンド
;; 回転系コマンドは、doremi.el や、smartrep を使って実装する。
;; | key | function |
;; |-----+------------------------|
;; | f | next-multiframe-window |
;; | h | rotate-han |
;; | k | rotate-kana |
;; | l | rotate-latin |
;; | s | rotate-font-size |
;; | t | rotate-theme |
(defvar tkw-rotate-map (make-sparse-keymap))
(bind-key "M-r" tkw-rotate-map) ;; move-to-window-line-top-bottom を上書き
(bind-key "M-R" tkw-rotate-map) ;; M-r が別の目的に使われていた場合
;;;; emacs-24.4-mac-5.2 の新機能
;; 詳細は macport.texi と macfns.c を参照。
;; - US keyboard :: com.apple.keylayout.US
;; - GoogleIME :: com.google.inputmethod.Japanese.base
(declare-function mac-input-source "macterm.c")
(declare-function mac-osa-script "macterm.c")
(when (fboundp 'mac-select-input-source)
(defun tkw-mac-selected-keyboard-input-source-chage-function ()
(let ((mac-input-source (mac-input-source)))
(if (string-match "\\.US$" mac-input-source)
;; (string-match "\\.Roman$" mac-input-source)
(set-cursor-color "Yellow")
(set-cursor-color "Red"))))
(add-hook 'mac-selected-keyboard-input-source-change-hook
'tkw-mac-selected-keyboard-input-source-chage-function))
;;; 標準設定
;;;; (emacs) 7 Basic
;;;;; (emacs) 7.1 Inserting Text
;; `C-q 数字' で文字を入力する際の進数
(setq read-quoted-char-radix 16)
;;;;; (emacs) 7.2 Changing the Location of Point
(bind-key "C-x :" 'goto-line) ; M-g g に加えて追加
;;;; (emacs) 8 Minibuffers
;; ミニバッファの変化が激しいと思うときは、'grow-onlyに。
(setq resize-mini-windows 'grow-only)
;;;; (emacs) 11.4 The Mark Ring
;; C-u C-SPC C-SPC... で繰返しマークをpopできるようにする.
(setq set-mark-command-repeat-pop t)
;;;; (emacs) 11.7 Disabling Transient Mark Mode
(transient-mark-mode t)
;;;; (emacs) 12 Killing and Moving Text
;;;;; (emacs) 12.1.2 Killing by Lines
(setq kill-whole-line t)
;;;;; (emacs) 12.3.2 Cut and Paste with Other Window Applications
;; VNC等で動きが遅くならないための工夫
(setq select-active-regions nil)
;;;;; (emacs) 12.5 Rectangles (rect.el)
(bind-key "C-x r K" 'tkw-kill-rectangle-save)
(bind-key "C-x r t" 'string-rectangle)
;;;; (emacs) 14 Controlling the Display
;;;;; (emacs) 14.16 Useless Whitespace
;; 行末の空白を表示
(setq-default show-trailing-whitespace nil)
(defun turn-on-show-trailing-whitespace () (interactive) (setq show-trailing-whitespace t))
(defun turn-off-show-trailing-whitespace () (interactive) (setq show-trailing-whitespace nil))
(defun toggle-show-trailing-whitespace () (interactive) (callf null show-trailing-whitespace))
(add-hook 'prog-mode-hook 'turn-on-show-trailing-whitespace)
(add-hook 'org-mode-hook 'turn-on-show-trailing-whitespace)
;; フレームの横幅が一定以下になれば自動的に truncate-window-mode にする。
;; nil の場合はこの機能を無効にする。(デフォルトは50)
;;;;; (emacs) 14.18 Optional Mode Line Features
(setq line-number-display-limit 10000000)
(setq line-number-display-limit-width 1000)
(line-number-mode t)
(column-number-mode t)
;; time.el
(setq display-time-day-and-date t)
(set-variable 'display-time-24hr-format t)
(set-variable 'display-time-string-forms
'(month "/" day
" " 24-hours ":" minutes ;; ":" seconds
(if mail " Mail" "")))
(display-time)
;;;;; (emacs) 14.20 Displaying the Cursor
(blink-cursor-mode 0)
;;;;; (emacs) 14.21 Line Truncation
(bind-key "C-c t" 'toggle-truncate-lines)
;;;;; (emacs) 14.22 Visual Line Mode
;;(global-visual-line-mode t)
;;;; (emacs) 15.1 Incremental Search
(setq lazy-highlight-initial-delay 0) ; isearch のハイライト反応を良くする。
(bind-key "C-k" 'isearch-edit-string isearch-mode-map)
;;;; (emacs) 18.2 Visiting Files
(when (require 'openwith nil t)
;; openwith-file-handler でデバッガに落ちないようにする。
(defadvice openwith-file-handler (around tkw-openwith-handler activate)
(let (debug-on-error)
ad-do-it))
;; ディレクトリを開こうとする場合は、OSのファイルブラウザで開けるようにする。
(defadvice find-file (around tkw-find-file activate)
"Open directory by external application if its name ends with /."
(if (and (file-directory-p (ad-get-arg 0))
(string-match "/$" (ad-get-arg 0))
(y-or-n-p (concat "Open " (ad-get-arg 0)
" in File Browser? ")))
;; openwith は、強制エラーを発生させるので、 debug-on-error を
;; nil にして、デバッガに入るのを抑止する。
(cond ((eq system-type 'windows-nt)
(openwith-open-windows (list (ad-get-arg 0))))
((eq system-type 'gnu/linux)
(openwith-open-unix "nautilus" (list (ad-get-arg 0))))
(t
(openwith-open-unix "open" (list (ad-get-arg 0)))))
ad-do-it)))
;; warn only if file size is more than 100Mbyte.
(setq large-file-warning-threshold 100000000)
;;;; (emacs) 20 Windows
(bind-key "A-M-n" 'enlarge-window)
(bind-key "A-M-p" 'shrink-window)
(bind-key "A-M-f" 'enlarge-window-horizontally)
(bind-key "A-M-b" 'shrink-window-horizontally)
;;(bind-key "<C-right>" (command (scroll-left 8)))
;;(bind-key "<C-left>" (command (scroll-right 8)))
;;(bind-key "<M-up>" (command (scroll-up 1)))
;;(bind-key "<M-down>" (command (scroll-down 1)))
;;(bind-key "<C-right>" (command (scroll-left 1)))
;;(bind-key "<C-left>" (command (scroll-right 1)))
;; 現在のウィンドウを垂直方向に伸ばす。まず、下にウィンドウがあれば、
;; それを消して、無ければ、上を消して、上もなければ、
;; delete-other-windowsする。
(defun tkw-enlarge-window-vertically ()
(command
(let ((current-tl (car (window-edges (selected-window))))
(next-tl (car (window-edges (next-window))))
(previous-tl (car (window-edges (previous-window)))))
(cond ((= current-tl next-tl)
(other-window 1) (delete-window)
(other-window -1))
((= current-tl previous-tl)
(other-window -1) (delete-window))
(t (delete-other-windows))))))
(bind-key "C-x 9" 'tkw-enlarge-window-vertically)
;; 上下スクロールする際に、カーソルが追随するかどうかを切替える。
;;;; (emacs) 21 Frames and Graphical Displays
;;;;; (emacs) 21.7 Frame Commands
(bind-key "A-M-o" 'other-frame)
;;;;; (emacs) 21.15 Tool Bars
(when (functionp 'tool-bar-mode) (tool-bar-mode -1))
;;;; (emacs) 22 International
;;;;; (emacs) 22.2 Language Environments
;; coding関係の設定の前にこれを行う。
;;(set-language-environment "Japanese")
;;;;; (emacs) 22.6 Recognizing Coding Systems
(prefer-coding-system
(cond ((equal system-type 'windows-nt) 'utf-8-dos)
(t 'utf-8)))
;;;; (emacs) 25.1 Words
(bind-key "C-M-h" 'backward-kill-word) ; 単語をまとめてBS。
;;;; (emacs) 25.8 Outline Mode
;;;; (emacs) 26.5 Comments
(bind-key "C-c ;" 'comment-region)
;;;; (emacs) 32.7 Mail-Composition Methods
(setq mail-user-agent 'gnus-user-agent) ; Gnusをメールに使用する。
;;;; (emacs) 36 Running shell commands from Emacs
;; SHELL環境変数が使用される。
;; CYGWIN 環境では、SHELL環境変数が "/bin/bash" などだと、Emacsでは解釈できない。
(if (equal window-system 'w32)
(if (executable-find "zsh")
(progn
(set-variable 'shell-file-name "zsh")
(set-variable 'explicit-shell-file-name "zsh"))
(message "Warning! zsh not found!")))
;;;; (emacs) 47.1 The Package Menu Buffer
;;;;; emacs-lisp/packages.el
;; (bind-key "C-c P" 'list-packages)
;;;;; emacs-lisp/package-x.el
;; package-upload-buffer は tarファイルでも指定可能。
;; 自作ツールはパッケージ化すると、autoloadなどが自動化される。
;; +-----------------+ tar command で生成 package-upload-file
;; | hogehoge.el | +------------------+ +--------------------------+
;; | hogehoge-pkg.el +->| hogehoge-VER.tar +-->| package-base-directory/ |
;; | 関連ファイル | +---------+--------+ | hogehoge-VER.tar |
;; | README (descr.) | | +------------+-------------+
;; +-----------------+ | package-install | autoload 生成
;; | v バイトコンパイル
;; | +--------------------------+
;; | | package-base-directory/ |
;; +----------->| hogehoge-autoloades.el |
;; package-install-file | hogehoge.elc |
;; | misc files... |
;; +--------------------------+
;(use-package package-x
; :commands (package-upload-file package-upload-buffer)
; :config
; (setq package-archive-upload-base (locate-user-emacs-file "local-packages")))
;;;; (emacs) 48 Customization
;;;;; (emacs) 48.1.4 Saving Customizations
(setq custom-file (locate-user-emacs-file "custom.el"))
;;;;; (emacs) 48.1.7 Custom Themes
;; テーマを読み込む際にいちいち聞かない。
(setq custom-safe-themes t)
(defun tkw-delete-theme ()
"現在のthemeを全て削除する。"
(interactive)
(mapc 'disable-theme custom-enabled-themes))
(defvar doremi-custom-themes) ; from doremi-cmds.el
(defun tkw-rotate-theme-to (target)
(require 'doremi-cmd)
(if (null target) (tkw-delete-theme)
(when (member target doremi-custom-themes)
;;(setq doremi-custom-themes (tkw-rotate-to doremi-custom-themes target))
(callf tkw-rotate-to doremi-custom-themes target)
(tkw-delete-theme)
(let ((custom-safe-themes t))
(load-theme (car doremi-custom-themes))))))
;; My favorite themes
;; C-x M-?
;; 利用するthemeの条件
;; org-mode の bullet がきちんと表示されること
;; - alect-light*, ample
(defvar tkw-theme-disabled
'(alect-light
alect-light-alt))
(defvar tkw-theme-shortcut
'((?a . adwaita)
(?b . base16-railscasts)
(?c . colorsarenice-light)
(?d . dichromacy)
(?e . espresso)
(?f . fogus)
(?g . gandalf)
(?h . hemisu-light)
(?i . inkpot)
(?j . jonadabian)
(?k . kingsajz)
(?l . light-blue)
(?m . moe-light)
(?n . nzenburn)
(?o . occidental)
(?p . pastels-on-dark)
(?q . qsimpleq)
(?r . reverse)
(?s . smyx)
(?t . tango)
(?u . underwater)
(?v . vim-colors)
(?w . wombat)
(?x . xemacs)
(?y . xp)
(?z . zenburn)))
;; M-r M-<key> で一発テーマ選択。
(dolist (pair tkw-theme-shortcut)
(eval `(bind-key ,(format "M-%c" (car pair)) 'tkw-select-theme tkw-rotate-map)))
(defun tkw-select-theme ()
"Select Theme by shortcut key."
(interactive)
(let* ((last-char (tkw-this-command-char))
(target (cdr (assoc last-char tkw-theme-shortcut))))
(tkw-rotate-theme-to target)))
;;;; (emacs) 50.1 If <DEL> Fails to Delete
(normal-erase-is-backspace-mode 1)
;;;; 8.1 Symbol Components
;; Symbol Cells
;; | symbol | define | check | set | get | remove |
;; |-------------+--------+---------+----------+-----------------+--------------|
;; | name | | | intern | symbol-name | unintern |
;; | dynamic val | devar | boundp | set | symbol-value | makunbound |
;; | lexical val | | | setq | eval | |
;; | function | defun | fboundp | fset | symbol-function | fmakeunbound |
;; | plist | | | setplist | symbol-plist | |
;; | property | | | put | get | cl-remf |
;; | | | | | function-get | |
;; ※ defvar の代わりに defconst, defcustom もありうる。
;; ※ defun の代わりに defsubst や defalias もありうる。
;;;; 9 Evaluation
(bind-key "M-;" 'eval-region)
(setq max-lisp-eval-depth 40000) ;; 600
;;;; 11 Variables
;;;;; 11.3 Local Variables
(setq max-specpdl-size 100000) ;; 1300
;;;;; 11.11 File Local Variables
;; ファイルローカル変数を許可するか。
;; (setq enable-local-variables t)
;;;; 15.3 Library Search
;; load-path の設定
(defun add-to-load-path (dir)
"新しい DIR を load-path に追加する。"
(let ((default-directory dir))
(load (expand-file-name "subdirs.el") t t t))
(pushnew dir load-path :test 'equal))
;; パッケージの load-pathの前に 個人のsite-lisp のpathを設定する。
(add-to-load-path (locate-user-emacs-file "site-lisp"))
;; 本来なら上記で、load-pathの先頭に site-lisp 以下のディレクトリが入る
;; はずだが、なぜか入らないので以下のように無理やり順序を入れ替える。
(let (site-lisp non-site-lisp)
(dolist (path load-path)
(if (string-match "/.emacs.d/site-lisp/" path) (push path site-lisp)
(push path non-site-lisp)))
(setq load-path (nconc (nreverse site-lisp) (nreverse non-site-lisp))))
;; load-path の理想的な順番
;; ( <site-lisp 以下> <elpa 関係> <標準elisp> )...
;;;; 18 Debugging
;;;;; 18.1.1 Entering the Debugger on an Error
(setq debug-on-error t)
(bind-key "C-c E" 'toggle-debug-on-error)
;;;;; 18.1.2 Debugging Infinite Loops
;;(setq debug-on-quit t)
(bind-key "C-c Q" 'toggle-debug-on-quit)
;;;;; 18.1.3 Entering the Debugger on a Function Call (emacs-lisp/debug.el)
(bind-key "C-c D" 'debug-on-entry)
(bind-key "C-c C" 'cancel-debug-on-entry)
;; C-M-c は exit-recursive-edit
;;;;; 18.2 Edebug (emacs-lisp/edebug.el)
;; デバッグ時は以下をtにすると、C-M-x で評価した関数にデバッガが入る。
;; 個別にデバッグ設定するなら、C-u C-M-x でも良い。
(setq edebug-all-defs nil)
;;;;; 18.5 Profiling
;; cf. profile.el
(bind-key "C-c M-P s" 'profiler-start)
(bind-key "C-c M-P t" 'profiler-stop)
(bind-key "C-c M-P r" 'profiler-report)
;;;; 19.6 Variables Affecting Output
(setq print-circle t)
(setq eval-expression-print-length nil) ; default 12.
(setq eval-expression-print-level nil) ; default 4
;;;; 20 Minibuffers
;;;;; 20.6.1 Basic Completion Functions
;; completion の際に 大文字・小文字の違いは無視する。
(setq completion-ignore-case t)
;;;;; 20.7 Yes-or-No Queries
(fset 'yes-or-no-p 'y-or-n-p)
;;;;; 20.13 Recursive Minibuffers
;; ミニバッファ内で再帰的編集を許す
(setq enable-recursive-minibuffers t)
;;;; 21 Command Loop
;; キー入力の処理順番
;; イベント入力 (read-event)
;; → キー入力 (read-key-sequence)
;; Translation of Input Events [[info:elisp#Event Mod]]
;; - keyboard-translate-table
;; - input-method-function
;; Translation of Keyboard Input [[info:elisp#Translation Keymaps]]
;; - input-decode-map
;; - local-function-key-map (parent: function-key-map)
;; - key-translation-map (iso-transl.el)
;; Searching the Active Keymaps :: [[info:elisp#Searching Keymaps]]
;; キー入力を、コマンドに変換する
;; - overriding-terminal-local-map :: 滅多に使われない。
;; - overriding-local-map :: これより下位のkeymapを全て無効にするので実用性はない。
;; - (keymap char property at point)
;; - emulation-mode-map-alists :: 最優先キーにはこれを利用する
;; - minor-mode-overriding-map-alist :: Major Mode が Minor Mode をオーバーライドするのに使用。
;; - minor-mode-map-alist
;; - (Keymap text property at point)
;; - (current local-map) :: Major Mode
;; - current global-map :: Global Keymap
;; Altキーの代替として、M-a をprefixとして使用する。
;; 旧 M-a (backward-sentence は M-A に割り当てる)
(bind-key "M-a" 'event-apply-alt-modifier function-key-map)
(bind-key "M-A" 'backward-sentence)
;;;;; 21.8.3 Modifying and Translating Input Events
;; C-h を DEL にして、C-z を C-h にする。
(keyboard-translate ?\C-h ?\C-?) ; translate `C-h' to DEL
(keyboard-translate ?\C-z ?\C-h) ; translate `C-z' to `C-h'.
;;;; 23 Major and Minor Modes
;; *scratch* は text-mode にするが、一旦、lisp-interactive-mode になったらそちらをデフォルトにする。
(setq initial-major-mode 'fundamental-mode)
;;(add-hook 'lisp-interaction-mode-hook
;; (lambda () (setq initial-major-mode 'lisp-interaction-mode)))
;;;;; 23.6 Font Lock Mode
;; * font-lock-defaults の書式
;; (KEYWORDS [KEYWORDS-ONLY [CASE-FOLD
;; [SYNTAX-ALIST [SYNTAX-BEGIN OTHER-VARS…]]]])
;; KEYWORDS ::= SYMBOL(font-lock-keywords) | SYMBOL(function) | LIST (font-lock-keywords)
;;;;; 23.7 Automatic Indentation of Code
;; インデントエンジン
;; - 参照 :: emacs-lisp/smie.el
;; - 参考 :: progmodes/modula2, progmodes/octave-mod, progmodes/prolog,
;; progmodes/ruby-mode, progmodes/sh-script, textmodes/css-mode,
;; tuareg.el
;; https://github.com/deactivated/sql-smie-mode/blob/master/sql-smie-mode.el
;; * 基本構成
;; 文法解析・字句解析・インデント計算関数(引数:字句と文脈)
;; (smie-setup XYZ-smie-grammar #'XYZ-smie-rules
;; :forward-token #'XYZ-smie--forward-token
;; :backward-token #'XYZ-smie--backward-token)
;; |------------------------+----------------------------|
;; | 設定パラメータ | デフォルト値 |
;; |------------------------+----------------------------|
;; | forward-sexp-function | smie-forward-sexp-command |
;; | backward-sexp-function | smie-backward-sexp-command |
;; |------------------------+----------------------------|
;; * 演算子順位構文解析(ドラゴンブック4.6参照)
;;
;; smie-bnf->prec2 smie-prec2->grammar
;; BNF (BNF文法) ----> Prec2 ---+---> Prec2 ----> Grammar
;; |
;; | smie-merge-prec2s
;; |
;; Prec (順位) ------> Prec2 ---+
;; smie-precs->prec2
;;
;; ** 文法からの優先順位の決定方法
;; a → bXc
;; b → dYe の場合は、X⋗Y が自動的に決まる。
;; または
;; a -> bXc or dYe として、別に X⋗Y を指定する。
;; ※ Precは、smie-bnf->prec2の第二以降の引数としても指定可能。
;; その場合は、必要な優先順位を1引数に入れると、複数の引数間の優先順は
;; SMIE が自動的に決定する。
;; e.g. a=b+c*d^e;f=g-h/i の場合、`;' ⋗ `=' ⋗ `^' ⋗ `*' ≐ `/' ⋗ `+' ≐ `-' の優先度。
;; - 終端記号は opener / closer / neither になり、closer に対しては最外殻を除き、
;; (:before . opener) がコールバック関数に渡され、それでインデント量を計算する。
;; - syntax-tableのコメントや括弧は自動的に文法として認識される。
;; - :list-intro がきた場合は、arg の後ろに expression のリストがくる場合は t を返す。
;;;; 25 Files
(setq delete-by-moving-to-trash nil) ; <undocumented>
(defun tkw-toggle-delete-by-moving-to-trash ()
"Toggle 'delete-by-moving-to-trash'."
(interactive)
(message "delete-by-moving-to-trash=%s"
(setq delete-by-moving-to-trash
(null delete-by-moving-to-trash))))
;;;; 26 Backups and Auto-Saving
(setq auto-save-timeout 30
auto-save-interval 500)
;;;; 27 Buffers
(bind-key "M-l" 'bury-buffer)
;;;; 28 Windows
;;;;; 28.11 Switching to a Buffer in a Window
(bind-key "C-x M-B" 'pop-to-buffer)
;;;;; 28.14 Additional Options for Displaying Buffers
(setq split-window-preferred-function 'split-window-sensibly)
(setq split-height-threshold 80)
(setq split-width-threshold 160)
;;;;; 28.20 Textual Scrolling
(setq next-screen-context-lines 3
scroll-preserve-screen-position t
scroll-conservatively most-positive-fixnum ; 4
scroll-margin 4
scroll-step 1)
(setq scroll-up-aggressively 0.0
scroll-down-aggressively 0.0)
;;;;; 28.9 Cyclic Ordering of Windows
(defun tkw-other-window ()
"ウィンドウが1つしかない場合は、過去のウィンドウ配置に戻るか、左
右・上下のいずれかに分割する。"
(interactive)
(when (one-window-p)
(if (functionp 'winhist-backward) (call-interactively 'winhist-backward)
(if (< (window-width) 140)
(split-window-vertically)
(split-window-horizontally))))
(other-window 1))
;; "M-o" → "M-O" へ入れ替え。
;; (bind-key "M-O" (lookup-key global-map (kbd "M-o")))
(bind-key* "M-o" 'tkw-other-window) ; ggtags.el の navigation/facemenu-keymap と衝突。
(bind-key "M-O" 'facemenu-keymap)
;;;; 29 Frames
;;;;; 29.3.2 Initial Frame Parameters
(setq default-frame-alist
'(;; Colors
(background-color . "#102020")
(foreground-color . "Wheat") ; "#d0e0f0"
(cursor-color . "#e0e0e0")
(mouse-color . "Orchid")
(pointer-color . "Orchid")
(background-mode . dark)
;; Frae Position and Size
(left . 0)
(top . 0)
(height . 45)
(width . 175)
;; Misc
(line-spacing . 0)
(scroll-bar-width . 12)
(vertical-scroll-bars . left)
(internal-border-width . 0)
;;
;; (font . "Inconsolata-12")
))
;; イニシアルフレーム設定 (デフォルトフレームと異なる場合に設定)
;; (setq initial-frame-alist default-frame-alist)
;;;;; 29.3 Access to Frame Parameters
(modify-frame-parameters nil default-frame-alist)
;;;;; 29.5 Frame Titles
(setq frame-title-format "%b")
;;;; 30 Positions
(defun tkw-next-line-5 () (interactive) (forward-line 5))
(bind-key "C-S-n" 'tkw-next-line-5)
(defun tkw-previous-line-5 () (interactive) (forward-line -5))
(bind-key "C-S-p" 'tkw-previous-line-5)
;;;; 32 Text
;;;;; 32.6 Deleting Text
(bind-key "C-c e" 'erase-buffer)
;;;;; 32.4 Inserting Text
;; ショートカットで文字入力
(defvar tkw-char-keys
'((?z . ?从)))
(dolist (pair tkw-char-keys)
(eval `(bind-key ,(format "C-c %c" (car pair)) 'tkw-insert-char)))
(defun tkw-insert-char ()
"Insert IDS char."
(interactive)
(let ((last-char (tkw-this-command-char)))
(insert (cdr (assoc last-char tkw-char-keys)))))
;;;;; 32.5 User-Level Insertion Commands
;; overwriteは危険なので警告を出す。
(put 'overwrite-mode 'disabled t)
;;;;; 32.8.5 Low-Level Kill Ring
;; (setq interprogram-cut-function x-select-text)
;;;;; 32.11 Filling
(bind-key "M-Q" (command (fill-paragraph 1))) ; fill with justification
;;;;; 32.12 Margins for Filling
(setq-default fill-column 70) ; 標準は70だが、やや少なめが見やすい。
;;;;; 32.19.6 Stickiness of Text Properties
;; (add-to-list 'text-property-default-nonsticky '(read-only . t))
;;;; 33 Non-ASCII Characters
;;;;; 33.6 Character Properties
;; East Asian Ambiguous
;; - Adobe-Japan1 Width Information
;; Proportional 1-230, 9354-9737, 15449-15975, 20317-20426
;; Half-width 231-632, 8718, 8719, 12063-12087
;; Third-width 9758-9778
;; Quarter-width 9738-9757
;; Others :: Full-width
(defun set-east-asian-ambiguous-width (width)
(while (char-table-parent char-width-table)
;;(setq char-width-table (char-table-parent char-width-table))
(callf char-table-parent char-width-table))
(let ((table (make-char-table nil)))
(dolist
(range
'(#x00A1 #x00A4 (#x00A7 . #x00A8) #x00AA (#x00AD . #x00AE)
(#x00B0 . #x00B4) (#x00B6 . #x00BA) (#x00BC . #x00BF)
#x00C6 #x00D0 (#x00D7 . #x00D8) (#x00DE . #x00E1) #x00E6
(#x00E8 . #x00EA) (#x00EC . #x00ED) #x00F0
(#x00F2 . #x00F3) (#x00F7 . #x00FA) #x00FC #x00FE
#x0101 #x0111 #x0113 #x011B (#x0126 . #x0127) #x012B
(#x0131 . #x0133) #x0138 (#x013F . #x0142) #x0144
(#x0148 . #x014B) #x014D (#x0152 . #x0153)
(#x0166 . #x0167) #x016B #x01CE #x01D0 #x01D2 #x01D4
#x01D6 #x01D8 #x01DA #x01DC #x0251 #x0261 #x02C4 #x02C7
(#x02C9 . #x02CB) #x02CD #x02D0 (#x02D8 . #x02DB) #x02DD