3

私はC++プログラマーであり、そしてもちろん私たちの最愛のemacs(v24.2)で構成されるセットアップを使用していcc-modeますCEDET

私が見逃している機能は、引数のリストをすばやくポイント移動する関数です。この例を考えてみましょう。

void takesManyArgs( int a1, int a2, int a3, std::pair<int,int> a4, int a5 ){  
    // does something nifty!  
}  
// [...]
takesManyArgs( b1, b2, b3, make_pair( b4, b5 ), b6 );

ポイントが最初の直前にあるところint。ここで、引数のリストをすばやく移動する簡単な方法、つまり、コンマ(引数の区切り文字)を過ぎた最初の非空白文字の直前に移動するforward-argument(および同様の)関数を作成したいと思います。 私はそれを行う小さな関数を書きましたが、それは私が望む方法ではありません:backward-argument

(defun arg-forward ()  
  "Move point forward in the file until we hit an argument separator, i.e. comma, colon or semicolon."  
  (interactive)  
  (progn  
    (re-search-forward "[,]")))  

原則として、この関数は次のコンマにジャンプするだけです。それは私が望む行動ではありません。

次のような関数が欲しいのですが。

  • 編集:次の引数セパレーター(つまり、C ++の場合はコンマ)にジャンプし、その引数セパレーターの直後にポイントを配置します
  • カンマの後に空白があるかどうかを確認します。存在する場合、ポイントは最初の非空白文字に移動されます(つまり、マークがポイント する場所の,| intように見えます), |int|
  • 引数リストの最後で停止し、メッセージを出力します(例:「引数リストの最後」)
  • その「スコープ」内にとどまります。つまり、マークが指す |int b3場所に|make_pair( int b4, int b5 )移動します。|int a6|

あなたのelisp「ハッカー」からの助けは大歓迎です!

編集:いくつかの説明を追加しました。
Edit2:その例の「コード」を修正しました

4

3 に答える 3

5

この関数はあなたが要求したことをするようです:

(defun arg-forward ()
  "Move point forward until we hit an argument separator, the comma, colon, semicolon"
  (interactive)
  (condition-case nil
      (let ((separator-regexp "[,:;]"))
        (forward-sexp)
        (while (not (or (looking-at (format "[ \t]*%s" separator-regexp))
                        (save-excursion (forward-char -1)
                                        (looking-at (format "[]\"')}]*[ \t]*%s " separator-regexp)))))
          (forward-sexp))
        (if (looking-at separator-regexp)
            (forward-char 1))
        ;; going forward one sexp and back puts point at front of sexp
        ;; essentially skipping the whitespace, but also ensuring we don't
        ;; jump out of a larger closing set of parentheses 
        (forward-sexp)
        (forward-sexp -1))
    (error
     (beep)
     (message "At end of argument list"))))
于 2012-11-26T20:53:22.263 に答える
2

C ++コードでCEDETを使用しているため、TAGナビゲーションコマンドを利用できます。CEDETbzrリポジトリのバージョンのCEDETでこれを試しました。

[開発]メニューの下部にある[タグのナビゲート]を確認してください。前方/後方タグのキーバインドは次の場所にあります。

C-c , n -次のタグ

C-c , p -前のタグ

これらは、関数間、引数間、あらゆる種類のものの間であなたを動かします。

これらの関数は、あなたが求めていたすべてのことを実行するわけではありませんが、良いスタートです。

于 2012-11-28T00:53:23.750 に答える
2

forward-sexp「引数区切り文字」または「引数リストの終わり」のいずれかにいるかどうかを確認するために使用およびチェックする関数を作成できます。

今のところemacsは手元にないようですので、実装例を簡単に確認することはできませんが、手元にあるものがあれば、順調に進んでいるはずです。

以下のテストされていないコード:

(defun forward-argument ()
  (interactive)
  (let ((argument-terminator "[),]"))              ;; Arguments stop at commas or close
     (while (not (looking-at argument-terminator)) ;; until we're at end-of-argument...
        (forward-sexp 1))))                        ;; move forward

これは、引数ターミネータをdefvarに引き出すことでおそらく恩恵を受ける可能性があるため、モード固有にするのは簡単です。おそらく、カウントプレフィックス((while(> count 0)...(setq count(1- count))でラップし、プレフィックスが指定されていない場合はデフォルトのカウントを1に設定する)などのいくつかの利点があります。 、関数が取る引数とそれらが何と呼ばれるかを覚えようとするのではなく、実際にライブemacsに対してコードをチェックすることは言うまでもありません。

于 2012-11-26T20:56:28.620 に答える