Codifiquemos rápidamente como profesionales


Dame una palanca, punto de apoyo, espacio para las piernas y cinta reforzada



Incluso si lo intentas, no puedes describir sucintamente cómo te espera una madriguera de conejo sin fondo. Este es uno de esos raros casos en los que, para darse cuenta de lo que se discutirá, es necesario escuchar el discurso hasta el final. Después de estudiar los pasos de este manual, todos encontrarán algo por sí mismos: el editor de "texto" esotérico Leo Editor, con toda su esencia, requiere su uso de la manera más sorprendente.




Contenido


  1. Prólogo ................................... 2 
  2. Instalación de Leo Editor ..................... 2 
  3. Configuración ................................ 4 
  4. Conociendo la interfaz ................. 7 
  5. Creación de archivos externos ................. 14 
  6. Uso de secciones con nombre ........ 18 
  7. Inclusión codiciosa ....................... 21 
  8. Magia simple ...................... 24 
  9. El reverso del hombre lobo ............... 30 
  10. Visualiza esto ....................... 33 
  11. Contenido y forma ...................... 36 
  12. Construiré un IDE para mí ....................... 39 
  13. Libertad de pensamiento ........................... 49 
  14. Hurra, el fin .............................. 58 
  15. UPD.  Ejemplos de aplicación ................. 58 




Prologo


Cuando escribe en cualquier lenguaje de programación, siempre hay una escasez aguda del navegador de clases de Smalltalk, la sensación molesta de que sus manos están atadas y sus piernas húmedas es interminable. Y también sucede que a menudo buscas una cosa en Internet, y encuentras algo completamente diferente, pero tan hermoso que el motivo del comienzo de la búsqueda se pierde en el contexto de los horizontes que se desarrollan. Una búsqueda de la frase "navegador de clase de pitón" produce una tonelada de basura, pero un diamante sin cortar yace en esta montaña, brillando débilmente, sin atraer un gran interés, esperando el ojo atento y una mente inquisitiva para notarlo y recogerlo.



Instalar Leo Editor


El proyecto es multiplataforma, el proceso de instalación se proporciona para la plataforma Windows. Para iniciar el editor, necesita Python y la biblioteca Qt. La opción de instalación descrita es la más sencilla para el usuario que no está preparado para sufrir, los profesionales pueden actuar a su discreción.

Instale el administrador del espacio de trabajo del programador Python de Miniconda. Esta solución le permite reducir seriamente la capacidad de obtener una calabaza en lugar de componentes correctamente conectados, y en el caso de un punto muerto arbitrario, regrese sin problemas al estado cero y cambie rápidamente a probar una opción de ajuste diferente.

Desde la página de descarga descargamos el instalador Python 3.7 Miniconda3 Windows de 64 bits. Establecemos cuando surge la pregunta sobre las marcas de verificación, activamos los dos.

A continuación, ejecute la línea de comando (teclas [Win + R], "cmd", [Enter]). Escribimos:

conda 

devuelve la foto

No hay errores, hay acceso directo a conda. Verificamos la disponibilidad de la versión requerida del ejecutor de idiomas:

 python -V 

devuelve la foto

En el lugar.

Analizamos qué versiones del editor están disponibles para la instalación:

 pip install leo== 

Preferimos la última versión sin letras en el número:

 pip install leo==6.1 

Después de descargar, desempacar e instalar, probamos suerte: lanzamos el intérprete de Python, nos conectamos a los componentes del editor, iniciamos el editor

 python >>>import leo >>>leo.run() 

devuelve la foto



Personalización


Si el acceso directo para el inicio no aparece en el escritorio, agréguelo usted mismo:

Ruta al lanzador del editor: % USERPROFILE% \ Miniconda3 \ Scripts \ leo.exe
Ruta del icono : % USERPROFILE% \ Miniconda3 \ Lib \ site-packages \ leo \ Icons \ SplashScreen_trans.ico

devuelve la foto

Realmente no me gustaba el aspecto de mis temas visuales nativos, así que tuve que hacer el mío. Para usarlo, primero debe descargarlo . Libre de virus 1000%. El archivo python.py es una descripción para diferenciar el color de los elementos de sintaxis de Python. Debe colocarse en % USERPROFILE% \ Miniconda3 \ Lib \ site-packages \ leo \ modes \ con el reemplazo del archivo anterior. Lo que, por el bien de ustedes, entregó el lenguaje python se aclarará un poco más tarde. Los archivos restantes del archivo deben copiarse en la carpeta% USERPROFILE% \ Miniconda3 \ Lib \ site-packages \ leo \ themes \ .

Ahora debe habilitar el tema en la configuración del usuario.

devuelve la foto

Haga clic en el elemento @settings, luego use la tecla [Insertar] para agregar un nuevo elemento anidado. Pega el texto:

 @string theme-name = monokai.leo 

