【お知らせ】


● 本サイトは NTEmacs の情報サイトなのですが、私が WSL emacs に乗り換えたため、そちらに関連する情報が多くなってきています。WSL emacs も Windows 上で動作する emacs ですので、本サイトの目的とは合致していると思っています。
● WSL emacs に行き着くまで、Linux版 emacs、MinGW版 emacs、Cygwin版 emacs といろいろ使ってきましたが、今の所、Windows で emacs を使うには WSL emacs on VcXsrv がベストな選択だと思っています。wsl コマンド(https://github.com/smzht/wsl-utils)や Windows コマンド(https://github.com/smzht/win-utils)の作成、Google日本語入力 と連携可能な mozc_emacs_helper.exe のビルドの成功(https://github.com/smzht/mozc_emacs_helper)、さらには以降で紹介している emacs の設定の整備により、WSL 上で emacs を使う場合の不便な点は概ね解消されていると思います。

【トピック】


「なぜ、Emacs を使っているか?」を書きました。よければお読みください。

NTEmacs の設定とは関係ありませんが、Windows の操作を emacs のキーバインドで行うための設定 を公開しています。OS まるごと emacs キーバインドで操作することができ快適です。お試しください!

Windows Subsystem for Linux で emacs を使うための設定 をまとめました。Windows 10 Creators Update 以降、Windows との親和性も徐々に高くなって来ています。お試しください!

emacs 上の shell で動作する peco もどきのコマンド を作成してみました。お試しください。

epeco コマンドと組み合わせて利用するための einp コマンド を作成してみました。詳しくは以下を参照ください。

Cygwin から WSL への移行を容易にするために、WSL のシェルから Cygwin のコマンドを実行するためのコマンド cyg を作成してみました。お試しください。

emacs の日本語マニュアル を公開されている方がいらっしゃいます。大作です。紹介させていただきます。

【本題】


このウィキでは、Windows で GNU Emacs を 快適に利用するための設定についてまとめています。完全ではありませんが、以下の環境で動作確認しています。

  • Windows 10 April 2018 Update + WSL + Ubuntu + VcXsrv + emacs-24 or 25 or 26 + emacs-mozc(Google日本語入力 と連携)(Linux版 emacs)
  ※ 現在のメイン環境です。「WSL で emacs を使うための設定」で設定方法を紹介しています。

  ※ この環境の特徴は、以下のとおりです。
   ・MinGW版 emacs と異なり、設定でのいろいろな workaround(fakecygpty の設定や UTF-8 を使うための設定など)が不要です。
   ・Cywin版 emacs と異なり、MinGW版 emacs 並に高速に動作します。
   ・Google日本語入力 と連携した emacs-mozc の導入で、日本語入力にも対応しています。
   ・Cygwin版 emacs で度々発生する vfork 問題が一切起こりません。
   ・Linux の OS 環境をフルに利用可能です。(MinGW版 emacs の様に別途 UNIX 環境を準備する必要がありません。)
   ・設定により、dired から Windows のドキュメントを直接開くことができます。(wslstart という cygstart と同機能のコマンドの作成により実現しています。)
   ・設定により、dired で Windows のショートカットをシンボリックリンクの様に扱えます。(w32-symlinks.el から最低限必要な設定を流用することで実現しています。)
   ・設定により、Windows パスや UNC パスを Linux のパスと同様に利用できます。(emacs の Magic File Names の仕組みを利用して実現しています。)
   ・ViirtualBox で Linux を動作させた環境と異なり、Keyhac との連携(ウィンドウの切り替えなど)が可能です。
   ・一つデメリットを挙げれば、画面へのファイルのドラッグ&ドロップができないことです。これは、「dired を OS と連携して使うための設定」で代替になると思います。

  • Windows 10 + gnupack-13.06(Cygwin は最新に更新)+ emacs-mozc(Google日本語入力 と連携)(Cygwin版 emacs)
  • Windows 10 + gnupack-13.06(Cygwin は最新に更新)+ Cygwin の emacs-w32 での差替え + emacs-mozc(Google日本語入力 と連携)(Cygwin版 emacs)
  ※ WSL に移行する前まで使っていた環境です。
  ※ 比較的新しいバージョンが提供される Cygwin の emacs を利用する方法は、「gnupack-13 の環境で Cygwin の emacs を利用するための設定」を参考としてください。

  ※ この環境の特徴は、以下のとおりです。(以前までお勧めしていたので、まとめています。)
   ・MinGW版 よりちょっと(かなり?)遅めですが、設定でのいろいろな workaround が不要です。
   ・cygwin 側で作成した Windows ショートカット(CYGWIN環境変数 が winsymlinks:lnk に設定された状態で ln -s コマンドで作成したリンク)が、シンボリックリンクとして認識されるのが便利です。
   ・Google日本語入力 と連携した emacs-mozc の導入で、日本語入力も安定しています。
   ・何らかのタイミングで vfork関連のエラーが発生することがあります。これを解決するのが厄介で、Cygwin版 emacs を使う上での大きなデメリットとなっています。(この症状が発生した場合、Cygwin に対して rebaseall を行った後、OS の再起動をすると改善するような気がします。Cygwin の更新をすると rebase が掛かるので、その後 OS の再起動をすると良いと思います。)

  • Windows 10 + gnupack-11.00(Cygwin は最新に更新)+ NTEmacs64 での差替え (MinGW版 emacs)
  • Windows 10 + gnupack-11.00(Cygwin は最新に更新)+ GNU配布版 emacs での差替え + emacs-mozc(Google日本語入力 と連携)(MinGW版 emacs)
  ※ 最新の MinGW版 emacs を利用する方法は、「gnupack-11.00 の環境で NTEmacs64 を利用するための設定」を参考としてください。
  ※ Windows のパスがそのまま利用できるなど、Windows との親和性は高いです。但し、問題なく使うためのハードルも高い(本質的ではない、設定でのいろいろな workaround が必要)です。

  • VirtualBox + Ubuntu-16.04 + emacs-24.5 or 25.3 + emacs-mozc(mozc-server と連携)(Linux版 emacs)
  ※ Windows 上で Ubuntu 環境を立ち上げる方法は、「Windows で簡単に Linux を使う方法」を参考としてください。
  ※ 仮想環境で動かしているのに、非常に高速に動作します。Windows 環境との連携が重要でなければ、この環境が一番お勧めなのかもしれません。


※ 本ページで紹介する設定は、emacs バージョン 24.4 以上で利用可能な設定となっています。
※ MinGW版 emacs を利用する場合、cygwin の導入、cygdriveプレフィクス の / 設定、cygwin-mount.el のインストールが前提となっている設定箇所があります。
※ Cygwin版 emacs 、MinGW版 emacs を利用する場合、以下の「【基本設定】」が行われていることが前提となっている設定箇所が多数あります。本ページの設定を利用する場合には、「【基本設定】」の利用を強くお勧めします。

※ 設定の読み込みには、init-loader.el の利用をお勧めします。
※ フォントを滑らかに表示させるためには、以下をお試しください。

■ Cygwin版 emacs 特有の設定




(関連)


■ MinGW版 emacs 特有の設定





■ Windows版 emacs 共通の設定 (上記の「【基本設定】」が前提となっている設定があります)







■ Linux の emacs で利用できる設定



(関連)

■ Windows Subsystem for Linux の emacs で利用できる設定






(関連)

■ emacs 全般で利用できる設定








■ 説明ページを作るまでもない設定の紹介


  • 沢山開いているバッファをできるだけ一度に閉じるための設定
(global-set-key (kbd "M-c") 'desktop-clear)
  • カレントバッファを一発で閉じるための設定
(global-set-key (kbd "M-k") (lambda ()
                              (interactive)
                              (kill-buffer (buffer-name))))
  • ウィンドウの右端で改行をするかどうかを切り替えるための設定
(global-set-key (kbd "M-RET") 'toggle-truncate-lines)
  • 横スクロールするための設定(キー設定が逆の感覚の方もいるかも)
(global-set-key (kbd "C-,") 'scroll-left)  ; < のキー
(global-set-key (kbd "C-.") 'scroll-right) ; > のキー
  • other-window がなければ開き、その window に移動するための設定
(defun other-window-or-split ()
  (interactive)
  (when (one-window-p)
    (split-window-sensibly))
  (other-window 1))

(global-set-key (kbd "C-x o") 'other-window-or-split)
  • 2 分割しているバッファを入れ替えるための設定
(defun swap-screen-with-cursor()
  "Swap two screen,with cursor in same buffer."
  (interactive)
  (let ((thiswin (selected-window))
        (thisbuf (window-buffer)))
    (other-window 1)
    (set-window-buffer thiswin (window-buffer))
    (set-window-buffer (selected-window) thisbuf)))

(global-set-key (kbd "M-t") 'swap-screen-with-cursor)
  • バッファの分割方向を縦と横とで入れ替えるための設定
(require 'rotate)
(setq rotate-functions '(rotate:even-horizontal rotate:even-vertical))
(global-set-key (kbd "M-\\") 'rotate-layout)
  • tramp を使っていて、NTEmacs の起動が遅くなる場合に必要な設定
(require 'recentf)
(setq recentf-auto-cleanup 'never)
(recentf-mode 1)
  • その他参考

■ おまけ




■ その他



  • Subversion には dsvn を使っています。melpa からインストールできます。
  • Git には magit が便利です。

  • Vimacs というのもあるんですね。Evil と逆の発想のものだと思います。

  • spacemacsというのも見つけました。Windows版 emacs でも動いているようです。

■ 参考サイト


  • Manual
  • Common Lisp
  • functional-programming
  • nadvice
`:before'	(lambda (&rest r) (apply FUNCTION r) (apply OLDFUN r))
`:after'	(lambda (&rest r) (prog1 (apply OLDFUN r) (apply FUNCTION r)))
`:around'	(lambda (&rest r) (apply FUNCTION OLDFUN r))
`:override'	(lambda (&rest r) (apply FUNCTION r))
`:before-while'	(lambda (&rest r) (and (apply FUNCTION r) (apply OLDFUN r)))
`:before-until'	(lambda (&rest r) (or  (apply FUNCTION r) (apply OLDFUN r)))
`:after-while'	(lambda (&rest r) (and (apply OLDFUN r) (apply FUNCTION r)))
`:after-until'	(lambda (&rest r) (or  (apply OLDFUN r) (apply FUNCTION r)))
`:filter-args'	(lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
`:filter-return'(lambda (&rest r) (funcall FUNCTION (apply OLDFUN r)))
  • generalized variables
  • lexical-binding
  • flet
  • noflet
  • function
  • custom-set-variables
  • buffer local variable
  • emacs
  • font
  • dabbrev
  • helm
  • mozc
  • Google日本語入力
  • eclim
  • OminiSharp
  • roslyn
  • lsp
  • eglot
  • IDE
  • WSL


  • binfmt_misc
  • D-Bus
  • bash
  • ssh
  • socat
  • SocksCap64
  • Named Pipe TCP Proxy Utility
  • trac
  • DOS
  • UAC
  • fsutil
  • Windows Shortcut File Format
  • Android
  • Keyhac
  • closure
  • AutoHotKey
  • Bat To Exe Converter
  • emacs keybind
  • q-text-as-data
  • qq
  • Open-usp-Tukubai

  • article