emacs align-regexpの理解


31

私はEmacsのドキュメントを読みましたが、align-regexpそれがどのように機能するかを理解するのはまだ困難です。私が話しているのはC-uM-xalign-regexp単純な形式ではなく、その接頭語の形式M-xalign-regexpです。私の質問は次のとおりです。

  • 最初のパラメーター(正規表現)は、文字列の行全体と一致する必要がありますか?正規表現が文字列の一部にのみ一致する場合はどうなりますか?
  • 2番目のパラメーターに何を指定するか(修正するための括弧グループ(負の場合は正当化))ここで理解したように、キャプチャされたグループ番号(1からカウント)を提供する必要がありますか?「負の場合に揃える」とは、グループ3を右揃えにしたい場合-3、入力として供給することを意味しますか?
  • 3番目のパラメーター「間隔の量(または負の場合は列)」はどういう意味ですか?私はこのパラメーターが何をするのか全く理解していません。

練習のためにいくつかのテキスト例を集めました。誰もが例として以下のテキストを使用できる場合、非常に役立ちます。


から

class CreateStudents < ActiveRecord::Migration
  def change
    create_table :students, :comment => "学生信息表" do |t|
      t.string :political_status, :comment => "政治面貌"
      t.string :education_level, :comment => "培养层次"
      t.string :enroll_method, :comment => "入学方式"
      t.date :enrolled_at, :comment => "入学时间"
      t.string :charge_type, :comment => "收费类别"
      t.string :enrolled_year, :comment => "学籍年度"
      t.string :enrolled_place, :comment => "生源所在地"
      t.string :bank_card_number, :comment => "银行卡号"
      t.string :bank_account_number,  :comment => "银行账号"
      t.boolean :is_active_duty, :default => false, :comment => "是否现役军人"
      t.boolean :is_equivalent_degree, :default => false, :comment => "是否同等学历"
      t.boolean :is_on_record, :default => true, :comment => "是否在籍"
      t.boolean :is_at_school, :default => true, :comment => "是否在校"
      t.timestamps
    end
  end
end

class CreateStudents < ActiveRecord::Migration
  def change
    create_table :students, :comment => "学生信息表" do |t|
      t.string  :political_status,     :comment => "政治面貌"
      t.string  :education_level,      :comment => "培养层次"
      t.string  :enroll_method,        :comment => "入学方式"
      t.date    :enrolled_at,          :comment => "入学时间"
      t.string  :charge_type,          :comment => "收费类别"
      t.string  :enrolled_year,        :comment => "学籍年度"
      t.string  :enrolled_place,       :comment => "生源所在地"
      t.string  :bank_card_number,     :comment => "银行卡号"
      t.string  :bank_account_number,  :comment => "银行账号"
      t.boolean :is_active_duty,       :default => false,  :comment => "是否现役军人"
      t.boolean :is_equivalent_degree, :default => false,  :comment => "是否同等学历"
      t.boolean :is_on_record,         :default => true,   :comment => "是否在籍"
      t.boolean :is_at_school,         :default => true,   :comment => "是否在校"
      t.timestamps
    end
  end
end

から

my @primes = (
    1,2,3,5,7,
    11,13,17,19,23,
    29,31,37,41,43,
);

my @primes = (
    1,  2,  3,  5,  7,
    11, 13, 17, 19, 23,
    29, 31, 37, 41, 43,
);

回答:


31

OK、最初にアライメント、次にそれがどのように機能するかの説明。

行を、最初のものを揃える選択するには、実行するC-u M-x align-regexpと選択します\(\s-*\):11、とy

二、使用するために,\(\)11、とy

使い方:

領域内のすべての行で正規表現が試行されます。それぞれで、行がまだ位置合わせされていない場合、異なる列で一致します。具体的には、選択したグループ(2番目のパラメーター「変更するかっこグループ」)は、各行の異なる列で終了します。この関数は、3番目のパラメーターに入力された間隔の制約に従って、一部のグループの末尾にスペースを追加し、すべてのグループが同じ列で終了するまで他のグループから文字を削除します。

たとえば、最初のケースからいくつかの行を取得します。

  t.string( ):enroll_method, :comment => "入学方式"
  t.date( ):enrolled_at, :comment => "入学时间"
  t.boolean( ):is_active_duty, :default => false, :comment => "是否现役军人"

括弧( )は、一致する正規表現の最初のグループを表します。ご覧のように、各行は異なる列で終わります。位置合わせするために、関数は1行目のスペースに1つのスペースを追加し、2行目のスペースに3つのスペースを追加し、3行目にはスペースを追加しません。

追加(または削除)するスペースの数は、3番目のパラメーター「スペースの量」で設定します。このパラメーターは、括弧グループの「自然な」長さを意味します。位置合わせを必要としない行では、まさにこの長さになります。

たとえば、2番目の場合、regexp \(,\)、スペース1で整列することを選択した場合、2番目と3番目の行ではスペースが追加されないことがわかります。

要約すると、

  • regexp:整列に関心のある場所に一致します。そのためには、括弧グループの1つをスペースで拡張するか、文字を削除して短縮します
  • 括弧グループ:どれを選ぶか
  • 間隔:グループがこれより短い場合、スペースが追加されます。それよりも長い場合、文字は最後から削除されます(もちろん、整列のために長くない限り)
  • 繰り返します:まあ、これは明らかです、私は思う

パラメータバリアント(マイナス記号を追加):

  • 正当化:グループ内の非空白文字は削除されず、必要なスペースが左から追加/削除されます。2番目の場合、regexp \([0-9]+\)、groupを試してください-1
  • 列(間隔ではなく):その固定列に揃えます(もちろん、「繰り返し」ではうまく機能しません)。

1

元の質問に対する深い答えではありませんが、私が書いたこのコードの一部は、パラメーターがどのように機能するか(コード内)を理解するのに役立つ可能性があります。 リンクはこちら


ここにコードを投稿/説明してください。リンクが停止した場合、リンクのみの回答では問題が発生する可能性があります。リンクのみにしたい場合は、回答をコメントに変換してください。
ダン

まあそれは別のemacs.stackexchangeの答えへのリンクです-それが死んでも、あなたはこの答えを見ることはありません!(ただし、この回答はコメントのように見えることに同意します)。
-phils

1
コメント、回答、コードのチャンク、またはあなたが好きなものとして投稿できてうれしいです(削除しても気になりません)。私はただ助けようとしていたので、私のような初心者にとっては、最小限の邪魔になるプロトコルパスを理解するのは難しいです他の人の投稿にコメントするので、私は自分のやり方で投稿しました。コードを投稿することによってリンクを説明するのと同じように、リンクを説明するのも同じです。ケビン
ケビン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.