Emacsの補完機能

プログラムなどで予約語や変数名、関数名など全て記憶することはできない。 そんなときに補完機能は便利だ。 なんとなく覚えている文字を入力して、補完機能を呼び出せば候補を表示してくれる。 記憶を助けてくれるだけでなく、正確に速く入力する手助けにもなる。 しかしEmacsの補完機能は複雑だ。 その拡張性の高さから様々な補完パッケージが存在する。 Emacsの補完機能について、AI(gpt-oss:20b)と会話を行った。 見出しがプロンプト、内容がAIの回答である。(まとめの手前まで) emacsで主流の補完機能について教えて 主流の補完機能(completion)は次のように分けられます。 パッケージ 主な特徴 使い方 company-mode 会社統合型補完。モジュール単位で「backend」を切り替えて、語彙・関数・文法など多様に補完。 M-x company-mode で有効化。 C-<tab> で候補を選択。 corfu 軽量でキーボード指向。 M-x corfu-mode で有効化。 C-<tab> で候補表示、 M-p/M-n で移動。 ivy + counsel Emacs 版 fzf=。=C-s でインクリメンタル検索。 counsel-M-x でコマンド検索。補完は ivy の ivy-read が内部で呼ばれる。 helm UI が独自。 M-x helm-M-x で補完。検索結果をウィンドウに表示し、 C-n/C-p で選択。 vertico シンプルなインクリメンタル補完。 M-x vertico-mode で有効化。 C-<tab> で候補のリストを表示。 auto-complete 古典的パッケージ。 M-x ac-start で起動。 C-<tab> で候補。 company-mode が主流になっているので、基本はそちらに置き換えると良い。 builtin completion completion-at-point=(=M-TAB=)や =icomplete=(=M-?=)。Emacs 29 以降は標準で =completion-in-region が強化されている。 使い方のコツ プロジェクトごとに設定 use-package で :ensure t と :config で global-company-mode や global-corfu-mode を有効化。 ...

作成日: 2025年9月22日

モードラインを知る

Emacsのモードラインについてなんとなく知っていても、表示されているもの全て説明できる人は少ないのではないだろうか。 まずはモードラインが画面のどこにあるかおさらいしておこう。 GUI版 ーCUI版 この画面でいうとグレーの帯の部分がモードラインである。 このモードラインにはカレントバッファの現在の様々な状況が表示されている。 モードラインの構成は以下のようになっている。 GUI版 CUI版 以下の部分がGUI版と異なっている。 文字セットが(表示、入力、出力)の3つあること。 フレーム名があること。 一番左に - が一文字あり、マイナーモードの後は - の文字が連続で右端まで表示されている。 おそらく色が表示できない場合でもモードラインだとわかりやすいように線を引いている。 それぞれ何を表しているか説明する。 文字セット 現在どの文字セットが使われているか、1文字で表示している。 <表示の例> U UTF-8(Unicode)の文字セット - 特別な文字セットを使っていない = テキストデータを持っていない M-x list-coding-systems を実行すると文字コード一覧を確認できる。 ############################################### # List of coding systems in the following format: # MNEMONIC-LETTER -- CODING-SYSTEM-NAME # DOC-STRING U -- utf-8 (alias: mule-utf-8 cp65001) UTF-8 (no signature (BOM)) E -- japanese-iso-8bit (alias: euc-japan-1990 euc-japan euc-jp) ISO 2022 based EUC encoding for Japanese (MIME:EUC-JP). J -- iso-2022-jp (alias: junet) ISO 2022 based 7bit encoding for Japanese (MIME:ISO-2022-JP). S -- japanese-shift-jis (alias: shift_jis sjis) Shift-JIS 8-bit encoding for Japanese (MIME:SHIFT_JIS) E -- euc-jis-2004 (alias: euc-jisx0213) ISO 2022 based EUC encoding for JIS X 0213 (MIME:EUC-JIS-2004). J -- iso-2022-jp-2004 (alias: iso-2022-jp-3) ISO 2022 based 7bit encoding for JIS X 0213:2004 (MIME:ISO-2022-JP-2004). 1 -- iso-latin-1 (alias: iso-8859-1 latin-1) ISO 2022 based 8-bit encoding for Latin-1 (MIME:ISO-8859-1). B -- chinese-big5 (alias: big5 cn-big5 cp950) BIG5 8-bit encoding for Chinese (MIME:Big5) 特に使われているのはUnicodeのUTF-8(表示はU)とWindowsで使われているShift-jis(表示はS)だろうか。 一昔前のLinux系はeuc-jp(表示はE)が主に用いられていた。 ...

