Noções básicas do emacs align-regexp

31

Eu li a documentação do Emacs, align-regexpmas ainda tenho dificuldade em entender como ele funciona. O que eu estou falando é sua forma prefixada C-uM-xalign-regexp, não a forma simples M-xalign-regexp. Aqui estão as minhas perguntas:

  • O primeiro parâmetro (o regex) precisa corresponder a toda a linha da string? E se a regex corresponder apenas a uma parte da sequência?
  • O que fornecer ao segundo parâmetro (grupo de parênteses a modificar (justifique se negativo))? Pelo que entendi aqui, preciso fornecer um número de grupo capturado (contagem de 1), certo? "Justificar se negativo" significa que, se eu quiser o grupo 3 alinhado à direita, fornecerei -3como entrada?
  • O que significa o terceiro parâmetro "quantidade de espaçamento (ou coluna, se negativo)"? Eu totalmente não entendo o que esse parâmetro faz.

Eu colecionei alguns exemplos de texto para praticar. Se alguém puder usar o texto abaixo como exemplos, isso será muito útil.


A partir de

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

Para

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

A partir de

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

Para

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

Respostas:

31

OK, primeiro os alinhamentos e depois a explicação de como funciona.

Para alinhar o primeiro, selecione as linhas, fazer C-u M-x align-regexpe escolha: \(\s-*\):, 1, 1, e y.

Para o segundo, utilização ,\(\), 1, 1, e y.

Como funciona:

O regexp é tentado em todas as linhas da região. Em cada um deles, se as linhas ainda não estiverem alinhadas, elas corresponderão em uma coluna diferente. Mais especificamente, o grupo que você escolheu (o segundo parâmetro, "grupo de parênteses para modificar") terminará em uma coluna diferente em cada linha. A função adicionará espaços ao final de alguns deles e excluirá caracteres de outros até que todos os grupos terminem na mesma coluna, respeitando as restrições de espaçamento inseridas no terceiro parâmetro.

Por exemplo, usando algumas linhas do primeiro caso:

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

Os parênteses ( )representam o primeiro grupo da regexp correspondente. Como você pode ver, em cada linha termina em uma coluna diferente. Para alinhar, a função adicionará um espaço ao da primeira linha, três espaços ao da segunda linha e nenhum à terceira.

Quantos espaços serão adicionados (ou excluídos) pelo terceiro parâmetro, "quantidade de espaçamento". Esse parâmetro realmente significa qual deve ser o comprimento "natural" do grupo de parênteses. Nas linhas que não precisam de alinhamento, será exatamente esse comprimento.

Por exemplo, no segundo caso, se você optar por alinhar por regexp \(,\), espaçamento 1, verá que na segunda e terceira linhas nenhum espaço é adicionado, porque a vírgula já fornece um "espaçamento" de 1.

Então, para recapitular:

  • regexp: corresponde ao local que você está interessado em alinhar; Para fazer isso, um de seus grupos de parênteses será estendido com espaços ou abreviado pela exclusão de caracteres
  • grupo de parênteses: escolha qual
  • espaçamento: se o grupo for menor que isso, serão adicionados espaços a ele; se for mais longo, os caracteres serão excluídos dele, começando no final (a menos que seja mais longo para fins de alinhamento, é claro)
  • repita: bem, isso é óbvio, eu acho

As variantes de parâmetro (sinal de menos prefixado):

  • justificar: caracteres não em branco dentro do grupo não serão excluídos e os espaços necessários serão adicionados / excluídos da esquerda. No seu segundo caso, tente: regexp \([0-9]+\), group -1.
  • coluna (em vez de espaçamento): alinhar com a coluna fixa (é claro, não funciona bem com "repetir").
angus
fonte
1

Não é uma resposta profunda à pergunta original, mas esse pedaço de código que escrevi ainda pode contribuir para entender como os parâmetros funcionam (no código). Aqui está o link

Kevin
fonte
Poste / explique o código aqui; respostas somente para links podem ser problemáticas se o link ficar inoperante. Se você preferir deixá-lo apenas como link, converta a resposta em um comentário.
Dan
Bem, é um link para outra resposta do emacs.stackexchange - se isso acabar, você também não verá essa resposta! (Eu concordo que essa resposta parece mais um comentário).
phils 28/05
1
Fico feliz em publicá-lo como um comentário, resposta, parte do código ou o que você preferir (mesmo excluí-lo não me incomoda). Eu estava apenas tentando ajudar, e é difícil para um novato como eu descobrir os caminhos de protocolo minimamente perturbadores (embora eu tente - pareceu-me que minha "resposta" era mais um ponto de vista alternativo a uma resposta do que um comentar sobre as postagens de outras pessoas, e é por isso que eu a publiquei da mesma maneira que fiz. O mesmo vale para explicar o link postando meu código versus apenas postar o link. Kevin
Kevin