SynEdit/es

From Lazarus wiki
Revision as of 18:56, 10 October 2013 by Tito (talk | contribs) (→‎Uso de SynEdit: Traduciendo y ampliando la información.)
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja) polski (pl) русский (ru) 中文(中国大陆)‎ (zh_CN)

SynEdit

   SynEdit es un paquete de Lazarus que incluye diversos componentes orientados a la implementación de editores de texto para diversos lenguajes y sintaxis. Estos componentes se pueden encontrar dentro de la paleta de componentes en la solapa 'SynEdit'.

   Contiene un componente editor de código fuente llamado TSynEdit, varios resaltadores de sintaxis y otros componentes utilizados para la edición de código fuente.

   Frecuentemente se usa el término "SynEdit" para referirse específicamente al componente TSynEdit (del paquete SynEdit) en lugar de referirse a todo el paquete en si.

   Está basado en el proyecto independiente SynEdit [[1]], tomado en la versión 1.3 a partir del cual fue adaptado y extendido con características tales como soporte UTF-8 y plegado de código (code folding). A pesar de que el SynEdit de Lazarus comparte mucho del código original del SynEdit original, la cantidad de cambios introducidos desde su bifurcación, hacen que el actual SynEdit de Lazarus sea incompatible con el SynEdit original.

   Está licenciado bajo los mismos términos que el SynEdit original (MPL o GPL).

Características

  • Es un componente que no requiere de dependencias externas (a diferencia de Scintilla).
  • Es de ejecución rápida. Está optimizado para manejar bloques grandes de datos.
  • Trabaja en codificación UTF-8.
  • Permite implementar coloreado de sintaxis, usando resaltadores predefinidos o creando nuevos resaltadores.
  • Soporta las opciones de "Deshacer" y "Rehacer"
  • Implementa funciones integradas de Búsqueda/Reemplazo.
  • Soporta completado y autocompletado de código.
  • Soporta numeración de líneas.
  • Soporta plegado de código (folding).
  • Soporta selección sencilla en modo columna.
  • Permite trabajar con complementos.

SynEdit en el IDE

    El componente SynEdit es un paquete que ya viene integrado con Lazarus debido a que lo utiliza el propio IDE. Por lo tanto, el paquete no puede ser removido de la lista de instalación. Es por ello que no existe un fichero .lpk.

    Al estar integardo en el IDE, se garantiza su estabilidad y madurez. Además podemos verlo trabajando en el mismo IDE y así conocer sus funcionalidades y potencialidades.

Synedit 2.0.5 port

    Existe una versión alterna de SynEdit, portada desde la versión más reciente del original SynEdit 2.0.5:

http://wiki.lazarus.freepascal.org/SynEdit/port

code: https://github.com/rnapoles/

Uso de SynEdit

"CaretXY" Coordenadas Logicas y Físicas

La relación:

<Caracter en pantalla> -> <Byte de información>

No es una relación de 1 a 1:

  • Un caracter en pantalla puede estar representado por más de un byte, (efecto de la codificación UTF-8)
  • Un byte de datos puede representar más de un caracter en pantalla (efecto de las tabulaciones).

Para manejar esta falta de correspondencia, SynEdit maneja dos tipos de coordenadas para el cursor de texto (Caret):

  • Física: Corresponde a la posición visible del cursor en la pantalla.
  • Lógica: Corresponde a la posición del cursor dentro de la cadena de texto real.

La coordenada X lógica y física suelen ser distintas. La coordenada Y lógica y física son siempre iguales (Podría variar en el futuro).

La coordenada física es la posición en la grilla de la pantalla (ignorando los desplazamientos). Esto significa que:

Las letras "a" y "á" ocupan ambas una celda en pantalla, y se cuentan como un caracter, aún cuando en UTF-8 (la codificación usada por SynEdit) la letra "a" ocupa un byte, y "á" ocupa dos bytes (en coordenadas lógicas tiene dos bytes de ancho). Existen otros caracteres en UTF-8, que pueden ocupar 3 o hasta 4 bytes.
El caracter de tabulación (#9), por otros lado, ocupa un byte como cualquier otro caracter, pero en la pantalla puede ocupar más de una celda, es decir que físicamente ocupa más de una celda de ancho.

La coordenada lógica está referida a la posición que ocupan los bytes que representan a un caracter, dentro de toda la cadena.

La letra "a" tiene un byte de ancho, e incrementa la coordenada lógica en 1.
La letra "á" tiene dos byte de ancho, e incrementa la coordenada lógica en 2.
El caracter de tabulación tiene un byte de ancho e incrementa la coordenada lógica en 1.

La coordenad X física es siempre contabilizada desde la izquierda del texto, aún si hay desplazamiento en la visualización. Para obtener la celda-X actual desplazada en SynEdit se debe hacer:

grid-X-in-visible-part-of-synedit := PhysicalX - SynEdit.LeftChar + 1
grid-y-in-visible-part-of-synedit := SynEdit.RowToScreenRow(PhysicalY); // includes folding
// ScreenRowToRow for reverse

Cambiar texto por código

Text can be accessed via SynEdit.Lines. Changing text via the Lines property does not work with undo/redo

Use TextBetweenPoints and TextBetweenPointsEx to change text, if you want undo/redo do work.

BookMarks

Please see the following topic in the forum: http://forum.lazarus.freepascal.org/index.php/topic,14948.msg79794.html


Resaltado de sintaxis

(Auto-)Completado

There are 3 completion plug-ins for SynEdit:

  • TSynCompletion
    • Offers a list of words in a drop-down.
    • Used in the IDE for identifier completion.
    • Included in examples.
    • Only available in the component palette since 0.9.31
  • TSynAutoComplete
    • Replaces the current token (if known) with a piece of text. Not interactive. No drop-down
    • Included in examples.
    • Available in the component palette.
  • TSynEditAutoComplete
    • Basic template module. No drop-down.
    • Used by the IDE for code-templates. The IDE contains additional code extending the features. (drop-down and syncro macros are added by IDE only)
    • Not Included in examples.

See examples for more info.

Todo: The differences between 2nd and 3pd need to be documented. Maybe they can be merged


Other / Links

Discusiones en el foro con infromación sobre SynEdit:

Ejemplos

   Se puede encontrar un ejemplo en lazarus/examples/synedit1.lpi.

Como añadir soporte para Copy, Paste, Cut, Undo, Redo, etc

   Estas características se pueden implementar utilizando mandatos SynEdit.

 uses
  ...
  SynEdit, SynEditKeyCmds;

 procedure TfrmPrincipal.HandleCodigoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
 begin
  if (Shift = [ssCtrl]) then
  begin
    case Key of
    VK_C: synCodigo.CommandProcessor(TSynEditorCommand(ecCopy), ' ', nil);
    VK_V: synCodigo.CommandProcessor(TSynEditorCommand(ecPaste), ' ', nil);
    VK_X: synCodigo.CommandProcessor(TSynEditorCommand(ecCut), ' ', nil);
    end;
  end;
 end;

Menú con Deshacer y Rehacer

 procedure TForm1.MenuRehacer(Sender: TObject);
 begin
  SynEdit1.Redo;
 end;

 procedure TForm1.MenuDeshacer(Sender: TObject);
 begin
  SynEdit1.Undo;
 end;

Menus con Duplicar e intercambiar líneas

 //Duplicar Línea
 procedure TForm1.MenuDuplicarLinea(Sender: TObject);
 begin
  SynEdit1.Lines.Insert(CustSynEdit().CaretY,CustSynEdit().LineText);
 end; 

 //Intercambiar Línea hacia Arriba
 procedure TForm1.MenuLineaArriba(Sender: TObject);
 begin
  if CustSynEdit.CaretY -1 >= 1 then
   begin
    CustSynEdit.Lines.Exchange(CustSynEdit.CaretY -1 ,CustSynEdit.CaretY-2);
    CustSynEdit.CaretY:=CustSynEdit.CaretY-1;
   end;
 end;

 //Intercambiar Línea hacia Abajo
 procedure TForm1.MenuLineaAbajo(Sender: TObject);
 begin
  if ( CustSynEdit.CaretY + 1 <= CustSynEdit.Lines.Count) then
   begin
    CustSynEdit.Lines.Exchange(CustSynEdit.CaretY-1,CustSynEdit.CaretY);
    CustSynEdit.CaretY:=CustSynEdit.CaretY+1;
   end;
 end;

Insertar caracteres en la posición actual

 procedure TForm1.Button1Click(Sender: TObject);
 begin
  SynEdit1.CommandProcessor(ecChar,'a', nil); //Inserta a 
  SynEdit1.SetFocus;
 end;

Completamiento de Código con SynCompletion

 Uses
 ... ...
 LCLType,//Para poder usar VK_SPACE
 syncompletion;

 ... ... ....
 var
 Completion:TSynCompletion;
 begin
  Completion:=TSynCompletion.Create(Self);
  Completion.Editor:=SynEdit;
  Completion.ShortCut:=Menus.ShortCut(VK_SPACE, [ssCtrl]);   
  Completion.ItemList.add('Arc( )');
  Completion.ItemList.add('Axes( )');
  Completion.ItemList.add('Bezier( )');
  Completion.ItemList.add('Cercle( )');
 end;

Desplegar TSynCompletion en la posición actual

 procedure TForm1.Button1Click(Sender: TObject);
 var p:TPoint;
  begin
   with  SynEdit1  do
    begin
      P := Point(CaretXPix,CaretYPix + LineHeight);
      P.X:=Max(0,Min(P.X,ClientWidth-Completion.Width));
      P := ClientToScreen(p);
    end;
   Completion.Execute('',p.x,p.y);  
  end;

Documentación

   El usuario bubulemaster ha realizado un documento sobre SynEdit disponible aquí

   Está en francés, no se si más adelante lo traducirá al inglés.

Más desarrollos, discusiones

  • RTL (de derecha a izquierda (Right-To-Left)): comenzado por Mazen
  • Selección automática de fuente monoespacio: Por el momento SynEdit comienza con el tipo de fuente 'courier'. Pero sería mejor, si SynEdit comenzara con una tipografía monoespaciada (es decir: todos los caracteres tienen la misma anchura). Por ahora el LCL TFont no aporta tal propiedad y el usuario tiene que escoger la fuente correcta.
  • Selección automática de fuente UTF-8: Igual que el caso anterior de monoespaciado, pero con una cadena UTF-8 de fuente, de modo que por ejemplo umlaute se muestra correctamente. Por ahora el usuario tiene que elegir la fuente correcta.
  • Teclas muertas. La mayoría de los teclados soportan pulsar una o más teclas para crear un carácter especial (como en los caracteres acentuados (á,é,í,...) o con el umlaut).
  • Rediseño del componente SynEdit. El objetivo principal es una presentación y un navegación por el texto más fiable. Un enfoque más modular para permitir una mejor integración de las extensiones, y por controles especializados, para su utilización fuera de Lazarus.