作成日: 2025年9月17日

Emacsの画面説明

Emacsの画面の構成は独特な部分がある。 WindowsやMac, Linuxがそれぞれの文化で進化していったように、Emacsも独自に進化したのだ。 Emacsを学ぶ、使う上で画面の構成を知っておくことは重要だ。 検索するときや誰か(AI含む)に尋ねるときに意思疎通がしやすくなるだろう。 Emacsには2種類の起動方法があり、ここではその2つをGUI版とCUI版と呼ぼう。 GUI版はアプリケーションごとにウィンドウが分かれているもの。 GUI版の画面はこちら。 CUI版はテキストしか扱えないCUI(例えばlinuxではstartxする前やsshコマンドで接続した後の状態)で起動した場合や、 emacs -nw で起動した場合のものである。 CUI版の画面はこちら。 GUI版は画像が表示されているが、CUI版はテキストのみの表示になっている。 画像の表示など、できることはGUI版のほうが多いのでGUI版が起動できる状態であれば GUI版を使うのがおすすめ。 構成要素 画面の構成要素はGUI版とCUI版で大きな違いは無い。 GUI版にはマウスで操作できるツールバーがある。 GUI版 CUI版 なお、上の画面でメニューバーからエコーエリアまでの領域をEmacsではフレームと呼ぶ。 Emacsの"ウィンドウ"は上記の画面の場所(メニューバーとエコーエリアに挟まれた領域)を指しており、 一般的なウィンドウとは異なることに注意。 領域 一般的な呼び方 Emacsでの呼び方 アプリが専有している描画領域 Windows(クライアント領域)<br>macOS(コンテンツビュー) フレーム 上記にタイトルバーがついたもの ウィンドウ 特になし 編集対象(文章や画像)を表示する領域 特になし(アプリによる) ウィンドウ 編集対象(文章や画像)が格納されているものはバッファと呼び、ウィンドウはその一部または全部を表示する領域である。 エコーエリア Emacsからのメッセージを表示したり、Emacsからの問い合わせに対して入力する場所。 Windowsでいうメッセージボックスに近い使い方。 フレームの一番下にある。 モードライン 様々な情報を表示する場所。 未保存状態や今の編集モード、現在の行数など。 ウィンドウの一番下にある。 Emacsは1つのフレームに複数のウィンドウを表示することができる。 下の画面は上下に二分割した後、さらに上の画面を左右に二分割して3つのウィンドウがある状態。 今回はウィンドウを分割する操作については説明しない。 ...

作成日: 2025年9月15日

スクリーンショットをorg-modeバッファ内に取り込む

