term タグ別の記事一覧

Emacsのmagitで使用するgitバイナリのパスを指定する方法

 Xcodeと一緒にインストールしたgitコマンドをEmacsのmagitで使用すると、magitの各種処理がとても遅くなることは皆様ご存知かと思います。また、Xcodeを入れていない環境でmagitを使うと毎回Xcodeをインストールするか確認するダイアログが表示され非常に煩わしかったりします。

 この事象について背景を簡単に説明すると、最近のMacOS環境には/usr/bin/gitがデフォルトで存在するのですが、Xcodeをインストールしていない場合このファイルはただのstubで、実行するとXcodeのインストールを求めるダイアログを表示するという挙動になっています。また、Xcodeをインストールして、Xcode経由でgitをインストールすると、このgitが本物のgitのバイナリに差し替えられるのですが、このgitコマンドはAppleによってカスタマイズされているようで、起動が遅いという問題があります(多分EULAへの同意チェックとかそういうのが入っているっぽい)。そのため普段使いには/usr/local/bin以下に別途gitをインストールして使っている人も多いと思うのですが、magitはデフォルトでまず/usr/bin以下のgitを使う設定になっているので、その場合/usr/local/bin以下のgitが使われません。

 ということで、magitで/usr/local/bin以下のgitを使うようにするには、customize(M-x customize)でCustomize機能を呼び出し、「Exec Path」で検索→Exec Pathに/usr/local/binを追加、という手順で設定する必要があります。

 なお、「Magit Git Exectable」というcustomize項目もあるのですが、こちらを指定してもmagitではまずExec Pathで指定されたパスにgitコマンドを探しに行く模様です。そのため、Xcodeをインストールしていない環境で/usr/local/bin以下にgitをインストールし、Magit Git Executableで「/usr/local/bin/git」を指定した場合、gitに関連する操作をするたびにXcodeのインストールを求めるダイアログが表示される(そしてインストールせずにダイアログを消すと処理が正しく完了する)という面倒な感じになるのでご注意ください。

Mac OS X向けEmacs 25.1で日本語入力時にちらつく問題の原因

 Emacs for Mac OS Xで配布されているEmacsのMac OS X向けビルドでは、Emacs 24.4移行は標準でインラインでの日本語変換が可能になっている。これはEmacs 25.1でも同じだが、日本語入力時にカーソルがちらつく(1文字入力したり、変換するたびにカーソルが変換位置の先頭に一瞬移動してその後変換位置の最後に移動する)という現象が発生する。この問題はEmacs 24.5では発生していなかったので、24.5から25.1の間のどこかで混入したと思われる。そこで、EmacsのGitリポジトリをたどってこの問題がどこで発生するようになったのかを検証してみた。

 結論から言うと、9e77c1b7bcfd0807be7fe67daf73c2320e864309のコミットで問題が発生するようになっている。

 また、その1つ前のec10ba2792eef613caf47fff83e869d4bc177616のコミットでは問題は確認できなかった。

 問題のコミットで変更されているのはsrc/keyboard.cだったのがちょっと意外。てっきりMac OS X向けのコードであるns*.mあたりが原因だと思っていたのだが。おおむね問題の発生理由は想像できたのだが修正コードはもう少し周囲をチェックする必要があるのでまた今度。

 ちなみにこのコミットを見つけるために行った作業の流れだが、基本的にはいわゆる2分探索である。gitにはこの作業を自動で行うgit bisectコマンドがあるのだが、コンパイルしたバイナリに問題があるかどうかを自動で判別する手段がなかったのでビルド後にバイナリを実行して目視で問題が存在しているかをチェックしなければならなかったのが大変だった。

 (追記@5/21)パッチを作成して公開した。また、このパッチを利用せずとも(少なくともバージョン25.1および25.2では)この問題は以下のようにredisplay-dont-pause変数をnilに設定することで解決できることも発見した。