Para guardar los cambios, presione [Entrar]. Si la edición del nombre de un elemento se desactiva inadvertidamente, puede habilitarla haciendo doble clic en el elemento o presionando la combinación [Ctrl + h].

devuelve la foto

Reiniciar con guardar cambios.

devuelve la foto

La asociación con los archivos ".leo" debería ocurrir automáticamente, pero si no, usaremos la solución integrada.

devuelve la foto

Hasta hace poco, esto no funcionaba sin enmiendas, y ahora lo han reparado, como si, jeje.



Conociendo la interfaz


devuelve la foto

A primera vista, tenemos ante nosotros un editor ordinario de textos estructurados (editor de esquemas en inglés, outliner), un clon del amado treepad por muchos (el archivo web, fuera del sitio, desafortunadamente, se ha deshabilitado debido a problemas financieros del desarrollador). De hecho, hay un árbol y hay un área para ingresar texto que pertenece al nodo del árbol seleccionado. El área multifuncional con las pestañas de nombre sin complicaciones, además del registro, concluye algo más útil, comencemos con la búsqueda de texto.

devuelve la foto

Parece ser una cosa estereotipada, pero hay excentricidades, en lugar de los botones en pantalla, se propone presionar las teclas del teclado. Y el comando find-all no tiene una clave asignada en absoluto. Ahora toda la atención está en la parte inferior de la ventana.

devuelve la foto

Tru-geeks deben haberse ahogado con cerveza. Sí chicos, este es un préstamo directo de emacs. La mayoría de las operaciones del editor pueden iniciarse utilizando la línea de comandos incorporada.

devuelve la foto

devuelve la foto

devuelve la foto

Los resultados de búsqueda para todas las palabras que aparecen "the" se muestran en un nuevo nodo de árbol creado deliberadamente. La granja colectiva! (No se preocupe, la búsqueda por elementos "corre" a través de las ocurrencias detectadas, como en los tíos sanos).

devuelve la foto

¡Juventud, no se dispersen! Era necesario sacudir las ampollas dormidas. Siempre puedes ir por el borde de esta zona oscura Leo Editor. El programa se parece mucho a Linux: pasión, cuánto hacen los entusiastas por sí mismos, todo requiere un estudio cuidadoso, el rendimiento de uno es diferente de la implementación del otro, siempre es sorprendente descubrir nuevos chips que alguien puso, pero realmente no describió, y Por todo esto, existe la punta del iceberg en el que se asienta cómodamente, y si eres reacio a tomar aventuras, no puedes envolverte en las profundidades sombrías.

devuelve la foto

El área de etiqueta le permite asignar etiquetas a los nodos y, posteriormente, trabajar con ellos. Aparentemente se usa para agregar nuevas dimensiones a la profundidad del ordenamiento del caos. Seleccionamos el nodo, escribimos el identificador de etiqueta, hacemos clic en "+". Seleccionamos otro nodo, simplemente presionamos "+" en él, se asignará la etiqueta activa. Seleccionamos el tercer nodo, escribimos "Schmucker", presionamos "+". Actualmente tenemos dos nodos con la etiqueta "zutsker" y un nodo con la etiqueta "shmutsker".

devuelve la foto

Seleccionar una etiqueta de la lista de etiquetas conduce a una lista de nodos asociados con la etiqueta por los nombres de los cuales puede navegar. Para seleccionar una etiqueta de un nodo, haga clic derecho sobre ella.

devuelve la foto

Luego viene el extremadamente útil panel de navegación. Ayuda a pasar por alto rápidamente los nodos en los que se produce una palabra determinada. Dado que la forma de mantener archivos .leo es un gran desastre con un alto nivel de organización, la navegación a través de la búsqueda se ajusta al ciclo natural de la aplicación.

devuelve la foto

El uso común de editores de textos estructurales es la acumulación de una base de conocimiento personal. El segundo uso más común es mantener una lista de tareas. La siguiente pestaña ayuda a colorear este proceso con prioridades, plazos y estados de implementación.

devuelve la foto

El menú contextual del nodo le permite utilizar una proporción significativa de las capacidades de la pestaña Tarea.

devuelve la foto



Crea archivos externos


Cómo editar el texto y usar el árbol no será difícil de resolver por sí mismo, así que procedemos a sumergirnos en el abismo de las infinitas posibilidades de transferir abstracciones al mundo real. Crea un nuevo archivo.

devuelve la foto

El nombre del nodo único NewHeadline cambia a @file 1.txt

devuelve la foto

Agregue algo de texto al contenido del nodo.

devuelve la foto

Guarde el archivo .leo en alguna parte. Abra la carpeta en la que se encuentra el archivo .leo. Notamos que hay 1.txt. Lo abrimos

devuelve la foto

¿Qué construimos? Configuramos la exportación de uno de los nodos del archivo .leo a un archivo externo.
¿Qué basura hay alrededor de nuestro texto? Metadatos que le permiten recrear la estructura al volver a cargar el archivo en el Editor Leo, lo cual es necesario si el archivo se modificará en algún lugar externo. La mayoría de los archivos python del código fuente del Editor Leo se pueden soltar arrastrando y soltando en el editor y se encuentra que contienen una descripción de la estructura:

devuelve la foto

Pero si no necesitamos la función de carga inversa en absoluto, pero por el contrario queremos que el archivo no contenga bytes extraños, entonces esto se hace reemplazando la directiva @file por @file-nosent (sin centinelas).

devuelve la foto

Después de guardar los cambios en el archivo .leo, el archivo externo se actualizará automáticamente.

devuelve la foto



Usar secciones con nombre


Cada nodo es una entidad independiente separada, que por defecto no tiene información sobre sus vecinos. Si intentamos agregar una nueva estructura al nodo adjunto a un archivo externo y hacemos clic en guardar, se producirá un error.

devuelve la foto

Se nos notifican dos problemas:

  1. Tenemos un nodo de "prueba" suspendido en el aire (en relación con el archivo externo, ya que hay un nodo dentro de la estructura .leo, pero no indicamos cómo debe agregarse al archivo externo, debido a esto hay un error).
  2. Hasta que se resuelva el problema con el nodo colgante, no se guardarán en el disco otros cambios dentro del @file-nosent 1.txt .

La primera forma de agregar enlaces entre nodos es a través de secciones. Un formato especial para los nombres de sección se ve así:

 <<my_name>> 

Esto le permite proclamar un nodo anidado como una sección con nombre, el mismo nombre debe especificarse en el lugar del nodo externo donde se deben colocar los contenidos del nodo subordinado.

devuelve la foto

devuelve la foto

El archivo resultante:

devuelve la foto

El mismo ejemplo en un archivo real, la sección de importación de dependencias externas se asigna explícitamente a un nodo separado.

devuelve la foto



Inclusión codiciosa


Pero, ¿qué hacer si queremos construir una sección anidada en una sección anidada y poner otra sección en ella? Puedes actuar ingenuamente:

devuelve la foto

Pero para tales deseos naturales, hay hasta dos directivas: @all y @others .

La directiva @all concatena sin gusto los textos de todos los nodos anidados.

devuelve la foto

Por supuesto, todo depende del formato de archivo que necesite en la salida, pero probablemente le gustará más la directiva @others , que le permite materializar la estructura diseñada en la forma deseada. Opción melancólica:

devuelve la foto

Ajustar secciones con palabras clave:

devuelve la foto

Formato de sangría:

devuelve la foto

Como? ¿Está empezando a tomar forma? Apenas llegamos a la verdadera diversión. :: ::



Magia simple


Finalmente, comenzamos a componer el código. La tarea será estúpida, pero contendrá elementos básicos típicos de un programa útil. Cree un nuevo nodo en cualquier parte del archivo existente o nuevo. La primera línea indica la directiva @language para habilitar el resaltado de código. Si debajo del idioma de resaltado en la carpeta % USERPROFILE% \ Miniconda3 \ Lib \ site-packages \ leo \ modes \ no, nadie prohíbe agregarlo usted mismo.

devuelve la foto

Supongamos que la información que vamos a procesar es almacenada por una placa en un archivo csv.

Necesitamos: contar el número de caracteres "0" encontrados en la columna Count

Debemos:

  1. Convertir texto a estructura de datos de muestra
  2. Realizar iteración con conteo

devuelve la foto

Descomponemos el programa de acuerdo con el algoritmo desarrollado. El segundo paso después de leer el archivo, divide el texto en líneas. Cuál fue el primer paso se mueve al nodo subordinado Leer.

devuelve la foto

A continuación, cree una matriz de diccionarios correspondientes a los datos de la tabla. Este nodo está en el nivel superior.

devuelve la foto

Y el último paso.

devuelve la foto

Mientras tanto, el archivo main.py resultante se formará en el disco.

devuelve la foto

Hurra, somos geniales. Pero de repente tuvimos un deseo incomprensible de calcular el número de líneas significativas en el mismo archivo csv. No es un problema, haga copy.paste del nodo principal, cambie el nombre del archivo de salida, modifique el código del último paso. Obtenemos el resultado.

devuelve la foto

Y aquí nuestra alegría da paso a la tristeza, porque el nombre del archivo CSV puede ser diferente, lo que significa que si lo corregimos en un programa, en el segundo definitivamente lo perderemos de vista y, por lo tanto, depreciaremos la alegría de reutilizar el código.

Triste y bonita, ¡es Leo Editor! Tiene copias sincronizadas de nodos. Que? En lugar de copiar el contenido del nodo, puede pegar el nodo copiado en el modo "clon", "fantasma", y luego cambiar uno de los nodos vinculados se mostrará en los otros nodos. Este es un concepto extremadamente poderoso que le permite resolver las contradicciones inherentes a la organización de la información en los árboles.

Copia el nodo.

devuelve la foto

Lo insertamos como un "fantasma".

devuelve la foto