スクリーンショットをすぐに記事に追加できたら便利だ。 org-modeでスクリーンショットをファイル内に素早く取り込めるよう、org-downloadパッケージが用意されている。 M-x package-list-packages~ や M-x package-install でorg-downloadをインストールしよう。 スクリーンショットはgnome-screenshotやscrot, flameshotなど色々なものがあるが、 3つ試した上でflameshotにした。 決め手はスクリーンショットを撮った後にすぐに図を編集できること。 テキストの追加や矢印や矩形などの図形挿入、モザイク処理もできる。 惜しい点はウィンドウを選択してスクリーンショットが撮れないこと。 なお、gnome-screenshotはウィンドウが選択できるが編集ができないのでボツにした。 Ubuntu24.04では以下のコマンドでflameshotがインストールできる。 sudo apt install flameshot Emacsの設定ファイルに以下を追加する。 ;; for org-download (setq org-download-heading-lvl nil) (require 'org-download) (setq org-download-screenshot-method "flameshot gui --raw > %s") org-download-heading-lvlの設定はお好みで。 デフォルトは0で一番上の階層の見出しがフォルダになって保存される。 ox-hugo用にカテゴリーで見出しを作っており、 *Emacs の下でスクリーンショットを撮った場合は [保存先フォルダ]/Emacs/タイムスタンプ.png に保存される。 nilにしておけば保存先フォルダに直接保存される。 スクリーンショットの保存フォルダはorgファイルごとに設定できる。 orgファイルの冒頭に以下の1行を追加する。 -*- mode: Org; org-download-image-dir: "~/savedir/static/img"; -*- savedirは任意のフォルダで良いが、staticを挟んでおくとox-hugoが自動でhugoディレクトリのstaticフォルダにコピーしてくれるので便利。 ここでEmacsを再起動する。 ...

作成日: 2025年9月14日

記事作成環境を整える

記事を作成する際、下準備があってなかなか本題に入れなかったりする。 それが障壁になって記事を作成するのが億劫になってしまったりする。 書く気になったときに書けるよう、環境を整えたい。 悩み (前提条件)ox-hugoを使ってサブツリー形式で記事を書いている。 フロントマターを毎回入力するのは面倒なので、ベースとなる記事からコピペしてタイトルやファイル名を書き直さないといけない。 もっと記事の内容に集中したい。 解決方法 思い立ったときにすぐにメモを取れるorg-capture。 org-caputureでox-hugo用のテンプレートを作ることですぐに記事作成できるようにする。 Emacsの設定ファイルに以下を追加。 (with-eval-after-load 'org-capture (defun org-hugo-new-subtree-post-capture-template () "Returns `org-capture' template string for new Hugo post. See `org-capture-templates' for more information." (let* ((title (read-from-minibuffer "Post Title: ")) ;Prompt to enter the post title (fname (org-hugo-slug title))) (mapconcat #'identity `( ,(concat "* TODO " title) ":PROPERTIES:" ,(concat ":EXPORT_FILE_NAME: " fname) ":END:" "%?\n") ;Place the cursor here finally "\n"))) (add-to-list 'org-capture-templates '("h" ;`org-capture' binding + h "Hugo post" entry (file+olp "~/myorgdir/subtree.org" "Emacs") (function org-hugo-new-subtree-post-capture-template)))) org-captureをC-c cに割り当てていない場合は以下も設定ファイルに追加しておこう。 ...

作成日: 2025年9月11日 · 最終更新日: 2025年9月12日

Emacsと生成AI(LLM)

EmacsでchatGPTやgemini,ollama(ローカルLLM)を扱うためのパッケージgptelについて紹介する。 試しにollamaを操作してみる。 ollamaはインストール済みでgpt-oss:20bのモデルをpullまたはrunしており、ローカルLAN向けにサーバが動いているものとする。 gptelをインストール後、Emacsの設定ファイルに以下を追記。 (setq gptel-model 'gpt-oss:20b gptel-backend (gptel-make-ollama "Ollama" :host "ollamaサーバのIPアドレス:11434" :stream t :models '(gpt-oss:20b))) M-x gptel すれば別バッファで会話が可能。 なお、以下の設定をしておくとorg-modeで開かれる(デフォルトはmarkdown mode) (setq gptel-default-mode 'org-mode) Emacsで作業しているときにそのバッファでプロンプトを記載して、プロンプトの下に回答を追記してもらうことも可能。 その場合は M-x gptel-send を使う。 範囲が選択されていればその範囲がプロンプトとして送られる。 何も選択せずにgptel-sendを実行するとバッファ全体が送られるので注意。 右側のバッファが会話用のバッファでやりとりしている例で、 そのあとに左側のバッファでバッファ内で範囲指定してプロンプトを投げて回答をもらった例。 会話用バッファは C-RET が gptel-send に割り当てられており、 デフォルトはバッファ全体がプロンプトとして送られるので過去の会話内容をふまえた返答が可能。 左側はグプトスについて聞いているが単発で聞いているのでモデルは知らないと素直に回答。 M-x gptel-menu から会話の前提条件を指定することもできる。 以下のとおり指定してみた。 あなたは関西弁で話す陽気な人です。ボケを混ぜつつ日本語30文字程度で返答して。 こんにちは おおきに!今日も一緒に笑い転げまっか?もう笑い止まんないで! それはいいですね ほっほ、笑顔でがんばろか!今日は盛り上がるで、にこりこりね。 Emacsってなんですか? エディタやんね!文字操作が楽ちん。バグも笑うで。 ...

作成日: 2025年9月10日

Emacsのキーボード操作(キーバインディング・ショートカットキー)

いまさらながらEmacsのデフォルトのキー操作について、日本語キーボードレイアウト上で可視化してみた。 先人の知恵(配置)を考慮しながら、自分好みのキー操作にカスタマイズしていきたい。 fundamental-modeのCtrlキーとの組み合わせ 設定ファイルを使用せず、一番素のメジャーモードであろうfundamental-modeでCtrlキーとの組み合わせでどんなfunctionが呼ばれるか図にしてみる。 ホームポジションから押しやすいキーとしてはC-;、C-,、C-.などが空いている。 それぞれのキーに割り当てられているものを関数名とともにおさらいする。 赤系 カーソル移動(小) キー操作 関数 機能 C-f forward-char カーソルを右に1つ移動 C-b backword-char カーソルを左に1つ移動 C-p previous-line カーソルを上に1つ移動 C-n next-line カーソルを下に1つ移動 青系 カーソル移動(大) キー操作 関数 機能 C-a move-beginning-of-lineforward-char カーソルを行の先頭に移動 C-e move-end-of-line カーソルを行の最後に移動 C-v scroll-up-command カーソルを約1画面分下に移動 オレンジ系 取り消し) キー操作 関数 機能 C-g keyboard-quit 途中の操作を取り消す C-/ undo 完了した操作の取り消し 緑系 削除・選択・コピペ キー操作 関数 機能 C-d delete-char カーソルの位置の文字を1文字消す。 C-SPACE, または C-@ set-mark-command カーソルの位置を選択開始位置にセット。 C-k kill-line カーソル位置から行末まで削除(カット) C-w kill-region 選択範囲を削除(カット) C-y yank カットしたものをペースト C-backspace backward-kill-word カーソル位置から前の単語を削除(カット) 紫系 検索 キー操作 関数 機能 C-s isearch-forward 下方向に検索 C-r isearch-backward 上方向に検索 ピンク系 連続 単体では何も機能せず、入力後のキーで様々な操作ができるようになっている。 ...

作成日: 2025年9月9日

Emacsと生産性

Emacsとは Emacs(イーマックス)の詳しい説明は公式サイトやウィキペディアを参照してほしい。 起源は1974年から、そして1985年にオープンソースとなり、現在も開発が続いているすごいソフトウェア。 エディタやOS(オペレーティングシステム)とも言われるけど、私はEmacsのことを コンピュータを(特にキーボードで)快適に操作するもの だと思っている。 生産性 Emacsはコンピュータをキーボードで効率的に操作するにあたり、様々な工夫がなされている。 それは今現在普及しているキー操作(例えばCtrl-Cでコピー、Ctrl-Vでペースト)とは大きく異なるが、コンピュータを使った仕事で生産性を高めたいと思うのならばEmacsを学ぶことは決して損にはならない。 Emacsはキーボード操作でプログラムを書けるし、実行できる。メールの読み書きやレポートの作成、今流行りの生成AIとのやりとりもEmacsというアプリの中ですべて実行できる。 そしてこのキー操作はほぼ全て自分の好きなようにカスタマイズできる。 Emacsは日本人向けに日本語で整備されたドキュメントが少なく、初学者は"大抵の人がうまく使えるように設計された別のソフトウェア"を選ぶかもしれない。 しかし最近は生成AIが賢くなり、Emacsのことも日本語で丁寧に教えてくれる。Emacsは難しいと敬遠していた人も、学び直すチャンスだ。 オープンソースの良いところは特定の人や企業の影響を受けにくいことだ。つまり、誰かの気まぐれで開発がストップしたり、急に有償になることはほぼ無い。 あなたは過去にお気に入りのソフトウェアが使えなくなったことはないだろうか。 Emacsはすぐに使いこなせるものではないが、自分好みに育てられ、これからずっと伴走してくれるソフトウェアだと思っている。 文字入力する際にキーボードを見ながらタイピングするのは遅い。タッチタイピングを習得すれば文字入力は圧倒的に速くなる。 それと同様、Emacsと仲良くなれば、文字入力だけでなく様々な操作が圧倒的に速くなるのだ。 ぜひEmacsを試してほしい。

作成日: 2025年9月8日

ox-hugoで記事内のテキストの見た目を変化させる

org-mode記法でどのように記事内のテキストの見た目が変わるか、またはテキストそのまま表示させる方法を例示する。 太字 orgファイル *太字* 出力 太字 斜体 /斜体/ 斜体 取り消し +取り消し+ 取り消し 下線 _下線_ 下線 コード =インラインコード= インラインコード #+begin_src R print("hello") #+end_src print("hello") hello なお、上記のようにbegin_src自体を表示させるには下のようにさらにbegin_srcで囲む必要がある。カンマはエスケープ文字。 EmacsではC-SPCとカーソル移動で範囲指定した上でC-c C-, sを押せばbegin_srcで囲ってくれて必要に応じてエスケープ文字を追加してくれる。 #+begin_src ,#+begin_src R print("hello") ,#+end_src #+end_src 引用 #+begin_quote これは引用です #+end_quote これは引用です リンク [[/][リンクテキスト]] リンクテキスト VERBATIM(チルダ) ~*太字*~ *太字* テキストそのまま出力させたいときに。 見出し **** 見出し1 ***** 見出し2 ****** 見出し3 見出し1 見出し2 見出し3 文字色 ox-hugo単体では色を指定する仕組みはないのでインラインHTMLで色を指定する。 事前にHugoの設定ファイルでインラインHTMLを有効にする必要がある。 ...

作成日: 2025年9月6日

ox-hugoでTODOトラッキングによる日付自動更新

まずはorg-modeでTODOをDONEにしたときにタイムスタンプを追加する設定を行う。 orgファイルの先頭に以下を追加する。 大事なのはDONEのときに!でタイムスタンプを追加する設定にすること。 #+TODO: TODO(t) WAIT(w@/!) | DONE(d!) CANCELED(c@) デフォルト設定だとそれぞれ状態を変化させたときに以下のようにリストが挿入される - State "CANCELED" from "DONE" [2025-09-04 木 19:11] \\ test - State "DONE" from "WAIT" [2025-09-04 木 19:11] - State "WAIT" from "TODO" [2025-09-04 木 19:11] \\ test 次にM-x customize-variableでorg-log-into-drawerをtにする。 TODOの状態を変化させたとき、以下のようにLOGBOOKドロワーに格納されるようになる。 :LOGBOOK: - State "CANCELED" from "WAIT" [2025-09-04 木 19:23] \\ test - State "WAIT" from "DONE" [2025-09-04 木 19:23] \\ test - State "DONE" from "WAIT" [2025-09-04 木 19:23] - State "WAIT" from "TODO" [2025-09-04 木 19:22] \\ test :END: この情報を使ってox-hugoではdate(記事作成日時)とlastmod(最終更新日時)を自動更新してくれる仕組みがある。 その仕組みを使うためにはorg-modeでドロワーのexportを有効にする必要がある。 ...

作成日: 2025年9月4日 · 最終更新日: 2025年9月5日