【お知らせ】


● 本サイトは NTEmacs の情報サイトなのですが、私が WSL版 emacs に乗り換えたため、そちらに関連する情報が多くなってきています。WSL版 emacs も Windows 上で動作する emacs ですので、本サイトの目的とは合致していると思っています。
● WSL版 emacs に行き着くまで、Linux版 emacs、MinGW版 emacs、Cygwin版 emacs といろいろ使ってきましたが、今の所、Windows で emacs を使うには WSL's 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 を使う場合の不便な点は概ね解消されていると思います。

【トピック】


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

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

helm で peco もどきのコマンドを使うための設定 をまとめした。peco が使えない shell-mode で利用できます。お試しください。

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

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

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

【本題】


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

  • Windows 10 April 2018 Update + WSL + Ubuntu + VcXsrv + emacs-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-18.04 + emacs-25 or 26 + emacs-mozc(mozc-server と連携)(Linux版 emacs)
  • Hyper-V + Ubuntu-18.04 + emacs-25 or 26 + emacs-mozc(mozc-server と連携)(Linux版 emacs)
  ※ 仮想環境で動かしているのに、非常に高速に動作します。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") (lambda ()
                              (interactive)
                              (desktop-clear)
                              (tramp-cleanup-all-connections)))
  • カレントバッファを一発で閉じるための設定
(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