0

emacs で C/C++ 関数定義をカスタマイズするコマンドを定義しようとしています。

私が取得したいのは、コードを次のように自動的に再フォーマットすることです。

type func(type arg1,
          type arg2,
          ...
          type argN) {

次のような一般的な宣言から始めます。

type func(type arg1, type arg2, ..., type argN) {

私の考えは、関数定義の特定のパターンを検索し、各コンマの後にそれ自体を新しい行に置き換えてから、インデントを調整することでした。

しばらく正規表現などをいじりましたが、何も思いつきませんでした。

正規表現を使用して取得した文字列内で適切に置換を実行する方法がわかりません。

以下は、これまでに得たすべてのものであり、基本的にはほとんど何もありません。

(defun fix-arg-definition ()
  (interactive)
  (goto-char (point-min))
  (replace-regexp "([^,()]+\\([,][^,()]+\\)+)[ ]*{" "WHAT TO PUT HERE?")
)

私は、emacs でコーディング スタイルをカスタマイズする世界にまったく慣れていません。これは、思ったより難しいことがわかりました。どんな助けでも大歓迎です。

アップデート

私はまだ完全にテストする必要がありますが、うまくいくように見えるものを手に入れることができました。

(defun fix-args ()
  (interactive)
  (goto-char 1)
     (while (search-forward-regexp "\\(([^,()]+\\([,][^,()]+\\)+)[ ]*{\\)" nil t) 
     (replace-match (replace-commas) t nil)))

(defun replace-commas ()
   (let (matchedText newText)
       (setq matchedText
       (buffer-substring-no-properties
       (match-beginning 1) (match-end 1)))
   (setq newText
   (replace-regexp-in-string "," ",\n" matchedText) )
 newText))

少なくとも今のところは、これで問題なく、別のコマンドを使用してインデントを手動で調整できます。

4

1 に答える 1

1

これは、キーボード マクロを記録することで簡単に実行できます。

これは私が以前に準備したもので、 を通して示されていedit-named-kbd-macroます。

;; Keyboard Macro Editor.  Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: M-C-a C-SPC M-C-n <<replace-regexp>> , RET , C-q LFD RET M-C-a C-SPC M-C-n TAB

Command: c-split-formal-params 
Key: none

Macro:

M-C-a           ;; c-beginning-of-defun
C-SPC           ;; set-mark-command
M-C-n           ;; forward-list
<<replace-regexp>>  ;; replace-regexp
,           ;; c-electric-semi&comma
RET         ;; newline
,           ;; c-electric-semi&comma
C-q         ;; quoted-insert
LFD         ;; newline-and-indent
RET         ;; newline
M-C-a           ;; c-beginning-of-defun
C-SPC           ;; set-mark-command
M-C-n           ;; forward-list
TAB         ;; c-indent-line-or-region

beginning-of-defunや などの構造的なナビゲーション コマンドをよく理解する forward-listことも役に立ちます。

キーボード マクロの詳細については、マニュアルと以前の回答を参照してください。

于 2012-07-17T00:29:57.940 に答える