2012-02-14 18 views
4

しばしば、ある地域の正規表現 "[^] + _"にalign-regexpを使用します。だから私はそれは私がキーにバインドする可能性があるため、私は関数を定義しようと思いました:emacsの特定のregexpのためにalign-regexpをラップする方法

(defun align-members() 
    (interactive) 
    (align-regexp " [^ ]+_")) 

しかし、EmacsはALIGN-regexpには、3つのパラメータを取ります文句を言います。ドキュメントを見ると、BEGとENDが必要です。私は(interactive)ものがEmacsの中でどのように動作するかわからないんだけど、私は集まるのドキュメントを読んでから、私はこのやるべきこと:

(defun align-members (BEG END) 
    (interactive "r") 
    (align-regexp BEG END " [^ ]+_")) 

しかし、Emacsは、それはinteger-or-marker-p、代わりを期待ALIGN-正規表現のコールスタックのどこかに深い文句無くなった。私は間違って何をしていますか?

答えて

0

align-regexpのドキュメントは、前置引数を指定した場合は、括弧で囲まれ 空白との完全な正規表現が

ので

私はあなたの正規表現で空白を括弧を供給する必要があるとそれがいるようだ

語りますそれを動作させる:

(defun align-members (beg end) 
    (interactive "r") 
    (align-regexp beg end "\\(\\)[^ ]+_")) 
+0

コマンドを呼び出す前にC-uを実行してから番号を入力すると、前置引数ではありませんか?私はそれをやっていないので、なぜ空白を避ける必要がありますか? –

+0

@JosephGarvinあなたが正しいです、それは私が接頭引数を理解する方法です。なぜこのような場合に必要なのか分かりませんが、私は不思議です。私はちょうどそれが働くまであなたの機能の異なった修正を試みた。 –

+0

一般的には、接頭引数はインタラクティブな 'Cu'(または同様の)メカニズムを使って提供されるかもしれない関数引数であり、docstringは自然にそのような使用法を強調しますが、 elispで直接提供されます。 (* \)これは*常に*の場合ではありませんが、プレフィックスargが与えられたときに動作を変更するが、実際にはその値を直接関数の引数として使用しないインタラクティブな宣言を記述することもできます。 – phils

4

あなたは次のように書いてください

(defun align-members (BEG END) 
    (interactive "r") 
    (align-regexp BEG END (concat "\\(\\s-*\\)" " [^ ]+_") 1 1)) 

またはalign-regexpソース上を見て、それを理解するために

(defun align-members (BEG END) 
    (interactive "r") 
    (align-regexp BEG END "\\(\\s-*\\) [^ ]+_" 1 1)) 

ビット単純、ここではその一部があります。あなたが見ることができるように

(interactive 
(append 
    (list (region-beginning) (region-end)) 
    (if current-prefix-arg 
     (list (read-string "Complex align using regexp: " 
         "\\(\\s-*\\)") 
      (string-to-number 
      (read-string 
       "Parenthesis group to modify (justify if negative): " "1")) 
      (string-to-number 
      (read-string "Amount of spacing (or column if negative): " 
          (number-to-string align-default-spacing))) 
      (y-or-n-p "Repeat throughout line? ")) 
    (list (concat "\\(\\s-*\\)" 
        (read-string "Align regexp: ")) 
      1 align-default-spacing nil)))) 

  • それはオレグの答えは結構です、オプションのパラメータ
+0

なぜ私はelispでそれを呼び出すと、regexpはまだそれをしませんか?私はなぜそれを手動でelispでのみ行う必要があるのか​​分からず、通常はそれを呼び出すときではありません。編集:ああ、そのインタラクティブフォームは、その中にコードで開いている、あなたがそれを行うことができるか分からなかった。 –

2

に1とalign-default-spacingを設定し、あなたの正規表現

  • に文字列"\\(\\s-*\\)"を追加します。

    対話的 を呼び出したときにalign-regexpがあなたのために詳細を記入していることの理由は、あなたができるだけ として、いくつかのキーストロークで最も有用な事を行うことができるはずということです。より多くの制御をアサートする必要がある場合は、 C-uという接頭辞を使用します。

    これはEmacsコマンドの一般的な設計テーマです。あなたがプログラム的align-regexpを呼び出すとき

    は今、おそらくプログラマは デフォルトでフルコントロールを望んでいるので、 あなたのショートカットを提供する必要はありません。将来的には

    あなたがインタラクティブdefunにタスクを変換するとき、彼ら は、インタラクティブフォームを経た後にコマンドがあなたの入力を受けたかを確認するために C-X ESC ESCを使用しています。この場合

    、あなたのようなものが表示されるはずです。私の視点から

    (align-regexp 185 320 "\\(\\s-*\\)" [^ ]+_" 1 1 nil) 
    
  • 0

    を、私はあなたの正規表現で任意のgroupを見つけることができません。あなたからのテストパターンの欠如、私はちょうど私の例を与える。私はgroupと、このような作業機能を持っている

    bit [ 4:0] a; 
    bit [ 16:0] b; 
    

    :へ

    bit [4:0] a; 
    bit [16:0] b; 
    

    :コードを揃える

    てみてください、あなたが以下のようgroupを削除した場合

    (defun try-align() 
        (interactive) 
        (let ((BEG (region-beginning)) 
         (END (region-end))) 
        (align-regexp BEG END "\\[\\(.*:\\)" -1 1 0))) 
    

    を、それは動作しません:

    関連する問題