Los fantasmas tienen un ícono diferente. Cualquier cambio en el nombre, contenido o nodos subordinados se refleja en la copia. Eliminamos el antiguo nodo de lectura y verificamos que la modificación del nombre del archivo ahora se realiza sincrónicamente en todas partes.

devuelve la foto

Hablando en el lenguaje de las matemáticas, los "fantasmas" le permiten cambiar de un árbol a un gráfico acíclico completo. ¡Un árbol en Leo puede tener más de una raíz!

devuelve la foto

Esto le permite hacer cosas fantásticas: hacer malabarismos con representaciones de información, vincular contenedores de datos heterogéneos, tener un número infinito de copias reales de datos en un proyecto, cargar datos en el árbol Leo que no se pueden colocar en un árbol normal.



Hombre lobo reverso


Hagamos un experimento. Crea un nuevo nodo. Añadir texto a él.

 g.es( len("This is test".split()) ) 

devuelve la foto

Presione [Ctrl] + [b].

devuelve la foto

Chpok, buenas noches. Sí, tenemos aquí, resulta que el intérprete de Python está incorporado, lo que puede ejecutar el texto del nodo como código. Si las secciones están conectadas al nodo de acuerdo con las reglas para unir secciones a archivos externos, entonces el código de ellas también se ejecuta, lo que significa que no hay tal fuerza que pueda detenernos en una batalla con el desorden.

devuelve la foto

Ejemplo de vida: el código de los tutoriales es terriblemente reacio a escribir normalmente, pero si se trata de algo más de 50 líneas, el desorden que se vuelve ilegible al día siguiente está garantizado. Vale la pena agregar que muchos entrenadores usan el mismo conjunto de datos de origen y realizan varias manipulaciones en ellos. Lo anterior es cierto para cualquier "prototipo" o "herramienta de utilidad 1-2 veces". En este lugar, los chips Leo Editor descritos son extremadamente útiles.

devuelve la foto

Eso es todo: este es un código que hace algo directamente dentro del Editor Leo, sin cargarlo en archivos .py.

A diferencia de las hojas de espagueti en la imagen, puede comprender de inmediato la esencia general de lo que está sucediendo. Por ejemplo, en el programa "4 Regresión lineal", los datos de Internet se escriben primero en un archivo. Y luego se llevan a cabo varias manipulaciones en el modelo numérico de "regresión OLS", construido de acuerdo con el archivo. Además, si necesitamos usar otros datos u otras configuraciones del modelo, entonces es suficiente hacer cambios en un nodo, ya que las partes reutilizadas del programa son implementadas por "fantasmas". El programa se divide en 6 partes independientes, cada una de las cuales se inicia por separado, pero al mismo tiempo comienzan a ejecutarse desde un punto común.

Cuando el código de temas similares se almacena de forma organizada en un solo lugar, es muy conveniente, incluso si pasa mucho tiempo, luego, utilizando la búsqueda de navegación, puede encontrar rápidamente algún método específico, y la organización estructural ayudará a navegar lo que está sucediendo. Los "fantasmas" le permiten convertir código complejo no lineal en un conjunto de acciones secuenciales, mientras que las entidades de "clonación" no multiplican la entropía, sino que la reducen, porque la repetición se reemplaza por la unión y no se crean niveles adicionales de abstracción.

50 archivos dispersos con archivos fuente son 50 archivos dispersos. 50 nodos con códigos fuente es una base de conocimiento con un deseo interno de autoorganización.



Visualízalo


Antes de embarcarse en el nivel de dificultad Pesadilla, volvamos a la interfaz.

Los paneles del editor se pueden arrastrar para organizar su espacio de trabajo de la mejor manera. Cada archivo conserva su propia configuración de apariencia. Puede cerrar todos los paneles excepto el árbol. Para devolver los paneles, haga clic derecho en el encabezado del árbol.

devuelve la foto

En el mismo menú hay un cierto Render. Esta pequeña cosa está diseñada de acuerdo con su nombre para mostrar todo en el mundo.

De forma predeterminada, el procesamiento intenta representar el texto del nodo como reStructuredText . Se incluyen otros modos de operación forzando el tipo de contenido en el nombre del nodo.
IDTipo de contenidoNota
@asciidocAsciidoctor marcado de documentaciónRequiere la instalación de Asciidoctor
@htmlMarcado HTML
@graphics-scriptDibujo GUI personalizado a través de clases QT QGraphicsView, QGraphicsScene
@imageMostrar imágenes de formatos popularesEl camino hacia la imagen se indica en el cuerpo.
@svgMapeo SVGEl cuerpo indica la ruta a la imagen o la fuente SVG
@jupyterMostrar sesiones interactivas de jupyterNo funciona correctamente
@latexPantalla de marcado de LaTeXNo funciona correctamente
@md, @markdownMarkdown Markup DisplayRequiere la instalación del procesador Markdown
@moviePantalla de videoLa ruta al video se especifica en el cuerpo
@pyplotVisualización de gráficos con Matplotlib PythonRequiere la instalación de Matplotlib Python