(setq redisplay-dont-pause nil)

 ただし、この変数はバージョン24.5でobsoleteとなっているので今後も利用できるかは分からない。また、Emacsのバグトラッカーに問題が報告されていたのでこれにコメントを入れておいた。

Mac OS X上でのEmacs 24設定(主にoptionキー周り)

 Mac OS XでATOKを使っていると、通常「¥」キーでは¥が入力される。しかし、Mac OS X(というかUTF-8)では¥と\は違う物として扱われる。そのため、色々と面倒くさいことが発生する。ことえりでは「¥」キーで\を入力する設定があるのだが、ATOKにはない。キーマップを書き換えて対応する、という方法もあるのだが、そういった方法は個人的に嫌いなので、Emacs側の設定で何とかすることにする。

 設定は以下の3点。

(setq mac-option-modifier nil)
(setq mac-command-modifier 'meta)
(global-set-key (kbd "C-M-¥") 'indent-region)

1行目でoptionキーをoptionキーとして認識させ、2行目でcommandキーをmetaキーとして認識させる。最後に、なぜかcontrol+command+option+¥がC-M-\として認識されないので、代わりにC-M-¥にindent-regionを割り当てる。

とりあえず、これでしばらくはしのげるかなと。

EmacsでC#(csharp-mode)を使う

 EmacsでC#コードをいじりたかったのでcsharp-modeを導入した。

 csharp-modeはGoogle Codeのcsharpmodeプロジェクトから入手可能。

 とりあえず現時点での最新版「csharp-mode-0.7.6.el」をダウンロードし、csharp-mode.elにリネームして~/.emacs.d/lisp/以下にコピーし、.emacs.elに下記を追加した。

;; C# mode
(require 'csharp-mode)
(setq auto-mode-alist
      (append '(("\\.cs$" . csharp-mode)) auto-mode-alist))

 ちなみに私の場合、.emacs.el中で下記のように~/.emacs.d/lispをロードパスに追加しているが、そうでない場合はsite-lispディレクトリなどロードパスに含まれている場所にcsharp-mode.elを置く必要がある。

;; add ~/.emacs.d/lisp to load-path
(add-to-list 'load-path "~/.emacs.d/lisp")

 最後にEmacs上でM-x byte-compile-fileを実行してcsharp-mode.elを指定してバイトコンパイルして完了。これでC#のコードが色付き(ハイライト)で表示されるようになる。

Emacs 23.2導入

 今までWindows環境での物書きにはNTEmacs JPプロジェクトがリリースしている<a href=https://sourceforge.jp/projects/ntemacsjp/releases/“>Emacs 22ベースのWindows向けバイナリを使っていたわけですが、最新安定版であるEmacs 23系ではマルチバイト文字の扱いを含めた色々な改善が加わっているとのことで、移行してみることに。

 NTEmacs JPプロジェクトではEmacs 23ベースのWindows向けバイナリをリリースしていないのですが、Gnupackというプロジェクトで日本語関連(というかIME)のパッチが適用されたEmacs 23.2のバイナリが公開されているので、そちらを利用。プロジェクトページはこちらNTEmacs 23.2はこちらからダウンロード可能。

 フォントなどの基本的な設定方法はEmacs 22系と同じ模様で、たとえばMSゴシックを使うには下記のような設定を.emacsに記述すればOK。

; 「msgochic」という名前で新たなフォントセットを定義
; 英字フォントとしてMS ゴシック、14ポイントを使用
(create-fontset-from-ascii-font
 "-outline-MS ゴシック-normal-r-normal-normal-14-*-*-*-*-*-iso8859-1"
 nil "msgochic")

; myfont-msgochicの日本語フォントとしてメイリオを使用
(set-fontset-font "fontset-msgochic"
                  'japanese-jisx0208
				  '("MS ゴシック" . "jisx0208-sjis"))

; myfont-msgochicのカタカナフォントとしてメイリオを使用
(set-fontset-font "fontset-msgochic"
                  'katakana-jisx0201
                  '("MS ゴシック" . "jisx0201-katakana"))

; 定義したフォントセットを登録
(add-to-list 'default-frame-alist
			 '(font . "fontset-msgochic"))

 あと、とりえあず様子見とのことでmule-ucs関係はすべて外してみましたが、今のところ問題は見られません。コピペで全角チルダ(~)が波ダッシュ(〜)になってしまう問題も解決されている模様。NTEmacs 22とは別のフォルダにインストールすることで共存も可能なので、ひとまずこれで様子見。

最近のemacs設定ファイル

 最近の.emacs。とりあえずバックアップ代わりにここで公開。

;; -*- coding: euc-jp -*-(custom-set-variables  ;; custom-set-variables was added by Custom.  ;; If you edit it by hand, you could mess it up, so be careful.  ;; Your init file should contain only one such instance.  ;; If there is more than one, they won't work right. '(c-default-style (quote ((c-mode . "k&r;") (c++-mode . "k&r;") (java-mode . "java") (awk-mode . "awk") (other . "gnu")))) '(case-fold-search t) '(current-language-environment "English") '(save-place t nil (saveplace)) '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))) '(tool-bar-mode nil nil (tool-bar)) '(transient-mark-mode t) '(uniquify-buffer-name-style (quote forward) nil (uniquify)))(custom-set-faces  ;; custom-set-faces was added by Custom.  ;; If you edit it by hand, you could mess it up, so be careful.  ;; Your init file should contain only one such instance.  ;; If there is more than one, they won't work right. );; .emacs.el;; 選択範囲の色を指定(set-face-background 'region "SkyBlue")(set-face-foreground 'region "black");; 起動時のウィンドウサイズ、色などを設定(if (boundp 'window-system)    (setq default-frame-alist          (append (list                   '(foreground-color . "black")  ; 文字色                   '(background-color . "white")  ; 背景色                   '(border-color     . "white")  ; ボーダー色                   '(mouse-color      . "black")  ; マウスカーソルの色                   '(cursor-color     . "black")  ; カーソルの色                   '(cursor-type      . box)      ; カーソルの形状                   '(top . 60) ; ウィンドウの表示位置(Y座標)                   '(left . 140) ; ウィンドウの表示位置(X座標)                   '(width . 50) ; ウィンドウの幅(文字数)                   '(height . 45) ; ウィンドウの高さ(文字数)                   )                  default-frame-alist)))(setq initial-frame-alist default-frame-alist )(global-set-key "\C-h" 'delete-backward-char)(prefer-coding-system 'utf-8-unix);;(autoload 'cperl-mode "cperl" "Perl editing mode." t)(require 'cperl-mode)(setq auto-mode-alist      (append '(("\\.pl$" . cperl-mode)		("\\.pm$" . cperl-mode)		("\\.mm$" . objc-mode)) auto-mode-alist));; Turn on tabs(setq indent-tabs-mode t)(setq-default indent-tabs-mode t);; Set the tab width(setq default-tab-width 4)(setq tab-width 4)(setq c-basic-indent 4);;python-mode(add-hook 'python-mode-hook	  '(lambda();;	     (setq indent-tabs-mode t)	     (setq indent-level 4)	     (setq python-indent 4)	     (setq tab-width 4)));;c-mode(add-hook 'c-mode-hook	  '(lambda()         (setq tab-width 4)         (setq indent-tabs-mode nil)         (setq c-basic-offset 4)));; キーワードのカラー表示を有効化;; 「t」の部分を「nil」にするとカラー表示をOffにできる(global-font-lock-mode t);; テキストエンコーディングとしてUTF-8を優先的に使用する;; 「utf-8」の部分を「cp932」とするとCP932(Windows用Shift JIS)優先となる(prefer-coding-system 'utf-8);; 起動時のメッセージを表示しない;;「t」を「nil」にするとメッセージが表示される(setq inhibit-startup-message t);; 選択範囲をハイライトする;;「t」を「nil」にするとハイライトなしに(setq-default transient-mark-mode t);;; 行番号・桁番号をモードラインに表示する・しない設定(line-number-mode t) ; 行番号。tなら表示、nilなら非表示(column-number-mode t) ; 桁番号。tなら表示、nilなら非表示;; 対応するカッコを色表示する(show-paren-mode 1);; オートセーブOff;; 「nil」を「t」にするとOnに(auto-save-mode nil);; バックアップファイルを作る;; 「nil」を「t」にするとバックアップファイルを作らない(setq backup-inhibited nil);; モードラインに現在時刻を表示する(display-time);; カレントディレクトリをホームディレクトリに設定;; ""内は任意のディレクトリを指定可能(cd "~/"); Emacsバージョン別の設定; for NTEmacs(if (string-match "Emacs 22" (emacs-version))	(progn; イタリックやボールドフォントを標準フォントから作成する(setq w32-enable-synthesized-fonts t); 使用するフォントを指定 for NTEmacs; 「myfont」という名前で新たなフォントセットを定義; 英字フォントとしてメイリオ、14ポイントを使用(create-fontset-from-ascii-font "-outline-メイリオ-normal-r-normal-normal-14-*-*-*-*-*-iso8859-1" nil "myfont"); myfontの日本語フォントとしてメイリオを使用; フォントサイズは英字のサイズに合わせる(set-fontset-font "fontset-myfont"                  'japanese-jisx0208				  '("メイリオ" . "jisx0208-sjis")); myfontのカタカナフォントとしてメイリオを使用; フォントサイズは英字のサイズに合わせる(set-fontset-font "fontset-myfont"                  'katakana-jisx0201                  '("メイリオ" . "jisx0201-katakana")); 定義したフォントセットを登録(setcdr (assoc 'font default-frame-alist) "fontset-myfont"); NTEmacsの設定ここまで	  ) t); for Meadow(if (string-match "Emacs 21" (emacs-version))	(progn; 日本語環境設定(set-language-environment "Japanese")(mw32-ime-initialize)(setq default-input-method "MW32-IME"); フォントセットを追加(w32-add-font     "Meiryo 14"     '((spec	((:char-spec ascii :height any)	 strict	 (w32-logfont "Meiryo" 0 -14 400 0 nil nil nil 0 1 3 0))	((:char-spec ascii :height any :weight bold)	 strict	 (w32-logfont "Meiryo" 0 -14 700 0 nil nil nil 0 1 3 0)	 ((spacing . -1)))	((:char-spec ascii :height any :slant italic)	 strict	 (w32-logfont "Meiryo" 0 -14 400 0   t nil nil 0 1 3 0))	((:char-spec ascii :height any :weight bold :slant italic)	 strict	 (w32-logfont "Meiryo" 0 -14 700 0   t nil nil 0 1 3 0)	 ((spacing . -1)))	((:char-spec japanese-jisx0208 :height any)	 strict	 (w32-logfont "Meiryo" 0 -14 400 0 nil nil nil 128 1 3 0))	((:char-spec japanese-jisx0208 :height any :weight bold)	 strict	 (w32-logfont "Meiryo" 0 -14 700 0 nil nil nil 128 1 3 0)	 ((spacing . -1)))	((:char-spec japanese-jisx0208 :height any :slant italic)	 strict	 (w32-logfont "Meiryo" 0 -14 400 0   t nil nil 128 1 3 0))	((:char-spec japanese-jisx0208 :height any :weight bold :slant italic)	 strict	 (w32-logfont "Meiryo" 0 -14 700 0   t nil nil 128 1 3 0)	 ((spacing . -1)))))); 起動時およびnew-frame時のフレーム(ウィンドウ)の設定。(add-to-list 'default-frame-alist '(font . "Meiryo 14")); IMEのフォントを設定(let ((logfont '(w32-logfont "Meiryo" 0 -14 400 0 nil nil nil 128 1 3 0)))  (modify-frame-parameters (selected-frame) (list (cons 'ime-font logfont)))  (add-to-list 'default-frame-alist (cons 'ime-font logfont))  ); Meadowの設定ここまで	  ) t)