-
Notifications
You must be signed in to change notification settings - Fork 1
/
emacs.html
1536 lines (1319 loc) · 59.1 KB
/
emacs.html
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
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
<meta charset="utf-8">
<title>emacsの設定 — Daydreaming in Greater Boston</title>
<meta name="author" content="Kyos">
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="/favicon.png" rel="icon">
<link href="/theme/css/main.css" media="screen, projection"
rel="stylesheet" type="text/css">
<link href="//fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic"
rel="stylesheet" type="text/css">
<link href="//fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic"
rel="stylesheet" type="text/css">
</head>
<body>
<header role="banner"><hgroup>
<h1><a href="/">Daydreaming in Greater Boston</a></h1>
</hgroup></header>
<nav role="navigation"><ul class="subscription" data-subscription="rss">
</ul>
<ul class="main-navigation">
<li><a href="/pages/about.html">About Me</a></li>
<li >
<a href="/category/blog.html">Blog</a>
</li>
<li >
<a href="/category/english.html">English</a>
</li>
<li >
<a href="/category/linux.html">Linux</a>
</li>
<li >
<a href="/category/python.html">Python</a>
</li>
<li class="active">
<a href="/category/tech.html">Tech</a>
</li>
</ul></nav>
<div id="main">
<div id="content">
<div>
<article class="hentry" role="article">
<header>
<h1 class="entry-title">emacsの設定</h1>
<p class="meta">
<time datetime="2022-06-22T00:00:00-04:00" pubdate>Wed 22 June 2022</time> </p>
</header>
<div class="entry-content"><div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org9dd3737">1. はじめに</a></li>
<li><a href="#org37eca65">2. そもそもemacsって・・・</a></li>
<li><a href="#org4051a31">3. 使っている機能とconfig</a>
<ul>
<li><a href="#org1791086">3.1. パッケージソースを追加</a></li>
<li><a href="#org77bd040">3.2. use-package</a></li>
<li><a href="#orgb073529">3.3. materialテーマ と doomモードライン</a></li>
<li><a href="#orgdcf6228">3.4. 雑多な設定</a></li>
<li><a href="#org62b3465">3.5. dired</a></li>
<li><a href="#orga0e4da9">3.6. ソースファイルを見やすくする設定</a></li>
<li><a href="#org798c200">3.7. which-key</a></li>
<li><a href="#org41adfc1">3.8. Completion系パッケージ</a>
<ul>
<li><a href="#org671a6a5">3.8.1. fussy</a></li>
<li><a href="#orgf7f534a">3.8.2. vertico - VERTical Interactive COmpletion</a></li>
<li><a href="#org68ccb4b">3.8.3. marginalia</a></li>
<li><a href="#org8a27934">3.8.4. consult</a></li>
<li><a href="#org50bc002">3.8.5. corfu</a></li>
</ul>
</li>
<li><a href="#org9d0ba6c">3.9. Python</a></li>
<li><a href="#org8ce926e">3.10. 16インチMacBook Pro用設定</a></li>
<li><a href="#org5953e5c">3.11. email設定</a></li>
<li><a href="#orgec6967b">3.12. shell-mode</a></li>
<li><a href="#org4eea733">3.13. org-mode</a>
<ul>
<li><a href="#orgbe663e1">3.13.1. テキストファイルである</a></li>
<li><a href="#org41074b5">3.13.2. 表の編集</a></li>
<li><a href="#orgd7f6229">3.13.3. ToDo管理</a></li>
<li><a href="#org6a1dd16">3.13.4. 各種ファイルフォーマットへのエキスポート</a></li>
<li><a href="#orgff7f99e">3.13.5. クラウド連携</a></li>
<li><a href="#org0d80cf2">3.13.6. ブログ</a></li>
<li><a href="#org4a91e22">3.13.7. org-mode用設定</a></li>
</ul>
</li>
<li><a href="#org827dbb1">3.14. magit</a></li>
<li><a href="#orgf73329f">3.15. tramp-mode</a></li>
<li><a href="#org4050739">3.16. GUIモード</a></li>
</ul>
</li>
<li><a href="#org2e5680f">4. init.el</a></li>
</ul>
</div>
</div>
<p>
<span class="timestamp-wrapper"><span class="timestamp"><2024-07-13 Sat></span></span>アップデート
</p>
<div id="outline-container-org9dd3737" class="outline-2">
<h2 id="org9dd3737"><span class="section-number-2">1</span> はじめに</h2>
<div class="outline-text-2" id="text-1">
<p>
業務効率を上げるために、emacsの使いこなしに注力しています。元々org-modeによるドキュメント書きやPythonスクリプト開発にしか使っていなかったのですが、この1年くらいで、以下の機能、パッケージを使うようになり、40年前からあるツールとは思えないくらい使い勝手が向上しました。
</p>
<ul class="org-ul">
<li>use-package</li>
<li>magit</li>
<li>vertico + fussy + marginalia + consult + corfu</li>
<li>GUIモード</li>
<li>tramp-mode</li>
<li>dired</li>
<li>org-modeでのToDos管理</li>
</ul>
</div>
</div>
<div id="outline-container-org37eca65" class="outline-2">
<h2 id="org37eca65"><span class="section-number-2">2</span> そもそもemacsって・・・</h2>
<div class="outline-text-2" id="text-2">
<p>
stackoverflow の2023年版 IDEランキング(<a href="https://survey.stackoverflow.co/2023/#most-popular-technologies-new-collab-tools">こちら</a>)で、emacsはCLion, IPythonに次ぐ21位でした。
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-right" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-right">rank</th>
<th scope="col" class="org-left">IDE</th>
<th scope="col" class="org-left">コメント</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-right">1</td>
<td class="org-left">Visual Studio Code</td>
<td class="org-left">納得です</td>
</tr>
<tr>
<td class="org-right">2</td>
<td class="org-left">Visual Studio</td>
<td class="org-left"> </td>
</tr>
<tr>
<td class="org-right">3</td>
<td class="org-left">IntelliJ</td>
<td class="org-left">これも納得</td>
</tr>
<tr>
<td class="org-right">4</td>
<td class="org-left">Notepad++</td>
<td class="org-left"> </td>
</tr>
<tr>
<td class="org-right">5</td>
<td class="org-left">Vim</td>
<td class="org-left">おー、さすが</td>
</tr>
<tr>
<td class="org-right"> </td>
<td class="org-left"><snip></td>
<td class="org-left"> </td>
</tr>
<tr>
<td class="org-right">13</td>
<td class="org-left">Nano</td>
<td class="org-left">なぜNanoがIDE..</td>
</tr>
<tr>
<td class="org-right"> </td>
<td class="org-left"><snip></td>
<td class="org-left"> </td>
</tr>
<tr>
<td class="org-right">21</td>
<td class="org-left">Emacs</td>
<td class="org-left"> </td>
</tr>
</tbody>
</table>
<p>
職場でも、VS Code, IntelliJ, vimを使っている人が大半で、唯一のemacs使いは転職してgoogleに行ってしまいました。私も自分でコーディングしない言語のソースコードを見るときにはVS Codeを使っていて、自分で管理していないLinuxマシン上ではvi/vimを使います。
</p>
<p>
ランキングを見ると、emacsのライバルである筈のvimに大きく差をつけられているのが寂しい所です。世間的にはemacsはオワコンカテゴリーに入ってしまったのでしょうか。まあ、emacsはIDEでも単なるテキストエディタでもなく、よりカバー範囲が広いツールではありますが。
</p>
<p>
確かにemacsは初心者を突き放したようなところがあって、ツールとして使いこなすまでのアップフロントな学習コストが高めなため、インストールするだけで何となく使えてしまい、それでいて高機能なVS Codeに人気で負けてしまうのは納得できます。
</p>
<p>
しかしある一線を越えると、非常に生産性の高い唯一無二の世界が待っていますので、少しでも興味があって、勉強や試行錯誤してもよいという方は是非ともemacsを使っていただきたいと思います。
</p>
<p>
リンク:
</p>
<ul class="org-ul">
<li><a href="https://qiita.com/mkt3/items/44aa25619a9591078231">Emacsのすゝめ</a></li>
<li><a href="https://emacs-jp.github.io/tips/emacs-in-2020">2020年代のEmacs入門</a></li>
</ul>
</div>
</div>
<div id="outline-container-org4051a31" class="outline-2">
<h2 id="org4051a31"><span class="section-number-2">3</span> 使っている機能とconfig</h2>
<div class="outline-text-2" id="text-3">
</div>
<div id="outline-container-org1791086" class="outline-3">
<h3 id="org1791086"><span class="section-number-3">3.1</span> パッケージソースを追加</h3>
<div class="outline-text-3" id="text-3-1">
<div class="org-src-container">
<pre class="src src-elisp">(require 'package)
(setq package-archives
'(("gnu" . "http://elpa.gnu.org/packages/")
("melpa" . "http://melpa.org/packages/")
("org" . "http://orgmode.org/elpa/")))
(package-initialize)
(when (not package-archive-contents)
(package-refresh-contents))
</pre>
</div>
<p>
最近のemacsバージョンでは、これを入れただけで、gnuにアクセスできないだの、645357D2883A0966のpublic keyが無いだの文句を言われて途方に暮れるかもしれません。その場合、以下のおまじないが効くかも。(キーをインポートしています。それくらいしておいてくれたらいいのに。。。)
</p>
<div class="org-src-container">
<pre class="src src-bash">gpg --homedir ~/.emacs.d/elpa/gnupg --keyserver hkp://keyserver.ubuntu.com --recv-keys 645357D2883A0966
</pre>
</div>
<p>
その後emacs内で、更におまじないを。
</p>
<pre class="example">
M-x package-refresh-contents
</pre>
</div>
</div>
<div id="outline-container-org77bd040" class="outline-3">
<h3 id="org77bd040"><span class="section-number-3">3.2</span> <a href="https://github.com/jwiegley/use-package">use-package</a></h3>
<div class="outline-text-3" id="text-3-2">
<p>
emacsの追加機能(パッケージ)は <code>~/.emacs.d/init.el</code> で設定しますが、これを見やすく、書きやすくするありがたいパッケージです。パッケージの自動インストールもしてくれます(私の環境では動かないことも多いですが)。
</p>
<p>
パッケージのgithub READMEには、use-packageを使った設定の説明が増えてきていて、多くのemacsユーザーに浸透しています。日本ではより高機能な leaf が有名ですね。
</p>
<div class="org-src-container">
<pre class="src src-elisp">;; for use-package
(unless (package-installed-p 'use-package)
(package-install 'use-package))
(require 'use-package)
(setq use-package-always-ensure t)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb073529" class="outline-3">
<h3 id="orgb073529"><span class="section-number-3">3.3</span> <a href="https://github.com/cpaulik/emacs-material-theme">materialテーマ</a> と <a href="https://github.com/seagle0128/doom-modeline">doomモードライン</a></h3>
<div class="outline-text-3" id="text-3-3">
<p>
テーマは好き嫌いがあると思いますが、私はmaterialテーマを好んで使っています。
</p>
<p>
doomモードラインは、画面の下から2行目にある情報表示行のモードラインをcoolにしてくれるパッケージです。ミニマリストデザインで格好よく、視認性がとても良いです。下記イメージはmaterialテーマを適用しています。緑枠で囲った部分がモードラインです。
</p>
<div id="org0d3819c" class="figure">
<p><img src="./images/theme_modeline.jpg" alt="theme_modeline.jpg" />
</p>
</div>
<p>
~/.emacs.d/init.el には以下を設定しています。
</p>
<div class="org-src-container">
<pre class="src src-elisp">;; Material theme
(load-theme 'material t)
;; doom modeline
(use-package doom-modeline
:init (doom-modeline-mode 1))
</pre>
</div>
<p>
materialが無いよ、と怒られるので、M-x list-packagesからmaterial-themeを入れます。
</p>
</div>
</div>
<div id="outline-container-orgdcf6228" class="outline-3">
<h3 id="orgdcf6228"><span class="section-number-3">3.4</span> 雑多な設定</h3>
<div class="outline-text-3" id="text-3-4">
<ul class="org-ul">
<li>スタートアップメッセージは不要です。</li>
<li>バックアップファイルも不要です。</li>
<li>カーソル位置はモードラインにシンプルに表示します。</li>
<li>スクロールは1ライン単位が見やすいと思います。</li>
<li>耳障りな音は元から絶ちます。</li>
<li>いちいち"yes" "no"を入れるのが面倒なので、'y' 'n'にします。</li>
<li>メニューバーやツールバーは不要です。</li>
</ul>
<div class="org-src-container">
<pre class="src src-elisp">;; No startup message
(setq inhibit-startup-message t)
;; no backup files
(setq make-backup-files nil)
(setq auto-save-default nil)
;; Delete auto-save files
(setq delete-auto-save-files nil)
;; columm and line number
(column-number-mode t)
;; 1-line scroll
(setq scroll-conservatively 1)
;; silence bell
(setq ring-bell-function 'ignore)
;; yes or no to y or n
(fset 'yes-or-no-p 'y-or-n-p)
;; hide menu/tool bar
(menu-bar-mode 0)
(tool-bar-mode 0)
</pre>
</div>
</div>
</div>
<div id="outline-container-org62b3465" class="outline-3">
<h3 id="org62b3465"><span class="section-number-3">3.5</span> dired</h3>
<div class="outline-text-3" id="text-3-5">
<p>
<code>ls -la</code> (かな?)の画面を見ながら、ディレクトリやファイル操作ができるモードです。PC98の頃に流行ったファイラー(FD, FILMTNには昔お世話になりました)に似ています。キー操作を覚えるのが面倒ですが、使いこなせばかなり便利です。私はキーバインドをすぐに忘れるので、チートシートを用意しています:
</p>
<ul class="org-ul">
<li><code>C-x d</code>: run dired</li>
<li><code>s</code>: アルファベット順、時系列ソートトグル</li>
<li><code><</code> <code>></code>: 手前、次のディレクトリへ</li>
<li><code>^</code>: 親ディレクトリを開く</li>
<li><code>v</code>: 現在のファイルを閲覧(view mode)</li>
<li><code>+</code>: サブディレクトリ作成</li>
<li><code>=</code>: diff</li>
<li><code>m</code>: マーク</li>
<li><code>u</code> / <code>U</code>: マーク解除/全解除</li>
<li><code>C</code>: コピー</li>
<li><code>R</code>: リネーム</li>
<li><code>M</code>: chmod</li>
<li><code>Z</code>: gzip/gunzip</li>
<li><code>M-x find-name-dired</code>: パターンマッチするファイルをdired</li>
<li><code>M-x find-grep-dired</code>: パターンを含むファイルをdired</li>
</ul>
<div class="org-src-container">
<pre class="src src-elisp">;; dired
(require 'dired-x)
</pre>
</div>
</div>
</div>
<div id="outline-container-orga0e4da9" class="outline-3">
<h3 id="orga0e4da9"><span class="section-number-3">3.6</span> ソースファイルを見やすくする設定</h3>
<div class="outline-text-3" id="text-3-6">
<ul class="org-ul">
<li><a href="https://github.com/Fanael/rainbow-delimiters">rainbow-delimiters</a> - 対応するカッコを色分けして表示してくれます。視認性が上がります。</li>
<li>カーソル位置にあるカッコの対となるカッコを強調表示します。これも便利です。</li>
<li><a href="https://github.com/DarthFennec/highlight-indent-guides">highlight-indent-guides</a> - インデントを視覚的に見やすく表示してくれます。Pythonのようにインデントでブロックが決まる言語ではとても有用です。</li>
</ul>
<p>
下記はinit.elの、カッコのネストが深い部分です。カーソルをカッコの位置に動かし、対応カッコ共にハイライトさせてみました。画面左にある濃いグレーの縦棒はインデントを表しています。
<img src="./images/emacs-paren.jpg" alt="emacs-paren.jpg" />
</p>
<div class="org-src-container">
<pre class="src src-elisp">;; rainbow-delimiters
(use-package rainbow-delimiters
:hook (prog-mode . rainbow-delimiters-mode))
;; Blink corresponding paren
(show-paren-mode 1)
;; visualize indent
(use-package highlight-indent-guides
:config
(add-hook 'prog-mode-hook 'highlight-indent-guides-mode)
:custom
(highlight-indent-guides-method 'column))
</pre>
</div>
</div>
</div>
<div id="outline-container-org798c200" class="outline-3">
<h3 id="org798c200"><span class="section-number-3">3.7</span> <a href="https://github.com/justbur/emacs-which-key">which-key</a></h3>
<div class="outline-text-3" id="text-3-7">
<p>
emacsでは、 <code>C-x C-c</code> や <code>C-x r l</code> のように複数ストロークのキーバインドが珍しくありませんが、キーを打つ度にヒントを出してくれるのが which-key です。チートシートの出番が減ります。
</p>
<p>
下記イメージは、 <code>C-x r</code> まで押したところ。(使うのは <code>l</code> か <code>m</code>)
<img src="./images/emacs-which.jpg" alt="emacs-which.jpg" />
</p>
<div class="org-src-container">
<pre class="src src-elisp">;; key binding hint
(use-package which-key
:defer 0
:config
(which-key-mode)
(setq which-key-idle-delay 0.3))
</pre>
</div>
</div>
</div>
<div id="outline-container-org41adfc1" class="outline-3">
<h3 id="org41adfc1"><span class="section-number-3">3.8</span> Completion系パッケージ</h3>
<div class="outline-text-3" id="text-3-8">
<p>
私が最近存在を知り、作業効率が劇的に向上したのがこれらの補完系パッケージです。
</p>
</div>
<div id="outline-container-org671a6a5" class="outline-4">
<h4 id="org671a6a5"><span class="section-number-4">3.8.1</span> <a href="https://github.com/jojojames/fussy">fussy</a></h4>
<div class="outline-text-4" id="text-3-8-1">
<p>
キーワードの順序を気にせず、人間の感覚に沿った補完をしてくれる補助パッケージです。使い勝手に大きく影響するので、ぜひ入れましょう。(orderlessから移行しました)
</p>
<div class="org-src-container">
<pre class="src src-elisp">(use-package fussy
:ensure t
:config
(push 'fussy completion-styles)
(setq
completion-category-defaults nil
completion-category-overrides nil))
;; Corfu integration
(advice-add 'corfu--capf-wrapper :before 'fussy-wipe-cache)
(add-hook 'corfu-mode-hook
(lambda ()
(setq-local fussy-max-candidate-limit 5000
fussy-default-regex-fn 'fussy-pattern-first-letter
fussy-prefer-prefix nil)))
;; eglot intgration
(with-eval-after-load 'eglot
(add-to-list 'completion-category-overrides
'(eglot (styles fussy basic))))
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf7f534a" class="outline-4">
<h4 id="orgf7f534a"><span class="section-number-4">3.8.2</span> <a href="https://github.com/minad/vertico">vertico - VERTical Interactive COmpletion</a></h4>
<div class="outline-text-4" id="text-3-8-2">
<p>
補完候補を縦に表示します。次のmarginaliaとセットで使うことで、ものすごく使いやすくなります。
</p>
<div class="org-src-container">
<pre class="src src-elisp">;; vertico - vertial completion
(use-package vertico
:init (vertico-mode 1)
:config (setq vertico-count 14))
(use-package savehist
:init (savehist-mode 1))
</pre>
</div>
</div>
</div>
<div id="outline-container-org68ccb4b" class="outline-4">
<h4 id="org68ccb4b"><span class="section-number-4">3.8.3</span> <a href="https://github.com/minad/marginalia">marginalia</a></h4>
<div class="outline-text-4" id="text-3-8-3">
<p>
verticoを使って補完候補を縦に表示したとき、空いているスペースに有用な情報を表示してくれます。気が利いています。見た目もいい感じになります。
</p>
<div class="org-src-container">
<pre class="src src-elisp">;; marginalia - rich annotations
(use-package marginalia
:init (marginalia-mode))
(use-package all-the-icons ;; M-x all-the-icons-install-fonts required
:if (display-graphic-p))
(use-package all-the-icons-completion
:after (marginalia all-the-icons)
:hook (marginalia-mode . all-the-icons-completion-marginalia-setup)
:init (all-the-icons-completion-mode))
</pre>
</div>
<p>
コメントにあるように、 <code>all-the-icons</code> をインストールしておくと、見た目がとてもcoolになります。
インストールは <code>M-x all-the-icons-install-fonts</code> で行います。このアイコンはdoomモードラインでも使用されるので、是非インストールしてください。
</p>
</div>
</div>
<div id="outline-container-org8a27934" class="outline-4">
<h4 id="org8a27934"><span class="section-number-4">3.8.4</span> <a href="https://github.com/minad/consult">consult</a></h4>
<div class="outline-text-4" id="text-3-8-4">
<p>
説明を読んでも今ひとつピンとこないのですが、カーソルのある選択候補をプレビューしてくれるパッケージです。作業効率が向上するので是非。
</p>
<div class="org-src-container">
<pre class="src src-elisp">;; consult - preview everything
(use-package consult
:bind (("C-x b" . consult-buffer)
("M-g g" . consult-goto-line) ;; line number
("M-g o" . consult-outline)
("M-s f" . consult-find)
("M-s l" . consult-line) ;; key word
("M-s g" . consult-grep)))
</pre>
</div>
<p>
下記イメージは、 <code>C-x b</code> でバッファ切り替えの画面を出したところです。verticoにより切り替え候補のバッファが縦に表示されていて、それらにmarginaliaによる付加情報が付いています。init.elが仮選択されていて、そのプレビュー画面が画面上部に表示されています。
</p>
<div id="org142d2f0" class="figure">
<p><img src="./images/emacs-vertico.jpg" alt="emacs-vertico.jpg" />
</p>
</div>
<p>
矢印キーや <code>C-n</code> <code>C-p</code> で仮選択候補を動かすと、次の候補がプレビューされます。かなり便利です。
</p>
</div>
</div>
<div id="outline-container-org50bc002" class="outline-4">
<h4 id="org50bc002"><span class="section-number-4">3.8.5</span> <a href="https://github.com/minad/corfu">corfu</a></h4>
<div class="outline-text-4" id="text-3-8-5">
<p>
IDE等でよくある、インラインで候補を出してくれるパッケージです。<a href="https://company-mode.github.io/">company-mode</a> から移行しました。若干クセのあったcompany-modeと比べて、だいぶ自然になっていると思います。
</p>
<p>
<img src="./images/emacs-company.jpg" alt="emacs-company.jpg" />
スクリーンショットはcompany-modeのものです。。。
</p>
<p>
更に、<a href="https://github.com/minad/cape">cape</a> という、corfu作者によるcompletion extensionも入れています。いろいろと便利になるようです。
</p>
<div class="org-src-container">
<pre class="src src-elisp">;; corfu - in-buffer completion with a small popup
(use-package corfu
:ensure t
:custom ((corfu-auto t)
(corfu-auto-prefix 2)
(corfu-auto-delay 0.4)
(corfu-cycle t))
:init
(global-corfu-mode)
(corfu-popupinfo-mode))
;; completion-at-point extensions
(use-package cape
:ensure t
:init
;; Add `completion-at-point-functions', used by `completion-at-point'.
(add-to-list 'completion-at-point-functions #'cape-file)
(add-to-list 'completion-at-point-functions #'cape-dabbrev)
;; (add-to-list 'completion-at-point-functions #'cape-history)
(add-to-list 'completion-at-point-functions #'cape-keyword)
;; (add-to-list 'completion-at-point-functions #'cape-tex)
;; (add-to-list 'completion-at-point-functions #'cape-sgml)
;; (add-to-list 'completion-at-point-functions #'cape-rfc1345)
;; (add-to-list 'completion-at-point-functions #'cape-abbrev)
;; (add-to-list 'completion-at-point-functions #'cape-ispell)
;; (add-to-list 'completion-at-point-functions #'cape-dict)
;; (add-to-list 'completion-at-point-functions #'cape-symbol)
;; (add-to-list 'completion-at-point-functions #'cape-line)
)
</pre>
</div>
<p>
リンク:
</p>
<ul class="org-ul">
<li><a href="https://blog.tomoya.dev/posts/a-new-wave-has-arrived-at-emacs/">Emacsの次世代ミニバッファ補完UI</a></li>
<li><a href="https://qiita.com/tadsan/items/f1738cb463b1ec536f84">2021年の補完UI事情とEmacs28に標準添付されるfido-vertical-modeについて</a></li>
<li><a href="https://qiita.com/nobuyuki86/items/7a08a8b22ff64e4cc60b">Emacsで新しいFuzzy補完 - fussy -</a></li>
<li><a href="https://qiita.com/nobuyuki86/items/7c65456ad07b555dd67d">CompanyからCorfuに移行する</a></li>
</ul>
</div>
</div>
</div>
<div id="outline-container-org9d0ba6c" class="outline-3">
<h3 id="org9d0ba6c"><span class="section-number-3">3.9</span> Python</h3>
<div class="outline-text-3" id="text-3-9">
<p>
<a href="https://achiwa912.github.io/eglot.html">以前のエントリー</a> でも書きましたが、elpyからtramp-modeに対応するlsp+eglotに乗り換えました。
</p>
<ul class="org-ul">
<li><a href="https://www.flycheck.org/en/latest/">flycheck</a> - オンザフライでシンタックスチェックしてくれます。flymakeよりこちらを。</li>
<li><a href="https://github.com/pythonic-emacs/blacken">blacken</a> - Pythonファイルをセーブする際に構文チェックして、強制的に規定ルールに合わせてくれます。行儀の良いコードを書く自信のない人はぜひ。</li>
<li><a href="https://github.com/jorgenschaefer/pyvenv">pyvenv</a> - Pythonの仮想環境をemacsでも。</li>
<li><a href="https://github.com/joaotavora/eglot">eglot</a> - emacsをIDE(統合開発環境)化してくれるパッケージ(フロントエンド)です。</li>
<li><a href="https://github.com/python-lsp/python-lsp-server">Python用lspサーバー</a> - eglotはフロントエンドで、こちらがサーバーです。pipでインストールし、サーバーとして動かしておきます。</li>
</ul>
<pre class="example">
pip install 'python-lsp-server[all]'
</pre>
<ul class="org-ul">
<li>tramp-remote-path設定 - tramp機能で、別マシン上で動くPython LSPサーバーにつなげに行く時に必要だった設定をしています。</li>
</ul>
<div class="org-src-container">
<pre class="src src-elisp">;; Flycheck
(use-package flycheck
:init
(add-hook 'after-init-hook 'global-flycheck-mode))
(use-package flycheck-inline
:init
(with-eval-after-load 'flycheck
(add-hook 'flycheck-mode-hook #'flycheck-inline-mode)))
;; black
(use-package blacken
:config
(add-hook 'python-mode-hook 'blacken-mode))
;; suppress warnings
(setq python-indent-guess-indent-offset-verbose nil)
;; pyvenv
(use-package pyvenv
:config
(pyvenv-mode 1))
;; eglot - lsp client
(use-package eglot)
(add-to-list 'eglot-server-programs
'(python-mode "pylsp"))
(use-package python-mode
:ensure nil
:hook
(python-mode . eglot-ensure))
;; need this for eglot to find pylsp in a remote server
(add-to-list 'tramp-remote-path 'tramp-own-remote-path)
</pre>
</div>
<p>
リンク:
</p>
<ul class="org-ul">
<li><a href="https://mako-note.com/ja/python-emacs-lsp/">EmacsでのlspをベースとしたPython開発環境</a></li>
<li><a href="https://solist.work/blog/posts/language-server-protocol/">EglotでLanguage Server Protocolを使う</a></li>
</ul>
</div>
</div>
<div id="outline-container-org8ce926e" class="outline-3">
<h3 id="org8ce926e"><span class="section-number-3">3.10</span> 16インチMacBook Pro用設定</h3>
<div class="outline-text-3" id="text-3-10">
<ul class="org-ul">
<li>老眼の入った目には、デフォルトフォントは小さすぎるので、大きめフォントを指定します</li>
<li>emacsがmacOSのシェルからパス設定を取得できるようにしています</li>
</ul>
<div class="org-src-container">
<pre class="src src-elisp">(if (display-graphic-p)
(set-face-attribute 'default nil :height 160))
(when (memq window-system '(mac ns x))
(exec-path-from-shell-initialize))
</pre>
</div>
</div>
</div>
<div id="outline-container-org5953e5c" class="outline-3">
<h3 id="org5953e5c"><span class="section-number-3">3.11</span> email設定</h3>
<div class="outline-text-3" id="text-3-11">
<ul class="org-ul">
<li><a href="https://notmuchmail.org/">notmuch</a> - emailパッケージです。trampモードと連動し、リモート置いてあるメールにアクセスできます。emacs用メーラーとしてはmu4eが人気ですが、mu4eはtrampとの相性が良くないようです。若干微妙なところもありますが(eg, Z(スレッド表示)で固まったり。。。)、だましだまし使っています。何より、emacsのキーバインドでメールが打てるのがうれしいです。というか、web板gmailの操作性は悪すぎでしょう。まともにメールを書く気になれません。</li>
<li>smtp設定 - メールを出すための設定です。</li>
</ul>
<div class="org-src-container">
<pre class="src src-elisp">(use-package notmuch
:commands notmuch-hello
:bind (("C-c m" . notmuch-hello)))
(setq notmuch-command "~/bin/remote-notmuch.sh")
(setq message-send-mail-function 'smtpmail-send-it
smtpmail-starttls-credentials '(("smtp.gmail.com" 587 nil nil))
smtpmail-auth-credentials '(("smtp.gmail.com" 587 "<emailアドレス>@gmail.com" nil))
smtpmail-default-smtp-server "smtp.gmail.com"
smtpmail-smtp-server "smtp.gmail.com"
smtpmail-smtp-service 587
starttls-use-gnutls t
)
</pre>
</div>
<p>
リンク:
</p>
<ul class="org-ul">
<li><a href="https://achiwa912.github.io/notmuch.html">emacs+notmuchでメールを読み書きする</a></li>
</ul>
</div>
</div>
<div id="outline-container-orgec6967b" class="outline-3">
<h3 id="orgec6967b"><span class="section-number-3">3.12</span> shell-mode</h3>
<div class="outline-text-3" id="text-3-12">
<p>
emacs内で動くシェルはいくつかありますが、 <code>M-x shell</code> で起動する標準の <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Interactive-Shell.html">shell</a> モードを使っています。他に <a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html">eshell</a> や <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Terminal-emulator.html">term</a> モードがありますね。
</p>
<p>
<code>C-p</code> <code>C-n</code> で前後の候補を表示するのでなく、カーソルが動いてしまうことに戸惑いますが、 <code>M-p</code> <code>M-n</code> <code>M-r</code> が用意されていることに気がつけば大丈夫です。コントロールキーでなくメタキーを使うだけなので、覚えるのも容易です。このあたりのキーバインドは <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Ring.html">こちら</a> 。
</p>
<p>
trampモードとの相性も良く、これのおかげでリモートマシンにsshで入る頻度がとても減りました。なお、デフォルトの/bin/shはbashへのシンボリックリンクだったりするので、その場合、わざわざbashに書き換えなくても大丈夫です。
</p>
<p>
複数のシェルを開くには、多少の <a href="https://stackoverflow.com/questions/6532998/how-to-run-multiple-shells-on-emacs">工夫</a> が必要なようです。なるほど、 <code>C-u M-x shell</code> で行けるのですね。
</p>
<p>
リンク:
</p>
<ul class="org-ul">
<li><a href="https://blog.inouetakuya.info/entry/20110627/1309175529">Emacs のシェルモード比較 - shell、ansi-term、multi-term</a></li>
</ul>
</div>
</div>
<div id="outline-container-org4eea733" class="outline-3">
<h3 id="org4eea733"><span class="section-number-3">3.13</span> <a href="https://orgmode.org/">org-mode</a></h3>
<div class="outline-text-3" id="text-3-13">
<p>
emacsのキラー機能である、高機能なアウトラインエディターです。私が今でもemacsを使い続ける最大の理由がこれです。これまで、各種wiki, MS WordやExcel, Evernote, Confluence等さまざまな文章書きツールを使ってきましたが、バージョン間やツール間の互換性、数々の不具合、UIや操作性の違い、使えるデバイス数の変更(Evernote…)に悩まされてきました。org-modeにはこれらの問題がありません。
</p>
</div>
<div id="outline-container-orgbe663e1" class="outline-4">
<h4 id="orgbe663e1"><span class="section-number-4">3.13.1</span> テキストファイルである</h4>
<div class="outline-text-4" id="text-3-13-1">
<p>
org-modeの最大の特長は、orgファイルが単なるテキストファイルで、それを40年間変わらないemacsのUIを使って編集できることです。ファイルフォーマットの互換性問題が本質的にありません。
</p>
</div>
</div>
<div id="outline-container-org41074b5" class="outline-4">
<h4 id="org41074b5"><span class="section-number-4">3.13.2</span> 表の編集</h4>
<div class="outline-text-4" id="text-3-13-2">
<p>
文章を書いていると、情報を見やすく提示するために、表を挿入したくなることがありますよね。
そんな時に役に立つ機能です。
</p>
<p>
罫線として <code>|</code> <code>-</code> <code>+</code> あたりを使って、テキストファイル内に表を作ることができます。
タブキーを押すことで、罫線を補完したり、セルの幅をうまく調整してくれます。
ほとんど神がかった操作性を是非とも体験してみてください。
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">item</th>
<th scope="col" class="org-left">details</th>
<th scope="col" class="org-right">number</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">apple</td>
<td class="org-left">red and sweet and sour 林檎</td>
<td class="org-right">10</td>
</tr>
<tr>
<td class="org-left">orange</td>
<td class="org-left">orange and juicy 橙</td>
<td class="org-right">25</td>
</tr>
<tr>
<td class="org-left">バナナ</td>
<td class="org-left">黄色くて安くて甘い</td>
<td class="org-right">15</td>
</tr>
</tbody>
</table>
<p>
残念な点もあります:
</p>
<ul class="org-ul">
<li>部分セルの結合、分割ができない(行や列全体の追加、削除はできる)</li>
<li>セル内部でのテキストの折返しができない</li>
<li>表計算ソフトのように計算させることが若干面倒</li>
</ul>
<p>
リンク:
</p>
<ul class="org-ul">
<li><a href="https://tamura70.hatenadiary.org/entry/20100205/org">Emacs org-modeを使ってみる: (3) 表の編集</a></li>
<li><a href="https://qiita.com/zonkyy/items/36a590b49a9237907335">Emacs の org-mode は表計算もできてしまう</a></li>
</ul>
</div>
</div>
<div id="outline-container-orgd7f6229" class="outline-4">
<h4 id="orgd7f6229"><span class="section-number-4">3.13.3</span> ToDo管理</h4>
<div class="outline-text-4" id="text-3-13-3">
<p>
こんな感じに見出し行にステータスを付加することで、ToDoリストが作れます。ToDoステータス(注: カスタマイズしています)はショートカットキーで付加、変更ができます。文字を手打ちしてもいいですが。
日付は(<code>C-c .</code> で)別途追記しました。
</p>
</div>
<ol class="org-ol">
<li><a id="org61401cf"></a><TODO> あれやらなきゃ <span class="timestamp-wrapper"><span class="timestamp"><2022-06-22 Wed></span></span><br /></li>
<li><a id="orgd136c14"></a><CANCEL> どうしようかな<br /></li>
<li><a id="org5edf146"></a><WAIT> これは待ち中 <span class="timestamp-wrapper"><span class="timestamp"><2022-06-30 Thu></span></span><br /></li>
<li><a id="org9cb8dbe"></a><DONE> 終わったよ <span class="timestamp-wrapper"><span class="timestamp"><2022-06-01 Wed></span></span><br />
<div class="outline-text-5" id="text-3-13-3-4">
<p>
ブログ用にエキスポートしてしまうと微妙ですね。
(org-modernを適用した) emacs上ではこのように見えます:
<img src="./images/emacs-org-todo.jpg" alt="emacs-org-todo.jpg" />
<code>C-c C-t</code> まで押したところ。更に <code>t</code> (TODO) <code>w</code> (WAIT) <code>d</code> (DONE) <code>c</code> (CANCEL)を押すとステータスが入ります。init.elでの設定:
</p>
<div class="org-src-container">
<pre class="src src-elisp">;; Add to TODO status
(setq org-todo-keywords
'((sequence "<TODO>(t)" "<WAIT>(w)" "|" "<DONE>(d)" "<CANCEL>(c)")))
</pre>
</div>
<p>
個人的には、むしろ箇条書きでこれができて欲しかったです。どうしてできるようにしなかったんだろう?
</p>
<p>
リンク:
</p>
<ul class="org-ul">
<li><a href="https://monkey-techblog.com/%E6%9C%80%E5%BC%B7%E3%81%AEtodo%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%81%EF%BC%9Forg-mode%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/">最強のTODOリスト!?org-modeを使ってみる</a></li>
<li><a href="https://qiita.com/zonkyy/items/821ea2b1e20f575c222f">Emacs の org-mode でスケジュール管理をしよう!</a></li>
<li><a href="https://www.mhatta.org/wp/2018/08/27/org-mode-101-5/">モーレツ! Org mode 教室 その5: TODOを管理する</a></li>
</ul>
</div>
</li>
</ol>
</div>
<div id="outline-container-org6a1dd16" class="outline-4">
<h4 id="org6a1dd16"><span class="section-number-4">3.13.4</span> 各種ファイルフォーマットへのエキスポート</h4>
<div class="outline-text-4" id="text-3-13-4">
<p>
html, markdownなどのフォーマットにエキスポートできます。いい感じの見た目になりますが、github/gitlabがorgファイルのレンダリングに対応していることで、個人的にはこれを使うことが激減しました。
</p>
</div>
</div>
<div id="outline-container-orgff7f99e" class="outline-4">
<h4 id="orgff7f99e"><span class="section-number-4">3.13.5</span> クラウド連携</h4>
<div class="outline-text-4" id="text-3-13-5">
<p>
magitを使ってorgファイルをgithub, gitlabにpushすると、github/gitlabがorgファイルをいい感じにレンダリングして表示してくれるので、これらを使ったwikiが簡単に実現できてしまいます。もちろん、他のPCやスマホから、レンダリングされたorgファイルを閲覧(git設定すれば編集も)することができます。
</p>
<p>
プライベートレポジトリなら個人用wiki、パブリックなら公開wikiとして使えます。
</p>
<p>
リンク:
</p>
<ul class="org-ul">
<li><a href="https://achiwa912.github.io/ortgithub.html">org-mode + github(/gitlab)で個人用Wikiを作る</a></li>
</ul>
</div>
</div>
<div id="outline-container-org0d80cf2" class="outline-4">
<h4 id="org0d80cf2"><span class="section-number-4">3.13.6</span> ブログ</h4>
<div class="outline-text-4" id="text-3-13-6">
<p>
<a href="https://achiwa912.github.io/startblog.html">初回</a> に書きましたが、このブログはorg-modeを使って書いています。
</p>
</div>
</div>
<div id="outline-container-org4a91e22" class="outline-4">
<h4 id="org4a91e22"><span class="section-number-4">3.13.7</span> org-mode用設定</h4>
<div class="outline-text-4" id="text-3-13-7">
<ul class="org-ul">
<li><a href="https://github.com/minad/org-modern">org-modern</a> - orgファイル編集画面をきれいに見やすく表示してくれます。単なるテキストファイルであるorgファイルをここまで見やすくしてくれるとは! これがあれば、もういちいちhtml等にエキスポートしなくてもよい!?</li>
<li>org-hide-emphasis-markers - 不要なマーカーを隠して見た目をスッキリさせてくれます。地味にうれしい機能です。</li>
<li>truncate-lines nil - (これ何だっけ?)</li>
<li>org-modeでのオートインデントはオフにしています。</li>
<li><code><s TAB</code> <code><q TAB</code> などでソースコードやクオートのブロックが入るショートカットです。超絶便利。これを知るまでは <code>#+BEGIN_SRC</code> 〜 <code>#+END_SRC</code> を手打ちしていました(汗)</li>
<li>To Do機能を使う場合のステータスを追加しています。</li>
</ul>
<div class="org-src-container">
<pre class="src src-elisp">;; Modern-looking org-mode (requires installing org-modern)
(use-package org-modern
:hook (org-mode . org-modern-mode))
;; hide emphasis markup
(setq org-hide-emphasis-markers t)
;; disable org-mode truncate-lines
(add-hook 'org-mode-hook
(lambda () (setq truncate-lines nil)))
;; Suppress auto-indent for org-mode
;;(add-hook 'org-mode-hook '(lambda () (electric-indent-local-mode -1)))
(add-hook 'org-mode-hook (lambda () (electric-indent-local-mode -1)))
;; enable shortcuts such as <s + TAB
(require 'org-tempo)
;; Add to TODO status
(setq org-todo-keywords
'((sequence "<TODO>(t)" "<WAIT>(w)" "|" "<DONE>(d)" "<CANCEL>(c)")))
</pre>
</div>