Como puede ver en la tabla, Render no funciona muy vigorosamente, la buena noticia es que Leo Editor se puede ampliar con complementos, incluidos los visuales. Por ejemplo, necesitaba cargar los números en tablas y dibujar gráficos, mientras cambiaba los datos iniciales mil veces.

devuelve la foto

El código mínimo del complemento visual se ve así:

 from leo.core.leoQt import QtCore, QtGui, QtWidgets import leo.core.leoGlobals as g class My_Plugin_Widget(QtWidgets.QWidget): def __init__(self, parent=None, leo_com=None): super(My_Plugin_Widget, self).__init__(parent) c = leo_com self.c = c self.layout = QtWidgets.QVBoxLayout() self.message = QtWidgets.QLabel("Hello there!", self) self.layout.addWidget(self.message) self.setLayout(self.layout) def init(): g.registerHandler("after-create-leo-frame", onCreate) g.plugin_signon(__name__) return True def onCreate(tag, keys): c = keys.get("c") if not c: return dw = c.frame.top dock = g.app.gui.create_dock_widget(closeable=True, moveable=True, height=150, name='My plugin') dw.leo_docks.append(dock) dock.setWidget(My_Plugin_Widget(leo_com=c)) dw.splitDockWidget(dw.body_dock, dock, QtCore.Qt.Horizontal) dock.show() 

El complemento es necesario:

  1. Guardar en %USERPROFILE%\Miniconda3\Lib\site-packages\leo\plugins\
  2. Regístrese en el archivo myLeoSettings.leo en el @settings\@enabled-plugins

devuelve la foto

Puede leer sobre cómo hacer complementos aquí , si es impaciente obtener más información, entonces la única manera es estudiar el complemento viewrendered.py usted mismo.

¿Por qué es todo esto? De nuevo a posibilidades ilimitadas. El acceso completo a QT le permite reproducir información de manera arbitraria o ingresarla de la manera más inesperada.



Contenido y forma


Todo lo descrito anteriormente parece una herramienta conveniente para resolver una gama limitada de tareas de pantalla, nada más. La conversión de árbol a archivo externo es lineal y está limitada por marcos estrictos. Incluso los nombres de los nodos desempeñan el papel de comentarios, pero no tienen otra funcionalidad útil. Pero en la práctica resulta que es muy apropiado describir una entidad compleja para el pensamiento humano con un árbol, pero al mismo tiempo el formato para la máquina puede no parecerse a nada y / o puede no tener ninguna estructura distinta. Para un ejemplo simple, tome HTML. Sería muy conveniente y fácil (juicio de valor) preparar el marcado de esta forma:

devuelve la foto

Todo es estructuralmente consistente y visual, es imposible cometer un error de no cerrar o colocar incorrectamente una etiqueta, y hacer cambios de cualquier escala es elemental. Aunque el archivo de salida HTML será "linealmente proporcional" a esta estructura ficticia, el mecanismo de archivo adjunto de sección no es capaz de producir lo siguiente:

  1. Etiquetas de abrir-cerrar
  2. Asignar texto de nodo como atributos de etiqueta
  3. El texto de los nodos con el nombre especial "> <" se coloca dentro de la etiqueta correspondiente

Bueno, por supuesto, Leo Editor da acceso ilimitado al árbol desde el código de nodo. Tanto para leer como para escribir. Lo que permite realizar modificaciones arbitrarias de las representaciones de información para el hombre y la máquina. En cualquier dirección y cualquier número de veces. Puede descargar cierto formato, reconstruirlo en un árbol entendible para USTED, realizar cambios y volver a convertirlo. Si el formato de salida es trivial, puede escribir un archivo externo usando Python. Si el formato es complejo y / o hay una cantidad significativa de datos, entonces es ventajoso pasar el tiempo cambiando los datos a un nodo de archivo con secciones, ya que esto facilita enormemente la depuración de las conversiones.

Descripción de funciones para trabajar con un árbol:
El equipoEfecto
g.es('text')print('text') Leo Editor
n = g.findNodeAnywhere(c, 'TITLE')'TITLE'
for node in n.children():
node.h/
node.b/
node.parent()
p()
c.selectPosition(p)
root_node = p.findRootPosition()
for node in root_node.following_siblings():
if node.h.startswith('OUTPUT'):, 'OUTPUT'
new_node = node.insertAsLastChild()
if node.hasChildren():
new_node = node.insertAfter()
node.deleteAllChildren()
c.redraw_now()

