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)