;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; CSE環境Emacs Mac port及びCocoa Emacs向けお勧め初期設定
;; Ver. 20170228
;;
;; Copyright Eitetsu Oomoto 2016-2017
;;
;; 対象とするEmacs.appのディストリビューション
;;    Emacs Mac port 24.5.1 <-- こちらを優先
;;           http://www.muskmelon.jp/?page_id=79
;;           http://sakito.jp/emacs/emacs24.html
;;           http://kouzuka.blogspot.jp/2011/03/emacs-mac-port.html
;;    Cocoa Emacs (つまり素のGNU Emacs) 24.5.1
;;           https://www.gnu.org/software/emacs/history.html
;;           http://sakito.jp/emacs/emacs24.html
;;           https://emacsformacosx.com
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(message "%s" "DEBUG: init_CSE.el is loaded.")

;; 以下のサイトより数多くの設定を引用させて頂きました.Thanks!
;; http://macwiki.osdn.jp/wiki/index.php/MacOSX_WorkShop


;;;;;;;; 基本動作環境設定 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ファイル foo のバックアップファイル foo~ をコピーで生成
(setq backup-by-copying t)

;; マウスで選択した領域を自動yank
(setq mouse-drag-copy-region t)

;; emacsclientを起動 (重複起動時の負荷軽減)
(require 'server)
(unless (server-running-p) (server-start))

;; パッケージ管理システム
;; 安全のため,MELPA Stableのみを追加レポジトリとする
;; 引用 https://stable.melpa.org/#/getting-started
;;      https://www.emacswiki.org/emacs/MELPA
;; 参考URL
;; http://emacs-jp.github.io/packages/package-management/package-el.html
(require 'package)
(add-to-list 'package-archives
             '("melpa-stable" . "https://stable.melpa.org/packages/"))
(package-initialize)


;;;;;;;; 言語環境関連設定 (基本的にUTF-8) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 言語環境を日本語とする
(set-language-environment 'Japanese)

;; 文字コード体系は極力UTF-8とする
(prefer-coding-system 'utf-8)

;; Mac OS Xでのファイル名エンコーディングへの対応
;; 引用 https://masutaka.net/chalow/2009-07-09-1.html
(require 'ucs-normalize)
(set-file-name-coding-system 'utf-8-hfs)
(setq locale-coding-system 'utf-8-hfs)

;; バックスラッシュ入力への根本的対応
;; UTF-8の Yen-Sign を \ へマップする
;; 引用 http://qiita.com/aKenjiKato/items/bb20c335eee1612c36e5
;; [165]が¥ (円マーク) を, [92] が \ (バックスラッシュ) を表す
;;(define-key global-map [165] [92])
;; incremental-search modeへのバックスラッシュ対応
;;(define-key isearch-mode-map [165] [92])
;; 上記のバックスラッシュ入力対応は,Mac OSの文字入力側で対処すべき
;; と思いますので,以下URLを参照の上,キーボード入力を調整すべし.
;; http://beadored.com/mac-us-keybord-backslash/
;; http://okidata-ja.custhelp.com/app/answers/detail/a_id/148/~/mac-os-x-環境で¥を、バックスラッシュで入力するための設定変更方法-(¥は半角です)

;; Emacs Mac portの場合のキーボード/日本語入力対応
(when macport-p
  (message "Input setting for Mac port.")

  ;; ミニバッファでは英語モードへ切り替え
  (mac-auto-ascii-mode 1)
  ;; CommandキーをMetaキーに割り当てない
  (setq mac-command-key-is-meta nil)
  ;;(setq mac-option-modifier 'meta)
  (setq mac-command-modifier 'super)
  ;; キーバインド設定 (ある程度 Mac 標準UIに準拠させる)
  (global-set-key [?\s-c] 'kill-ring-save)
  (global-set-key [?\s-v] 'yank)
  (global-set-key [?\s-x] 'kill-region)
  (global-set-key [?\s-z] 'undo)
  (global-set-key [?\s-s] 'save-buffer)
  (global-set-key [?\s-q] 'save-buffers-kill-terminal)
  (global-set-key [?\s-f] 'isearch-forward)
  (global-set-key [?\s-g] 'isearch-repeat-forward)
  ;;(global-set-key "\C-h" 'delete-backward-char)
  ;;(global-set-key "\M-h" 'help)
  ;;(global-set-key [?\s-q] 'kill-emacs)

  ;; 入力モードをカーソル色で区別,英語の時はmedium blueに,
  ;; 日本語の時はfirebrickにする (Mac portのみ有効)
  ;; 引用 http://keisanbutsuriya.hateblo.jp/entry/2016/04/10/115945
  (defun mac-selected-keyboard-input-source-change-hook-func ()
    "カーソル色を英語の時はmedium blueに,日本語の時はfirebrickにします."
    (let ((mac-input-source (mac-input-source)))
      (set-cursor-color
       (if (or (string-match "\\.US$" mac-input-source) ;; USスクリプト
               (string-match "\\.Roman$" mac-input-source)) ;; Roman入力
           "medium blue" ;; 英語入力時
         "firebrick")))) ;; 日本語入力時(正確には英語入力でない時)
  (add-hook 'mac-selected-keyboard-input-source-change-hook
            'mac-selected-keyboard-input-source-change-hook-func)
  ;; EmacsからInput Methodを呼ぶ場合の対応 (For Prof. Hiraishi)
  (add-hook 'input-method-activate-hook
            (lambda() (set-cursor-color "firebrick"))) ;; 日本語IM on
  (add-hook 'input-method-inactivate-hook
            (lambda() (set-cursor-color "MediumBlue")))) ;; 日本語IM off

;; Cocoa Emacsの場合のキーボード/日本語入力対応
(when ns-p
  (message "Input setting for Cocoa.")

  (when (boundp 'mac-input-method-parameters) ;; inline-patch適用の場合のみ有効
    (message "It is seemed to be applied the inline patch.")

    ;; Input Method関連設定
    (setq default-input-method "MacOSX")
    ;; 全角記号類「!”#$%&’()=〜|`『+*』<>?_」を入力できるように
    (mac-add-key-passed-to-system 'shift)
    ;; Optionキーによる特殊文字入力を可能に
    (setq ns-option-modifier 'none)
    ;; 入力モードをカーソル色で区別,英語の時はmedium blueに,
    ;; 日本語の時はfirebrickにする (Mac portのみ有効)
    ;; 引用 http://suzuki.tdiary.net/20160103.html
    (defun mac-input-method-decorate (roman-source japanese-source)
      (mac-set-input-method-parameter japanese-source 'cursor-color "firebrick")
      (mac-set-input-method-parameter roman-source 'cursor-color "MediumBlue"))
    (cond
     ;; ことえり
     ((string-match "com.apple.inputmethod.Kotoeri" (mac-get-current-input-source))
      (mac-input-method-decorate
       "com.apple.inputmethod.Kotoeri.Roman"
       "com.apple.inputmethod.Kotoeri.Japanese"))
     ;; Google 日本語入力
     ((string-match "com.google.inputmethod.Japanese" (mac-get-current-input-source))
      (mac-input-method-decorate
       "com.google.inputmethod.Japanese.Roman"
       "com.google.inputmethod.Japanese.base")))
    
    ;; 起動直後は英数モードにする
    (add-hook 'after-init-hook 'mac-change-language-to-us)))

;; 標準的Cut&Pasteキー操作エミュレーションを有効化
(cua-selection-mode t)

;; Font設定
(create-fontset-from-ascii-font "Menlo-14:weight=normal:slant=normal" nil "menlomarugo")
;;(create-fontset-from-ascii-font "Menlo-17:weight=normal:slant=normal" nil "menlomarugo") ;; 老眼向け
(set-fontset-font "fontset-menlomarugo" 'unicode (font-spec :family "Hiragino Maru Gothic ProN" ) nil 'append)
(add-to-list 'default-frame-alist '(font . "fontset-menlomarugo"))
(setq face-font-rescale-alist '((".*Hiragino.*" . 1.2) (".*Menlo.*" . 1.0)))
;; フォント幅設定確認用文字列 (半角:全角 = 1:2)
;;||||||||||||||||||||||||||
;;||||||||||||||||||||||||||
;;||||||||あいうえお||||||||  <-- ここ揃ってますか?
;;||||||||||||||||||||||||||
;;||||||||||||||||||||||||||


;;;;;;;; Look & Feel カスタマイズ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; マウス・スクロールをヌルヌル滑らかにする (Mac port版専用)
;; この設定はEmacs Mac port 24.5.1では既にデフォルトとなっている
;;(when macport-p
;;  (setq mac-mouse-wheel-smooth-scroll t))

;; ツールバー非表示
(tool-bar-mode -1)

;; メニューバー非表示 (本設定はMac port版では効かない)
(menu-bar-mode -1)

;; タイトルバー表示をホスト名でなくファイル名 (Cocoa Emacsの挙動に合わせる)
;; 引用 http://qiita.com/takaxp/items/a86ee2aacb27c7c3a902
(when macport-p
  (setq frame-title-format (format (if (buffer-file-name) "%%f" "%%b"))))

;; フォントスケーリング停止 (本設定はMac port版では効かない模様)
(setq scalable-fonts-allowed nil)

;; エディット領域をデフォルトより広げて幅80文字&高さ37行を確保
;; 行番号表示領域分を4文字なので,それを含めて幅84文字としている
(setq default-frame-alist
      (append (list '(width . 84) '(height . 37)) default-frame-alist))

;; デフォルトの透明度を設定する (アクティブ90%,非アクティブ75%)
(add-to-list 'default-frame-alist '(alpha . (90 75)))

;; 背景色・前景色
;; 引用 http://kei10in.hatenablog.jp/entry/20101101/1288617632
(custom-set-faces
 '(default ((t
             (:background "ivory" :foreground "black")
             ))))

;; カーソル色を設定
(set-cursor-color "medium blue")

;; カーソル点滅(周期1秒,遅延5秒)
(setq blink-cursor-interval 0.5)
(setq blink-cursor-delay 5.0)
;;(blink-cursor-mode 1)   <--- 点滅を止める時は -1 に設定

;; 現在行をハイライト
(global-hl-line-mode)

;; 行間について1行高さの10%相当を広げる
(setq-default line-spacing 0.1)
;; (setq-default line-spacing 4) ;; この記法だと行間が4ピクセル分広がる

;; スクロールを自然に,かつ,カーソルが一番下へ達する前にスクロール
;; 引用 https://www.emacswiki.org/emacs/SmoothScrolling
(setq scroll-margin 4
      scroll-conservatively 0
      scroll-up-aggressively 0.01
      scroll-down-aggressively 0.01)
(setq-default scroll-up-aggressively 0.01
              scroll-down-aggressively 0.01)
(setq comint-scroll-show-maximum-output t) ;; for shell-mode
;; ちなみに C-l にてカーソル位置の行が画面中央へスクロール移動

;; 警告音の代わりに画面フラッシュ
;;(setq visible-bell t)

;; スマート Drag'n Drop
;;(require 'smart-dnd)

;; スプラッシュ画像を確率 1/7 で変更
;; 画像出典 プロ生ちゃん http://pronama.azurewebsites.net/pronama/
(random t)
(when (equal (random 7) 0)
  (setq fancy-splash-image (expand-file-name "~/.emacs.d/conf/EmacsForCSE.png")))


;;;;;;;; プログラミング演習向けスペシャルチューニング ;;;;;;;;;;;;;;;;;;;;
;; C, C++系言語のコーディングスタイルを指定
;; C, C++ではK&Rスタイル,Javaでは標準Javaスタイル
(setq c-default-style '((java-mode . "java")
                        (awk-mode . "awk")
                        (other . "k&r")))

;; TAB文字幅を 8 にセット (Emacsの標準値は8)
;; 引用 http://yohshiy.blog.fc2.com/blog-entry-172.html
;;(setq tab-width 8)

;; インデントオフセット (字下げ幅) を 4 にセット
(setq c-basic-offset 4)
;; ちなみに java-mode ではデフォルトで 4 となっている

;; インデントをスペースで表現,尚,makefileモードではTAB文字は有効のまま
(setq-default indent-tabs-mode nil)

;; 対応する括弧を強調表示
(show-paren-mode)

;; 行番号を左側に表示 (4桁表示, フォント表示を少し調整)
;; ファンクションキー F5 で行番号表示をON/OFF
;; 尚,ファンクションキー F5 ~ F9 は自由に割当可能, by るびきち
(global-linum-mode t)
(setq linum-format "%4d")
 ;; 10000行以上は想定外だが,そもそも,そんなソースファイルは論外か?
 (set-face-attribute 'linum nil
                     :foreground "dark blue"
                     :height 0.9)
 (global-set-key [f5] 'linum-mode)
 
 ;; バッファ全体を再インデント,ファンクションキー F6 押下にて実行
 ;; 引用 http://blog.livedoor.jp/anchorblues/archives/emacs-all-indent.html
 (defun all-indent()
   (interactive)
   (mark-whole-buffer)
   (indent-region (region-beginning)(region-end))
   (message-box "%s" "編集中のコードのインデントをやり直しました!"))
 (global-set-key [f6] 'all-indent)
 
 ;; 空白を一気に削除 (hungry delete)
 (setq c-hungry-delete-key t)
 
 ;; TAB文字,及び,全角の空白・記号・英数字をハイライト
 (load "zenkaku.el") ;; 慣れてきたらコメントアウトして無効化もあり
 
 
 ;;;;;;;; End of init_CSE.el ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;