Se pueden elegir otras funciones de las fuentes de Leo Editor y completar los archivos .leo, y realmente no hay documentación ( excepto esta página ) = (

Por cierto, este artículo está escrito en Leo Editor.

devuelve la foto

El siguiente código se utiliza para exportar el árbol a HTML:

 @language python from pathlib import Path @others path = Path('C:\\Projects\\article\\') / 'out.html' out_text = '<body><script>document.body.style.fontSize = 20;</script>' n = g.findNodeAnywhere(c, 'TITLE') assert nh == ('TITLE') tag = f'<h1>{nb}</h1> ' out_text = out_text + tag + '\n\n' n = g.findNodeAnywhere(c, 'TEXT') assert nh == ('TEXT') for header_node in n.children(): anchor_id = hash(header_node.h) tag = f'<anchor>{anchor_id}</anchor><h3>{header_node.h}</h3>' out_text = out_text + tag + '\n' if '' == header_node.h: text = make_toc(header_node) tag = f'{text}' out_text = out_text + tag + '\n' for content_node in header_node.children(): if '@image' in content_node.h: tag = f' <img src="{content_node.b}" alt="  "> ' else: text = content_node.b if not 'table' in content_node.h: content_node.h = ' '.join(content_node.b.split()[:3]) text = text.replace('\n', ' ') tag = f'{text}' out_text = out_text + tag + '\n' tag = ' <hr/>' out_text = out_text + tag + '\n' out_text = out_text + '</body>' + '\n' with open(path, 'w', encoding='utf-8') as f: f.write(out_text) g.es('.') 



Construiré un IDE para mí


Ni una sola pitón, así que tratemos de equiparnos con una esquina debajo de ... cualquier cosa. Primero, finalmente presione el botón de secuencia de comandos.

devuelve la foto

Esta acción lleva a la aparición de un nuevo botón debajo del menú principal con el nombre del nodo actual. La lógica sugiere que hacer clic en este botón recién creado conducirá a un intento de ejecutar código desde el nodo asociado con el botón. Es conveniente, pero inconveniente, que el botón se evapore después de reiniciar el editor. Para mantener el botón siempre en su lugar, debe agregar un hechizo especial en el nombre del nodo @buttony reiniciar Leo Editor.

devuelve la foto

Para cada botón de usuario, puede asignar una tecla de acceso rápido utilizando la expresión. @key=

devuelve la foto

Para ejecutar otro script desde un script, debe llamar a la funciónc.executeMinibufferCommand('FIRE'). Cada secuencia de comandos con un botón vinculado cae en el grupo general de comandos del editor bajo el nombre del botón, es decir, sí, su secuencia de comandos también se puede ejecutar desde la línea de comandos del editor.

devuelve la foto

Para ejecutar la secuencia de comandos del nodo que está actualmente en foco, desde otra secuencia de comandos (como presionando [Ctrl] + [b]), se utiliza el comando c.executeMinibufferCommand('execute-script').

Supongamos que tenemos un código preparado. Sería beneficioso ejecutarlo desde Leo Editor, y sería maravilloso obtener todos los errores de la consola. Eche un vistazo a un ejemplo de código Python con formato automático dentro de un nodo utilizando la famosa utilidad Black.

 @language python import subprocess import re c.frame.log.selectTab('Log') c.frame.log.clearLog() python_src = [] for line in pbsplitlines(): if re.match(r'@', line) is not None: line = line.replace('@', '# special_comment@') elif re.match(r'<<', line) is not None: line = line.replace('<<', '# special_comment<<') python_src.append(line) text = '\n'.join(python_src) proc = subprocess.Popen( ['black', '-', '-q', '--skip-string-normalization'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, bufsize=0, shell=True, ) proc.stdin.write(text.encode()) proc.stdin.close() s = proc.stdout.read() if s: text = s.decode('utf-8') text = text.replace('# special_comment<<', '<<') text = text.replace('# special_comment@', '@') if 'error: cannot format -: Cannot parse:' in text: z = re.search(r'Cannot parse:.*', text) g.error(z.group(0)) else: undoData = c.undoer.beforeChangeNodeContents(p) pb = text.strip() c.undoer.afterChangeNodeContents(p,'Format with black', undoData) c.executeMinibufferCommand('execute-script') 

Se hace lo siguiente:

  1. Tomamos el texto del nodo
  2. Ponemos instrucciones especiales de Leo Editor en los comentarios.
  3. Inicie la utilidad de la consola.
  4. Pasamos el texto a la utilidad.
  5. Lee su conclusión
  6. Regresamos al lugar instrucciones especiales
  7. Si no hay errores, reemplace el texto actual con formato
  8. Ejecute el código del nodo

Esta muestra será suficiente para lanzar cualquier cosa sobre su base.

Ahora veamos una versión hermosa y clara del uso práctico de Leo Editor. El ecosistema Python tiene varias soluciones para crear aplicaciones GUI, una de las cuales es el marco Kivy. Una característica importante de este marco es la capacidad de cargar una descripción de interfaz en un idioma especial desde un archivo de texto. Leo Editor nos ayudará, en primer lugar, a almacenar el código y la descripción de la interfaz en un espacio, y en segundo lugar, reemplazará la edición de texto con la edición en árbol, lo que de alguna manera nos acercará a los bocetos de la interfaz wysiwyg.

devuelve la foto

Qué hechos se pueden extraer de la captura de pantalla anterior:

  1. Leo Editor Kivy
  2. RUN make_GUI, make_py,

devuelve la foto

Arriba, puede ver cómo se ve la descripción de la interfaz en forma ensamblada. Esto puede ser sabroso, pero la granja colectiva de la izquierda parece ser una solución más manejable e industrial. La versión correcta pide hacer errores tipográficos el viernes por la noche.

Pasamos a la sucursal con el código.

devuelve la foto

Muy limpio Y está claro. No prestamos atención a DATAGRAPH. ¿Y qué hay de las clases?

devuelve la foto

El círculo se ha cerrado, entonces lo que sucedió esta historia llegó a ser una implementación improvisada del navegador de clase para Python. Los encabezados de nodo no son solo comentarios; su contenido se usa al generar archivos .py. Los niveles de anidamiento de clases forman automáticamente una jerarquía de herencia. Todo lo que adoramos.

devuelve la foto

KA-EE-FF !!! No se concentre en el significado de lo que está sucediendo, las clases se lanzan para una captura de pantalla.

Se puede hacer algo similar en la funcionalidad básica de las secciones del archivo, pero tendrá que especificar explícitamente todas las construcciones de lenguaje (def, clase ...), y con cualquier cambio, deberá recordar hacer numerosas correcciones allí (y los encabezados de nodo colgante inútiles también )

Y nuevamente, sobre un solo espacio de código e interfaz. Primero, recuerde la búsqueda de navegación, que le permite buscar rápidamente controladores de código para elementos visuales y elementos visuales del código.

devuelve la foto

En segundo lugar, todavía existe una característica tan esperada como un editor de texto adicional.

devuelve la foto

Hop!

devuelve la foto

Por lo tanto, no es necesario correr de un lado a otro con una edición mutua compleja de nodos.

Por cierto:

devuelve la foto



Libertad de pensamiento


Al final habrá un poco antinatural. Todo lo que se describe a continuación no debe tomarse como una demostración de buenas prácticas de ingeniería, esto es solo una semilla para cristalizar sus ideas personales.

El punto de partida para el primer experimento: si la mayoría de los programas están involucrados en la producción repetida de otras matrices de datos a partir de una única matriz de datos muchas veces, ¿por qué no crear un bloque de construcción simple descrito por una clase universal con una interfaz de recepción / salida de datos unificada para Enlace visualmente bloques similares en el árbol del Editor Leo, en la imagen de programación en gráficos (bloques de funciones). Con la diferencia de que será un sistema híbrido de clase de bloque, y cada forma de describir el código se utilizará de acuerdo con el beneficio máximo a largo plazo.

Una unidad funcional primaria debe: tener una entrada para recibir información, ser capaz de responder a su tipo, procesar la información inicial, empaquetar los resultados del procesamiento en un formato para la transmisión y traducir el resultado.

devuelve la foto

Supongamos que hay una tarea atrevida de analizar sitios. Necesitaremos los siguientes bloques:

  1. Componente de red
  2. Analizador de página web
  3. Bloque para la comunicación de los datos recibidos y la interfaz gráfica

devuelve la foto

A continuación se muestra la implementación práctica mínima de un bloque suficientemente universal, que encaja en la rama de clase.

devuelve la foto

Por supuesto, cada bloque de concreto puede recargar métodos típicos con los suyos si se observan estrictamente dos reglas:

  1. En cada bloque, el método de decodificación necesariamente llama proceso, que a su vez llama codificación
  2. El método de codificación llama al método de decodificación en todos los bloques registrados como salidas.

Es decir: se garantiza la disponibilidad de unificación estructural y la homogeneidad del intercambio de información.

devuelve la foto

Lo mismo, pero más claramente:

  1. El producto original se encuentra en la placa izquierda.
  2. Decode prepara el producto para el procesamiento
  3. Después de eso, el bloque lleva a cabo su función principal en el método de proceso.
  4. El producto está empaquetado por codificar
  5. El producto empaquetado se transfiere a unidades posteriores

Cada bloque resulta ser bastante independiente, lo único que necesita saber sobre el mundo exterior es una forma específica de analizar los datos entrantes. El código universal es responsable de la implementación específica de conectar los bloques entre sí. Como resultado, si tenemos varias canalizaciones similares disponibles, puede simplemente copiarlas como un todo, solo haciendo correcciones a implementaciones específicas de los métodos de proceso.

En la siguiente imagen, puede observar algo muy similar al trabajo con las clases descritas en la sección anterior. La diferencia es que el anidamiento de los nodos no establece la relación padre-hijo, sino la relación de entrada-salida de los bloques correspondientes. Para organizar el intercambio de datos con bloques no adyacentes, se usa una muleta en forma de un anuncio explícito de salidas, que se justifica por el pequeño número de casos.

devuelve la foto

Con este enfoque, el número de canales se vuelve indiferente: dos de ellos o 50. El número de etapas del procesamiento de la información también es insignificante (dentro de límites razonables), esto no afecta la simplicidad de la comprensión, en contraste con la expansión de los módulos de texto. Al copiar transportadores en un solo paso, se forma una cadena completamente nueva. Todo está organizado de manera absolutamente idéntica, es fácil hacer cambios incluso después de 5 años, el principio metodológico de organizar la funcionalidad es el mismo, no hay necesidad de crear castillos etéreos en la cabeza a partir de abstracciones.

devuelve la foto

Adjuntar canalizaciones personalizadas no distorsiona la imagen general, ya que la lógica de trabajar con datos arbitrarios es invariablemente idéntica.

devuelve la foto

La segunda historia absurda. Necesitaba hacer un juego de Kvent (un análogo directo del juego conocido dentro de un juego aún más conocido, para el juego que usa naipes estándar). Hay muchos enfoques diferentes para la organización del ciclo del juego, una de las opciones ingenuas es la máquina de estado. Con la máquina de estados, todo está bien y es simple en teoría, en la práctica, admitir más de 7 estados en cualquier programa real se vuelve gradualmente aburrido sin agregar un par de capas de abstracciones. En este punto, pensé que el mantenimiento visual de la máquina de estado en forma de árbol es una opción interesante.

devuelve la foto

Escribimos un generador de código de programa desde un árbol, produce el siguiente resultado:

devuelve la foto

No hay miedo.

devuelve la foto

Luego viene un cambio de condición por condición. Se hace sospechosamente.

devuelve la foto

devuelve la foto

Fue solo un trato de cartas con el reemplazo de un par de cartas arbitrarias. Ok, comparta una sola máquina en varias máquinas.

devuelve la foto

A continuación, nace la lógica para procesar la ronda del juego.

devuelve la foto

En este punto, el límite de aplicabilidad práctica de tal descripción de la máquina de estado está roto, aunque el árbol se ve espeluznante solo si se implementa intencionalmente al cien por cien. Pero todavía hubo efectos completamente no realizados de la influencia de las cartas con imágenes en el transcurso del juego. Se puede suponer que una máquina de eventos para tal tarea sería una mejor solución. Y de nuevo, es fácil hacerlo en los árboles;)



Hurra, el final


En Leo Editor, hay una gran falta de autocompletado normal y resaltado múltiple de la palabra seleccionada ("resaltado inteligente" en el bloc de notas ++). Pero incluso con estos defectos grasos es fácil soportarlo, porque una vez que lo haya probado, ya es imposible prescindir de esta herramienta conveniente en la que puede pintar sin esfuerzo su entorno personal para cualquier tarea. ¿Hay algo similar o mejor en el mundo? Hay muchos monstruos entre los IDE, están extremadamente llenos de funcionalidad inteligente inteligente inteligente, pero ¿cuál de ellos otorga un poder similar sobre la información y cuál de ellos proporciona tanta libertad para organizar el flujo de trabajo?

Idea, material, herramienta, producto. En el mundo de la ingeniería, una herramienta de generación anterior le permite pasar a la próxima generación de herramientas más sofisticadas. Hemos pasado de un taladro manual a dispositivos de cultivo con gatos que utilizan electricidad. La programación colgaba en la etapa de buenos tornos, pero en lugar de profundizar, discutimos qué aleación es mejor desde el cortador, y debe alimentar desde arriba o desde el costado. Leo Editor no es la respuesta a las preguntas de mañana, es una señal de lo que se puede hacer mejor.

El punto no es que un programador pueda resolver el problema escribiendo código, mientras que el otro "empuja" lo mismo (condicionalmente). Una herramienta en la que puede "hacer clic" (condicionalmente) le permitirá resolver problemas previamente inaccesibles en términos de tiempo y complejidad. En el futuro, necesitaremos programas que escriban en tiempo real millones de programas relacionados, y no tenemos nada para gestionar la complejidad de esta escala.

En general, crea tu realidad, y si no hay herramientas necesarias para ello, hazlas, funciona.




UPD Ejemplos de aplicación


Admin : biblioteca de comandos. Simplemente puede almacenarlo, puede ejecutarlo tal como está, puede usar la configuración de argumentos dentro del árbol. Por ejemplo, organice el trabajo con varias bases de datos.

devuelve la foto

Síntesis algorítmica de la música : organización de la pista

devuelve la foto

Embedder : organización arbitraria del código en caso de que su entorno tenga medios limitados.

Hay dos opciones:
1. Dividir el programa en secciones en el orden más favorable
2. Si el lenguaje no tiene funciones, se pueden simular usando fantasmas.

devuelve la foto

Hay tres formas de organizar el orden de ejecución del código:

devuelve la foto

devuelve la foto

devuelve la foto

Pentester : transfiere tu arsenal habitual a tu "ataque de cobalto" personal "

devuelve la foto

Source: https://habr.com/ru/post/484930/


All Articles