replace - para - justificar codigo en atom
Cómo reemplazar pestañas con espacios en Atom? (2)
Cuando empecé a trabajar con el editor de texto de Atom, utilicé tab-indentation pero quiero cambiar a 4-space-indentation.
Tengo varios archivos que deben actualizarse en consecuencia
¿Cuál sería la forma más fácil de hacerlo?
Atom tiene una herramienta incorporada para esto
Active la paleta de comandos ( Shift Cmd P en Mac, Ctrl Shift P en Windows / Linux) y busque "convertir espacio" o "convertir pestaña". Debería encontrar estos tres comandos disponibles:
- Espacio en blanco: convertir espacios en pestañas
- Espacio en blanco: convertir pestañas en espacios
- Espacio en blanco: convertir todas las pestañas en espacios
Convertir pestañas vs. Convertir todas las pestañas
En los comentarios observaste que usar "Convertir tabuladores en espacios" rompería la sangría en Python, pero "Convertir todas las pestañas en espacios" funcionaba correctamente. Usted preguntó cuál es la diferencia entre los dos.
No sabía la respuesta, así que fui a buscar. Esto se define en el paquete "espacio en blanco", cuya fuente se puede encontrar en Github attom / whitespace .
Buscando en lib / whitespace.js , encontré esto:
''whitespace:convert-tabs-to-spaces'': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
this.convertTabsToSpaces(editor)
}
},
''whitespace:convert-spaces-to-tabs'': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
return this.convertSpacesToTabs(editor)
}
},
''whitespace:convert-all-tabs-to-spaces'': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
return this.convertTabsToSpaces(editor, true)
}
}
Como puede ver, la función relevante aquí es convertTabsToSpaces
. En la variante "convertir todo", la única diferencia es que se pasa un segundo argumento (opcional) y se establece en true
.
return this.convertTabsToSpaces(editor, true)
En cuanto a la definición de convertTabsToSpaces
, la diferencia es que la expresión regular se modifica en función del estado de este argumento booleano.
convertTabsToSpaces (editor, convertAllTabs) {
let buffer = editor.getBuffer()
let spacesText = new Array(editor.getTabLength() + 1).join('' '')
let regex = (convertAllTabs ? //t/g : /^/t+/g)
buffer.transact(function () {
return buffer.scan(regex, function ({replace}) {
return replace(spacesText)
})
})
return editor.setSoftTabs(true)
}
La línea relevante aquí es:
let regex = (convertAllTabs ? //t/g : /^/t+/g)
Por lo tanto, en la variante "convertir todo", la expresión regular no se preocupa de estar anclada al principio de la línea (no se usa), y cada pestaña es su propia sustitución (en lugar de grupos de caracteres de tabulación que se tratan como un único reemplazo) - /t
vs. /t+
).
Por qué rompió la sangría de Python
No sé qué archivo usaste, pero usé un archivo de prueba bastante simple como este, con sangría completa con caracteres de tabulación.
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
Después de usar "Convertir fichas en espacios", se veía así:
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
Woah! Eso es ahora un SyntaxError
. Vuelve a intentarlo con "Convertir todas las pestañas en espacios":
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
Esto sucede porque en el primer caso, los grupos de pestañas en el margen izquierdo se reducen, como una colección , a una sangría basada en el espacio. Como la expresión regular es ^/t+
, no importa si la línea está sangrada con 1, 2, 8, 24 pestañas ... todas se reemplazan con un solo nivel de sangría, pero están formadas por espacios.
Honestamente, no sé de qué va eso ... parece un error.
En el segundo caso, cada pestaña se convierte al ancho equivalente basado en el espacio (es decir, cada pestaña se convierte en 4 espacios, incluso si es adyacente a otro carácter de tabulación).
Entonces ese es el que probablemente quieras.
Una advertencia: ya no se limita al margen izquierdo (no hay anclaje ^
), por lo que si tiene caracteres de pestaña incrustados en otro lugar, también se convertirán. Esa no es una práctica normal en el código en mi experiencia, pero para tu información, en caso de que te importe.
Una solución simple que encontré después de algunas investigaciones es usar la herramienta "Reemplazar todo".
Simplemente abra cada archivo y luego abra el Panel de búsqueda ( cmd F en Mac).
Encontrar en el búfer actual (con la opción de use regex
activada):
/t
Reemplace en el buffer actual:
#that being just four spaces