emacs初期設定 (自作マクロ)

emacs初期設定、自作マクロです。
かなり前から作りためてきたものでコーディング補助用のものが多いです。
呼び出し用のキーアサインも独自のものになっています。


;;;
;;; emacs初期設定 (自作マクロ)
;;;

;;; 行末の復帰コードの削除
;;; 
(defun trim-cr ()
  (interactive)
  (query-replace "\C-M\C-J" "\C-J" nil))

;;; 定型的コメント行の作成
;;; 
(defun c-comment-short-sep () 
  (interactive)
  (beginning-of-line)
  (insert "/*------------------------------  */")
  (backward-char 3))
(global-set-key "\C-Ccss" 'c-comment-short-sep)

(defun c-comment-long-sep () 
  (interactive)
  (beginning-of-line)
  (insert "/*------------------------------------------------------------\n")
  (insert " * ")
  (set-fill-prefix)
  (insert " \n */")
  (backward-char 4))
(global-set-key "\C-Ccls" 'c-comment-long-sep)

(defun c-comment-there () 
  (interactive)
  (insert " /*")
  (indent-for-tab-command)
  (insert "\n */")
  (indent-for-tab-command)
  (end-of-line 0)
  (insert "\n * ")
  (indent-for-tab-command)
  (set-fill-prefix))
(global-set-key "\C-Cct" 'c-comment-there)

;;; ブロックの先頭に飛ぶ
;;==;;==;;==(global-set-key "\M-[" 'backward-sexp)
;;==;;==;;== above key set causes 'I'/'O' character insertion on mouse click on other window on emacs on wsl2
(global-set-key "\C-\M-[" 'backward-sexp)

;;; ブロックの末尾に飛ぶ
(global-set-key "\C-\M-]" 'forward-sexp)

;;; 他のフレームに飛ぶ
(global-set-key "\C-xO" 'other-frame)

;;; forward-wordの後でカーソルをwordの先頭に置く
(defun forward-word-bow ()
  (interactive)
  (let (curpos)
    (setq curpos (point))
    (forward-word 1)
    (backward-word 1)
    (if (= curpos (point)) (and (forward-word 2) (backward-word 1)))))

(global-set-key "\M-g\M-f" 'forward-word-bow)

;;; 変数宣言と型宣言の間の空白文字の挿入
(defun c-space-for-variable ()
  (interactive)
  (insert "   \t"))
(global-set-key "\C-csv" 'c-space-for-variable)

;;; 前の行の次の空白以外の文字の位置まで空白を挿入
(defun indent-like-upper-line ()
  "Indent like upper line."
  (interactive)
  (setq curpos (point))
  (forward-line 0)
  (setq col (- curpos (point)))
  (previous-line)
  (while (looking-at "^[\s\t]*$") (previous-line))
  (forward-char col)
  (setq prevpos (point))
  (unless (looking-at "[\s\t]")
    (while (not (or (looking-at "$") (looking-at "[\s\t]"))) (forward-char)))
  (while (and (not (looking-at "$")) (looking-at "[\s\t]")) (forward-char))
  (setq counts (- (point) prevpos))
  (goto-char curpos)
  (delete-horizontal-space)
  (insert-char ?\s (- curpos (point)))
  (insert-char ?\s counts))
(global-set-key "\C-csp" 'indent-like-upper-line)

;;; 定型的Fill-Prefixの設定
(global-set-key "\C-cfp2" (lambda () (interactive)(set-variable 'fill-prefix "  ")))
(global-set-key "\C-cfp4" (lambda () (interactive)(set-variable 'fill-prefix "    ")))
(global-set-key "\C-cfp6" (lambda () (interactive)(set-variable 'fill-prefix "      ")))
(global-set-key "\C-cfp8" (lambda () (interactive)(set-variable 'fill-prefix "        ")))
(global-set-key "\C-cfpa" (lambda () (interactive)(set-variable 'fill-prefix "          ")))

;;; Doxygen用コメント付け
(defun c-doxygen-recomment ()
  (interactive)
  (let (curpos)
    (setq curpos (point))
    (search-backward "/*")
    (forward-char 2)
    (insert "*")
    (setq curpos (+ curpos 1))
    (goto-char curpos)))
(global-set-key "\C-cdr" 'c-doxygen-recomment)

(defun c-doxygen-recomment-post ()
  (interactive)
  (let (curpos)
    (setq curpos (point))
    (search-backward "/*")
    (forward-char 2)
    (insert "*<")
    (setq curpos (+ curpos 2))
    (goto-char curpos)))
(global-set-key "\C-cdp" 'c-doxygen-recomment-post)

(defun c-doxygen-block-region (arg)
  (interactive "p")
  (let (begin-reg end-reg curpos)
    (setq  begin-reg (min (point) (mark)))
    (setq  end-reg (max (point) (mark)))
    (goto-char end-reg)
    (insert "/*@}*/\n")
    (goto-char begin-reg)
    (insert "/*@{*/\n")
    (cond ((eq arg 4)
	   (goto-char begin-reg)
	   (insert "/**@name  */\n")
	   (goto-char (+ begin-reg 9)))
	  (nil (goto-char (+ begin-reg 7))))))
(global-set-key "\C-cdbr" 'c-doxygen-block-region)

(defun c-doxygen-block-region-name ()
  (interactive)
  (c-doxygen-block-region 4))

(global-set-key "\C-cdbn" 'c-doxygen-block-region-name)

(defun insert-current-time-string (arg)
  (interactive "p")
  (cond ((eq arg 4) (insert "*雑記\n"))
	((eq arg 16) (insert "*使用待ち\n"))
	((eq arg 64) (insert "*欲しいもの\n"))
	)
  (insert (shell-command-to-string "date +\"%H:%M\""))
  (delete-char -1) (insert " "))
(global-set-key "\C-cts" 'insert-current-time-string)

(defun insert-current-datetime-string ()
  (interactive)
  (insert (shell-command-to-string "date +\"%Y-%m-%d (%a)\""))
  (delete-char -1) (insert " "))
(global-set-key "\C-cds" 'insert-current-datetime-string)

(defun copy-upper-word (&optional n)
"Copy word on upper line of POINT."
(interactive "p")
(setq num 0)
(while (< num n)
  (previous-line)
  (mark-word)
  (copy-region-as-kill (point) (mark))
  (next-line)
  (yank)
  (setq num (+ num 1))))
(global-set-key "\C-cuw" 'copy-upper-word)

(defun next-buffer-other-window (&optional n)
"Execute next-buffer in other window. Buffers started by '*' are excluded."
(interactive "p")
(setq thisname buffer-file-name)
(other-window 1)
(setq num 0)
(while (< num n)
  (next-buffer)
  (while (or (equal thisname buffer-file-name)
	     (equal (compare-strings (buffer-name) 0 1 "*" 0 1) t))
    (next-buffer))
  (setq num (+ num 1)))
(other-window -1))

(defun previous-buffer-other-window (&optional n)
"Execute previous-buffer in other window. Buffers started by '*' are excluded."
(interactive "p")
(setq thisname buffer-file-name)
(other-window 1)
(setq num 0)
(while (< num n)
  (previous-buffer)
  (while (or (equal thisname buffer-file-name)
	     (equal (compare-strings (buffer-name) 0 1 "*" 0 1) t))
    (previous-buffer))
  (setq num (+ num 1)))
(other-window -1))

(defun kill-buffer-other-window (&optional n)
"execute kill-buffer in other window."
(interactive "p")
(setq thisname buffer-file-name)
(other-window 1)
(if (not (equal thisname buffer-file-name)) (and (kill-buffer nil) (other-window 1))))


(global-set-key "\C-cop" 'previous-buffer-other-window)
(global-set-key "\C-con" 'next-buffer-other-window)
(global-set-key "\C-cok" 'kill-buffer-other-window)

;; ヘッダのインクルードガードの作成
(defun c-header-include-guard ()
 (interactive)
 (setq fname 
  (upcase (replace-regexp-in-string "\\." "_"
		   (car (last (split-string (buffer-file-name) "/"))))))
 (beginning-of-buffer)
 (insert "#pragma once\n#if !defined(")
 (insert fname)
 (insert "_)\n#define ")
 (insert fname)
 (insert "_\n")
 (end-of-buffer)
 (insert "#endif /*")
 (insert fname)
 (insert "_*/")
 (goto-line 4))

(global-set-key "\C-chig" 'c-header-include-guard)