Comprensión de emacs align-regexp

31

He leído la documentación de Emacs align-regexppero aún tengo dificultades para entender cómo funciona. De lo que estoy hablando es de su forma prefijada C-uM-xalign-regexp, no de la forma simple M-xalign-regexp. Aquí están mis preguntas:

  • ¿El primer parámetro (la expresión regular) tiene que coincidir con la línea completa de la cadena? ¿Qué pasa si la expresión regular solo coincide con una parte de la cadena?
  • ¿Qué suministrar al segundo parámetro (grupo de paréntesis para modificar (justificar si es negativo))? Según tengo entendido aquí, debo proporcionar un número de grupo capturado (recuento de 1), ¿verdad? ¿"Justificar si es negativo" significa que, si quiero que el grupo 3 esté alineado a la derecha, proporcionaré -3como entrada?
  • ¿Qué significa el tercer parámetro "cantidad de espaciado (o columna si es negativo)"? Simplemente no entiendo lo que hace este parámetro.

He recopilado algunos ejemplos de texto para practicar. Si alguien puede usar el texto a continuación como ejemplos, será muy útil.


Desde

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

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

Desde

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

A

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

Respuestas:

31

OK, primero las alineaciones y luego la explicación de cómo funciona.

Para alinear el primero, seleccionar las líneas, hacer C-u M-x align-regexpy elija: \(\s-*\):, 1, 1, y y.

Para el segundo, uso ,\(\), 1, 1, y y.

Cómo funciona:

La expresión regular se prueba en todas las líneas de la región. En cada uno, si las líneas no están alineadas, coincidirá en una columna diferente. Más específicamente, el grupo que eligió (el segundo parámetro, "grupo de paréntesis para modificar") terminará en una columna diferente en cada línea. La función agregará espacios al final de algunos de ellos y eliminará caracteres de otros hasta que todos los grupos terminen en la misma columna, respetando las restricciones de espacio ingresadas en el tercer parámetro.

Por ejemplo, tomando algunas líneas del primer caso:

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

El paréntesis ( )representa el primer grupo de la expresión regular coincidente. Como puede ver, en cada línea termina en una columna diferente. Para alinear, la función agregará un espacio al de la primera línea, tres espacios al de la segunda línea y ninguno en la tercera.

El tercer parámetro, "cantidad de espacio", establece cuántos espacios agregará (o eliminará). Este parámetro realmente significa, cuál debería ser la longitud "natural" del grupo de paréntesis. En las líneas que no necesitan alineación, será exactamente esta longitud.

Por ejemplo, en el segundo caso, si elige alinear por regexp \(,\), espaciado 1, verá que en la segunda y tercera líneas no se agrega espacio, porque la coma ya proporciona un "espaciado" de 1.

Entonces, para recapitular:

  • regexp: coincide con el lugar que le interesa alinear; para hacerlo, uno de sus grupos de paréntesis se ampliará con espacios o se acortará eliminando caracteres
  • grupo de paréntesis: elija cuál
  • espaciado: si el grupo es más corto que esto, se le agregarán espacios; si es más largo, los caracteres se eliminarán, comenzando por el final (a menos que sea más largo para fines de alineación, por supuesto)
  • repito: bueno, esto es obvio, creo

Las variantes del parámetro (anteponer signo menos):

  • justifique: los caracteres no en blanco dentro del grupo no se eliminarán, y los espacios necesarios se agregarán / eliminarán desde la izquierda. En su segundo caso, intente: regexp \([0-9]+\), group -1.
  • columna (en lugar de espaciado): alinear a esa columna fija (por supuesto, no funciona bien con "repetir").
angus
fuente
1

No es una respuesta profunda a la pregunta original, pero este fragmento de código que escribí podría contribuir a comprender cómo funcionan los parámetros (en el código). Aquí está el enlace

Kevin
fuente
Por favor, publique / explique el código aquí; las respuestas de solo enlace pueden ser problemáticas si el enlace se corta. Si prefiere dejarlo solo en el enlace, convierta la respuesta en un comentario.
Dan
Bueno, es un enlace a otra respuesta de emacs.stackexchange: si eso desaparece, ¡tampoco verás esta respuesta! (Sin embargo, estoy de acuerdo en que esta respuesta parece más un comentario).
phils
1
Me complace publicarlo como un comentario, respuesta, fragmento de código o lo que prefieran (incluso eliminarlo no me molestaría). Solo estaba tratando de ayudar, y es difícil para un novato como yo descubrir las rutas de protocolo mínimamente perturbadoras (aunque lo intento, me pareció que mi "respuesta" era más un punto de vista alternativo que una respuesta comentar las publicaciones de otros, es por eso que lo publiqué de la manera en que lo hice. Lo mismo para explicar el enlace publicando mi código en lugar de simplemente publicar el enlace. Supuse que el enlace se ajustaba a mi respuesta menor mejor que una respuesta de código.) Kevin
Kevin