emacs align-regexp의 이해


31

Emacs 문서를 읽었 align-regexp지만 작동 방식을 이해하는 데 여전히 어려움이 있습니다. 내가 말하고 C-uM-xalign-regexp있는 것은 단순한 형식이 아닌 접두사 형식 M-xalign-regexp입니다. 내 질문은 다음과 같습니다.

  • 첫 번째 매개 변수 (정규식)가 전체 문자열 줄과 일치해야합니까? 정규식이 문자열의 일부와 만 일치하면 어떻게됩니까?
  • 두 번째 매개 변수에 무엇을 제공해야합니까 (수정 그룹 (고정 인 경우 정당화))? 여기에서 알 수 있듯이 캡처 된 그룹 번호 (1부터 카운트)를 제공해야합니다. "음의 경우 정당화"는 그룹 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

좋아, 먼저 정렬하고 작동 방식에 대한 설명.

선을, 첫 번째 정렬 선택하려면 어떻게 C-u M-x align-regexp선택 : \(\s-*\):, 1, 1,와 y.

두 번째, 사용을 위해 ,\(\), 1, 1,와 y.

작동 방식 :

정규 표현식은 해당 지역의 모든 라인에서 시도됩니다. 각각에 선이 아직 정렬되지 않은 경우 다른 열에서 일치합니다. 보다 구체적으로, 선택한 그룹 ( "수정할 괄호 그룹")은 각 행의 다른 열에서 끝납니다. 이 함수는 일부 그룹의 끝에 공백을 추가하고 세 번째 매개 변수에 입력 한 간격 제약 조건을 고려하여 모든 그룹이 동일한 열에서 끝날 때까지 다른 그룹에서 문자를 삭제합니다.

예를 들어, 첫 번째 경우에서 일부 라인을 가져옵니다.

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

괄호 ( )는 일치하는 정규 표현식의 첫 번째 그룹을 나타냅니다. 보시다시피 각 줄에서 다른 열로 끝납니다. 정렬하기 위해 함수는 첫 번째 행의 공백에 하나의 공백을 추가하고 두 번째 행의 공백에 3 개의 공백을 추가하고 세 번째 행에는 공백을 추가하지 않습니다.

추가 또는 삭제 될 공간 수는 세 번째 매개 변수 인 "간격 양"에 의해 설정됩니다. 이 매개 변수는 실제로 괄호 그룹의 "자연적인"길이를 의미합니다. 정렬이 필요없는 라인에서는 정확히이 길이가됩니다.

예를 들어, 두 번째 경우, regexp \(,\), spacing 으로 정렬하도록 선택 1하면 쉼표가 이미 1의 "간격"을 제공하기 때문에 두 번째 및 세 번째 행에 공백이 추가되지 않습니다.

요약하면 다음과 같습니다.

  • 정규 표현식 : 당신이 정렬하고자하는 장소를 일치; 괄호 그룹 중 하나는 공백으로 확장되거나 문자를 삭제하여 단축됩니다.
  • 괄호 그룹 : 어느 것을 선택하십시오
  • 간격 : 그룹이 이보다 짧으면 공백이 추가됩니다. 더 길면 끝부터 시작하여 문자가 삭제됩니다 (물론 정렬 목적으로 더 길지 않은 한)
  • 반복 : 글쎄, 이것은 분명하다.

매개 변수 변형 (빼기 부호) :

  • 정당화 : 그룹 내의 공백이 아닌 문자는 삭제되지 않으며 필요한 공백이 왼쪽에서 추가 / 삭제됩니다. 두 번째 경우에는 regexp \([0-9]+\), group을 시도하십시오 -1.
  • 열 (간격 대신) : 고정 열에 맞 춥니 다 (물론 "반복"에서는 잘 작동하지 않습니다).

1

원래 질문에 대한 깊은 대답은 아니지만 필자가 작성한이 코드는 여전히 매개 변수가 어떻게 작동하는지 이해하는 데 도움이 될 수 있습니다 (코드). 여기 링크가 있습니다


여기에 코드를 게시 / 설명하십시오. 링크가 작동하지 않으면 링크 전용 응답에 문제가있을 수 있습니다. 링크 전용으로 두려면 답변을 주석으로 변환하십시오.
Dan

글쎄, 그것은 다른 emacs.stackexchange 답변에 대한 링크입니다. 죽은 경우 에도이 답변을 보지 못할 것입니다! (그러나 나는이 답변이 더 주석처럼 보일 것에 동의합니다).
phils

1
의견, 답변, 코드 덩어리 또는 원하는대로 (게시해도 귀찮게하지는 않습니다)로 게시하여 기쁩니다. 나는 단지 도움을 주려고 노력하고 있었고, 저와 같은 초보자가 최소한 방해가되는 프로토콜 경로를 알아내는 것이 어렵습니다 (내가 시도하더라도-내 "응답"이 대답보다 대안적인 관점이라고 생각했습니다. 다른 사람들이 올린 글에 댓글을 달았 기 때문에 내가 한 방식으로 게시했습니다. 코드를 게시하고 링크를 게시하여 링크를 설명하는 Ditto 링크가 코드 답변보다 작은 답변에 더 적합하다고 생각했습니다.) 케빈
케빈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.