emacs初期設定(キーアサイン設定)

emacs初期設定、キーアサインの変更や簡単なコマンドの追加など。
emacs27.1で使っているものです。
何をしているかはコメントを読んでください。


;;;
;;; emacs初期設定 (キーアサイン設定)
;;;

;; iswitchb.el

(iswitchb-mode 1)
;; バッファ読み取り関数を iswitchb にする
(setq reqd-buffer-function 'iswitchb-read-buffer)
;; 部分文字列の代わりに正規表現を使う場合は t にする
(setq iswitchb-regexp t)
;; 新しいバッファを作成するときにいちいち聞いてこない
(setq iswitchb-prompt-newbuffer nil)

;;;; added after emacs29 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(setq null-device "/dev/null")
(setq transient-mark-mode t)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;; 時々のメインの作業に応じて決めると良い。
;;; ファイルの新規生成時は文字コードに注意すること。
(prefer-coding-system 'utf-8-dos)
;;;(prefer-coding-system 'utf-8-unix)
;;;(prefer-coding-system 'sjis-dos)
;;;(prefer-coding-system 'cp932)

;;(set-file-name-coding-system 'sjis-dos)
;;(set-file-name-coding-system 'cp932)

;;; font-lockの設定
(if window-system
    (progn
;;;      (setq font-lock-support-mode 'lazy-lock-mode)
      (global-font-lock-mode t)))

;;; 標準キーアサインの変更と標準コマンドに対する個人的キーアサインの追加
(global-unset-key [C-backspace])
(global-unset-key "\C-z")
(global-set-key "\C-z" 'undo)
(global-set-key "\M-s" 'search-forward)
(global-set-key "\M-r" 'search-backward)
(global-set-key "\M-i" 'indent-relative)
(global-set-key "\C-]" 'set-mark-command)
(global-set-key "\C-@" 'pop-to-mark-command)
(global-set-key (kbd "<f9>") 'other-window)
(global-set-key (kbd "S-<f9>") (lambda () (interactive)(other-window -1)))
(global-set-key (kbd "<f10>") 'ido-switch-buffer)
(global-set-key (kbd "S-C-o") 'ido-switch-buffer)
(global-set-key (kbd "<f11>") 'other-frame)
(global-set-key (kbd "S-<f11>") (lambda() (interactive)(other-frame -1)))
(global-unset-key "\C-xf")
(global-set-key "\C-xfc" 'set-fill-column)
(global-set-key "\C-xfp" 'set-fill-prefix)
(global-set-key "\C-x\C-y" 'insert-register)

;; Always end a file with a newline
(setq require-final-newline t)

;;; 最下行で↓を押しても勝手に行を増やさない
(setq next-line-add-newlines nil)

;;; C-U C-SPC C-SPC で連続してポップマークになるようにする。
(setq set-mark-command-repeat-pop t)

;;; Shell Mode で末尾に^Mが付かないようにする
(add-hook 'comint-output-filter-functions 'shell-strip-ctrl-m nil t)

;;; CC mode のスタイル
;;;    custom で設定すると、ファイル出力などのタイミングで
;;;    c-basic-offsetが5に戻ってしまうので、伝統的なフックを使うことに
;;;    した。


(defun c-set-style-kandr-base ()
  (c-set-style "k&r")
  (setq c-comment-only-line-offset 0)
  (setq comment-start "/*")
  (setq c-block-comment-prefix "")
  (setq comment-end "*/")
  (c-set-offset 'inline-open 0)
  (c-set-offset 'statement-case-open 4)
  (c-set-offset 'namespace-open 0)
  (c-set-offset 'innamespace 0)
  (c-set-offset 'namespace-close 0)
  (setq fill-column 80)
  (setq indent-tabs-mode nil))

(defun c-set-style-kandr-oldies () 
  (c-set-style-kandr-base)
  (setq c-basic-offset 2)
  (setq tab-width 8)
)

(defun c-set-style-kandr () 
  (c-set-style-kandr-base)
  (setq c-basic-offset 4)
  (setq tab-width 4)
)

;;(require 'google-c-style)
(add-hook 'c-mode-common-hook 'google-set-c-style)
;;;(add-hook 'c-mode-hook    'c-set-style-kandr-oldies)
;;(add-hook 'c-mode-hook    'c-set-style-kandr)
;;(add-hook 'c++-mode-hook  'c-set-style-kandr)
;;(add-hook 'java-mode-hook 'c-set-style-kandr)

(eval-after-load 'flycheck
  '(progn
     (require 'flycheck-google-cpplint)
     ;; Add Google C++ Style checker.
     (flycheck-add-next-checker 'c/c++-cppcheck
                                'c/c++-googlelint 'append)))

;;; HOME/ENDキーの挙動をWindows標準に合わせる
;;; 注:端末エミュレーションでは下記のキーは元々うまく認識されていない場合がある。
;;;     その時は諦めるべし。
(global-unset-key [home])
(global-unset-key [end])
(global-unset-key [C-home])
(global-unset-key [C-end])
(global-set-key [home] 'beginning-of-line)
(global-set-key [end] 'end-of-line)
(global-set-key [C-home] 'beginning-of-buffer)
(global-set-key [C-end] 'end-of-buffer)

;;; i-search で漢字が使えるようにする。(Ctrl-Kを打ってから入力する)
(define-key isearch-mode-map "\C-k" 'isearch-edit-string)


;;; 現在行番号と桁番号のモードラインへの表示
(line-number-mode 1)
(column-number-mode 1)

;;; スクロールを1行ごとにする。
(setq scroll-step 1)
(setq scroll-conservatively 10)
(setq scroll-margin 5)

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


;;; 折り返し行を見たまま↑↓キーで上下に移動する。
;;; go next-visual-line
(global-set-key "\C-p" 'previous-window-line)
(global-set-key "\C-n" 'next-window-line)
(global-set-key [up] 'previous-window-line)
(global-set-key [down] 'next-window-line)

(defun previous-window-line (n)
  (interactive "p")
  (let ((cur-col
     (- (current-column)
        (save-excursion (vertical-motion 0) (current-column)))))
    (vertical-motion (- n))
    (move-to-column (+ (current-column) cur-col)))
  (run-hooks 'auto-line-hook)
  )

(defun next-window-line (n)
  (interactive "p")
  (let ((cur-col
     (- (current-column)
        (save-excursion (vertical-motion 0) (current-column)))))
    (vertical-motion n)
    (move-to-column (+ (current-column) cur-col)))
  (run-hooks 'auto-line-hook)
  )

;; セッション間の mini-buffer history を有効にする。
(savehist-mode 1)

;; セッション間の desktop 保存を有効にする。
(desktop-save-mode 1)

;; HTML ファイルは常に nxml-mode で編集する。
(fset 'html-mode 'nxml-mode)