64
72

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Emacs初心者だがオススメ設定を晒させてくれ

Last updated at Posted at 2017-03-28

普段はXcodeとかのIDEをよく使ってるんですが,最近はJSとかClojureとかでちょこちょこEmacs触ってたら改造にハマってきました.
色々やってきたなかで「使えそう」だと感じた設定の一部をinit.el形式で晒します.
だからみんなもオススメ設定を教えてください!!なんでもしますから!!

(間違っている点・改善すべき点が多いかと思いますが,そのときはご指摘いただければ幸いです!)

まずやっておく設定

  • 当然Emacsではpackage-listからモジュールをダウンロードしてくるのでその設定は必須
  • コマンドキーをメタキーにしておくのはもったいない.superを割り当てちゃおう
  • 自動補完がなければ昨今のIDEには勝てない
;; package管理
(package-initialize)
(setq package-archives
	  '(("gnu" . "http://elpa.gnu.org/packages/")
		("melpa" . "http://melpa.org/packages/")
		("org" . "http://orgmode.org/elpa/")))
		
;; cmdキーを superとして割り当てる
(setq mac-command-modifier 'super)

;; バックスペースの設定
(global-set-key (kbd "C-h") 'delete-backward-char)

;; auto-complete(自動補完)
(require 'auto-complete-config)
(global-auto-complete-mode 0.5)

見た目の設定

  • デフォルトの見た目はお世辞にもかっこいいとは言えない.フォントやカラーテーマ,透明度を変えて玄人感を演出(めっちゃ大事)
  • Emacsは基本split viewしまくるから,どれがアクティブかわかるようにしておいたほうが楽
  • コーディングしてるときにLine Numberが一瞬でわからないのはありえない
  • 邪魔なスクロールバーやメニューバーは隠してしまう
  • directory情報などは必要なだけ可視化
;; font
(add-to-list 'default-frame-alist '(font . "ricty-12"))

;; color theme
(load-theme 'monokai t)

;; alpha
(if window-system 
	(progn
	  (set-frame-parameter nil 'alpha 95)))

;; 非アクティブウィンドウの背景色を設定
(require 'hiwin)
(hiwin-activate)
(set-face-background 'hiwin-face "gray30")

;; line numberの表示
(require 'linum)
(global-linum-mode 1)

;; tabサイズ
(setq default-tab-width 4)

;; メニューバーを非表示
(menu-bar-mode 0)

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

;; default scroll bar消去
(scroll-bar-mode -1)

;; 現在ポイントがある関数名をモードラインに表示
(which-function-mode 1)

;; 対応する括弧をハイライト
(show-paren-mode 1)

;; リージョンのハイライト
(transient-mark-mode 1)

;; タイトルにフルパス表示
(setq frame-title-format "%f")

;;current directory 表示
(let ((ls (member 'mode-line-buffer-identification
				  mode-line-format)))
  (setcdr ls
	(cons '(:eval (concat " ("
			(abbreviate-file-name default-directory)
			")"))
			(cdr ls))))

起動はクールに

  • 初期のあいつは早々に退場で
  • 玄人感を出していこう
;; スタートアップメッセージを表示させない
(setq inhibit-startup-message 1)

;; ターミナルで起動したときにメニューを表示しない
(if (eq window-system 'x)
	(menu-bar-mode 1) (menu-bar-mode 0))
(menu-bar-mode nil)

;; scratchの初期メッセージ消去
(setq initial-scratch-message "")

TabやSidebarのカスタム

  • 基本的にelscreenとneotreeの設定
  • elscreenは,ChromeやFirefoxみたいにEmacsのwindowをタブ化してくれるすごいやつ
  • neotreeは,XcodeとかAndroid Studioみたいにサイドバーにdirectory構成を表示してくれるすごいやつ
  • るびきち「新生日刊Emacs」様の記事が大変参考になりました
;; elscreen(上部タブ)
(require 'elscreen)
(elscreen-start)
(global-set-key (kbd "s-t") 'elscreen-create)
(global-set-key "\C-l" 'elscreen-next)
(global-set-key "\C-r" 'elscreen-previous)
(global-set-key (kbd "s-d") 'elscreen-kill)
(set-face-attribute 'elscreen-tab-background-face nil
                    :background "grey10"
                    :foreground "grey90")
(set-face-attribute 'elscreen-tab-control-face nil
                    :background "grey20"
                    :foreground "grey90")
(set-face-attribute 'elscreen-tab-current-screen-face nil
                    :background "grey20"
                    :foreground "grey90")
(set-face-attribute 'elscreen-tab-other-screen-face nil
                    :background "grey30"
                    :foreground "grey60")
;;; [X]を表示しない
(setq elscreen-tab-display-kill-screen nil)
;;; [<->]を表示しない
(setq elscreen-tab-display-control nil)
;;; タブに表示させる内容を決定
(setq elscreen-buffer-to-nickname-alist
	  '(("^dired-mode$" .
		 (lambda ()
		   (format "Dired(%s)" dired-directory)))
		("^Info-mode$" .
		 (lambda ()
		   (format "Info(%s)" (file-name-nondirectory Info-current-file))))
		("^mew-draft-mode$" .
		 (lambda ()
		   (format "Mew(%s)" (buffer-name (current-buffer)))))
		("^mew-" . "Mew")
		("^irchat-" . "IRChat")
		("^liece-" . "Liece")
		("^lookup-" . "Lookup")))
(setq elscreen-mode-to-nickname-alist
	  '(("[Ss]hell" . "shell")
		("compilation" . "compile")
		("-telnet" . "telnet")
		("dict" . "OnlineDict")
		("*WL:Message*" . "Wanderlust")))

;; neotree(サイドバー)
(require 'neotree)
(global-set-key "\C-o" 'neotree-toggle)

操作性の向上

  • 正直これだけやっておいても十分「使える」Editorになるはず
  • mouse-wheel-scroll-amountは絶対に必要
  • エラー音は本当に気になるから最初に切っておこう

;; スクロールは1行ごとに
(setq mouse-wheel-scroll-amount '(1 ((shift) . 5)))

;; スクロールの加速をやめる
(setq mouse-wheel-progressive-speed nil)

;; bufferの最後でカーソルを動かそうとしても音をならなくする
(defun next-line (arg)
  (interactive "p")
  (condition-case nil
	  (line-move arg)
	(end-of-buffer)))

;; エラー音をならなくする
(setq ring-bell-function 'ignore)

ウィンドウ操作

  • golden-ratio-modeはめっちゃ便利.アクティブビューのサイズをいい感じに拡大してくれる(NeoTreeと干渉するので例外処理を追加)
  • 各ビューの移動は当然コマンドで
;; golden ratio
(golden-ratio-mode 1)
(add-to-list 'golden-ratio-exclude-buffer-names " *NeoTree*")

;; active window move
(global-set-key (kbd "<C-left>")  'windmove-left)
(global-set-key (kbd "<C-down>")  'windmove-down)
(global-set-key (kbd "<C-up>")    'windmove-up)
(global-set-key (kbd "<C-right>") 'windmove-right)

検索性の向上

  • いちいちM-xするのは面倒なのでキー割り当てちゃおう
  • rgrepしたときのいらないメッセージは消去
  • grepしたときに新規フレームが開くのは面倒なので,別ウィンドウとして表示させてしまう
  • window切り替えはでらうま倶楽部様を参考にさせていただきました
;; 大文字・小文字を区別しない
(setq case-fold-search t)

;; ファイル名検索
(define-key global-map [(super i)] 'find-name-dired)

;; ファイル内検索(いらないメッセージは消去)
(define-key global-map [(super f)] 'rgrep)
;; rgrepのheader messageを消去
(defun delete-grep-header ()
  (save-excursion
    (with-current-buffer grep-last-buffer
      (goto-line 5)
      (narrow-to-region (point) (point-max)))))
(defadvice grep (after delete-grep-header activate) (delete-grep-header))
(defadvice rgrep (after delete-grep-header activate) (delete-grep-header))

;; rgrep時などに,新規にwindowを立ち上げる
(setq special-display-buffer-names '("*Help*" "*compilation*" "*interpretation*" "*grep*" ))

;; "grepバッファに切り替える"
(defun my-switch-grep-buffer()
  (interactive)
	(if (get-buffer "*grep*")
			(pop-to-buffer "*grep*")
	  (message "No grep buffer")))
(global-set-key (kbd "s-e") 'my-switch-grep-buffer)

オススメショートカットコマンド


;; 履歴参照
(defmacro with-suppressed-message (&rest body)
  "Suppress new messages temporarily in the echo area and the `*Messages*' buffer while BODY is evaluated."
  (declare (indent 0))
  (let ((message-log-max nil))
    `(with-temp-message (or (current-message) "") ,@body)))
(require 'recentf)
(setq recentf-save-file "~/.emacs.d/.recentf")
(setq recentf-max-saved-items 1000)            ;; recentf に保存するファイルの数
(setq recentf-exclude '(".recentf"))           ;; .recentf自体は含まない
(setq recentf-auto-cleanup 'never)             ;; 保存する内容を整理
(run-with-idle-timer 30 t '(lambda ()          ;; 30秒ごとに .recentf を保存
							 (with-suppressed-message (recentf-save-list))))
(require 'recentf-ext)
(define-key global-map [(super r)] 'recentf-open-files)

;; コメントアウト
;; 選択範囲
(global-set-key (kbd "s-;") 'comment-region)

;; コメントアウト
;; 一行
(defun one-line-comment ()
  (interactive)
  (save-excursion
    (beginning-of-line)
    (set-mark (point))
    (end-of-line)
    (comment-or-uncomment-region (region-beginning) (region-end))))
(global-set-key (kbd "s-/") 'one-line-comment)

;; 直前のバッファに戻る
(global-set-key (kbd "s-[") 'switch-to-prev-buffer)

;; 次のバッファに進む
(global-set-key (kbd "s-]") 'switch-to-next-buffer)

;; redo+
(require 'redo+)
(global-set-key (kbd "C-z") 'redo)
(setq undo-no-redo t) ; 過去のundoがredoされないようにする
(setq undo-limit 600000)
(setq undo-strong-limit 900000)

Git関係

  • line number横に最新のcommitとのdiffがアイコンで表示されます
  • ファイル全体のdiffを見たい時はmagitを使うとかなり便利
  • global-auto-revert-modeで,SourceTreeなどの外部ツールでeditしたときも自動で更新させるように
;; git-gutter-fringe
(global-git-gutter-mode 1)

;; magit
(global-set-key (kbd "C-c C-g") 'magit-diff-working-tree)

;; ファイル編集時に,bufferを再読込
(global-auto-revert-mode 1)

その他

  • なんとEmacsがTerminalになります

;; eshell + shell-pop
(setq shell-pop-shell-type '("eshell" "*eshell*" (lambda () (eshell))))
(global-set-key (kbd "C-c o") 'shell-pop)

参考資料

Emacsのオススメ基本設定まとめ
るびきち「新生日刊Emacs」
Qiita: エコーエリアやMessagesバッファにメッセージを表示させたくない
その他多くのサイト様を参考にさせて頂きました

64
72
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
72

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?