Menu

Pré Gamma Release - Café 0.77

CAFE TEXT EDITOR V0.7.7

Café text editor is a fully configurable and extendable multipurpose lightweight text editor with support for UTF-8 encoding. It can open several files simultaneously even with syntax highlighting activated with several different languages. Almost all functionalities aspects of Café are human readable/configurable, besides a visual tool exists in most cases.

Brief List of Features:

. Multi-project capability.
. Syntax Highlighting.
. Configurable language associations for syntax highlighting.
. Perl engine for reusable macros.
. Cut, Copy, Paste to/from the clipboard.
. Cut, Copy, Paste to/from 10 numbered additional buffers. Visual aid avail.
. Cut, Copy, Paste to/from arbitrary text blocks.
. Undo/Redo with configurable levels.
. Preferences visually set with tabbed dialog.
. Goto Line. Goto Mark.
. Complex keystrokes (Ctrl-t _ where "_" is another key) text insertion.
. Configurable keystrokes like 'alpha' producing 'α'
. Find in Text, in Selection, in Files.
. Find and Replace in Text and in Selection.
. Project Management.
. Shell Scripts.
. Folder and Project Tree visual navigation.
. Spell Checker running on UTF-8.
. Dynamics Menus for Shells, Macros, and Projects.
. Indentation using (shift)TAB key.
. Embedded ATE (*) Help.
. Calendar and integrated Agenda.
. Network sockets to connect to TCP services.
. Internet protocol handlers.
. Spreadsheet functionalities.

ATE: All Text Experience. Only Text is pure, clear and honest!

VISUAL INTERFACE

The visual interface of Café is divided into 5 parts:
1. Menu and Tool bars
2. Left Notebook of Trees
3. Right Notebook of Texts
4. Bottom Notebook of Messages
5. Status bar

MENU AND TOOL BARs
Menu and Toolbars are straight forward items on any visual interface nowadays. Just browse the menus to find the option you want or pass the mouse over the tool bar´s icons to get some hint of what each button does. Today the toolbar is just a short cut for the most used functions, presented into the menu, such as copy, cut, paste, open, new, etc. There are future plans on the toolbar, like user-based configurations (dragging menu functions to the toolbar) and user functions (new functions defined by the user).

NOTEBOOK OF TREES
The left notebook hold tabs that are trees of some sort. The most common tree used is the 'folders tree', that shows and navigate through the filesystem. Clicking on a file showed by the tree, opens it in the right notebook, that holds text files. Clicking on a folder switches the current path to that folder. Clicking on the current folder name changes the current path to its parent folder.
Another type of tree common to appear is the project tree. Project is an 'abstract' tree, holding the names and locations of certain desired files. Those files are thus grouped and can be copied, tarballed and moved as a unique folder. Users can configure unique macros and shell scripts related to each project created. A project can be, for example, the development of a program or a scientific paper, or a lab report.

NOTEBOOK OF TEXTS
The right notebook holds tabs that are buffers to the contents of files. Café is a Text Editor, so all files-contents are treated as Text, in order to the user be able to edit them. You can work on as many tabs (opened files) as you want (or your memory resources allow). The navigation between the tabs can be made like in Firefox: Ctrl-PgUp navigates leftward, Ctrl-PgDn navigates rightward. If a file had its buffer modified, an asterisk will appear along with its name on its respective tab. Saving the file erases the asterisk.

NOTEBOOK OF MESSAGES
Message view is a viewport designed for messages that Café has to present the user. The commands for Copy/Cut/Paste works on this area.

Messages came from Macros and or Shell executions. FindInFiles command also, show its results into a Message Notebook tab.

STATUS BAR
The status bar has important information being constantly updated like the number of characters into the current file, the line and column numbers where the cursor currently is, the encoding and many more. Try selecting a range of text, and note that in the status bar the number of chars and word counting of this selection will be shown.

MULTI PROJECT

Café understands an extension of '.proj' to identify a 'project'. A Project is a group of files, macros and menus that are dinamically treated. If you open such a file with 'Open Project' menu item, Café will construct a new left-note page showing a tree with the project's file-hierarchy. If the project has the flag 'autoopen' set as TRUE, all the files listed will be automagically open.

Projects can have their own macros and their own menus. Those functions are all set inside the '.proj' file and is stored inside the project's folder.

As an example, suppose the development of a program, like Café. The 'cafe.proj' lists all the '.c' and '.h' source files, some macros specific to this project as the one that compiles the dialogs, and a new menu with commands for the compiler. When the project is closed, those macros and that menu are removed, turning Café to its initial state. This manner, the menu system is always neat and clean and gets never clobbered with features that are not all the time nor for all the projects needed.

Café can open and manage any number of projects, limited only by computer resources. All the files related to a specific project will have their tabs painted with the same color. This helps to identify files from one project to another.

ACCELERATOR KEYS

The list of keys and their actions is listed below. It is fully configurable.

keystrokes action
-------------- --------------------------------------------------------
ctrl a selects all the text from the current window
ctrl b init/term text block selections
ctrl shift b clear block selections/clear block buffer
ctrl c copies the selected text to clipboard
ctrl d dynamic insertions (a new keystroke) like (d)ate
ctrl e extra keyboard configuration
ctrl f opens the FIND dialog
ctrl g goto the next mark
ctrl shift g goto the previous mark
ctrl h cuts to a numbered buffer (0-9), (=) a visual aid
ctrl i insert another file´s content at the cursor position
ctrl j justify toggle between justify-left and justify-fill
ctrl shift j justify mode (0-3) (left,centered,right,fill)
ctrl k copies to a numbered buffer (0-9), (=) a visual aid
ctrl l goto line number
ctrl m inserts a generic mark on a line of text
ctrl shift m removes the mark from the line
ctrl n new file
ctrl o opens a file
ctrl p internet protocol handlers
ctrl q quits the editor
ctrl r opens the FIND & REPLACE dialog
ctrl s saves the current text buffer
ctrl t context-dependent tag (a new key), (=) a visual aid
ctrl u insert UTF-8 code
ctrl v pastes the clipboard to the selection or cursor position
ctrl w closes the current text buffer and note pad
ctrl x cuts the selection from the current window to clipboard
ctrl y pastes from a numbered buffer (0-9), (=) a visual aid
ctrl z undo the last action
ctrl shift z redo the last action
ctrl \ opens a connection session with a network socket (experimental)
ctrl ? column-formatted text: hook commands (experimental)
ctrl = extensions (experimental)
----------------------------------------------------------------------------
keys marked with an asterisk do not have their implementation yet.
----------------------------------------------------------------------------

tab increase indentation of selection
shift tab decrease indentation of selection
ctrl - selection to UPPER case
ctrl _ selection to LOWER case

ctrl home top of the text/tree
ctrl end bottom of the text/tree
ctrl PgDn navigate to the right notebook tab
ctrl PgUp navigate to the left notebook tab
ctrl > change the notebooks´ focus cycling clockwise
ctrl < change the notebooks´ focus cycling counterclockwise


RESERVED KEYS:

1 2 3 4 5 6 7 8 9 0
! @ # $ % ^ & * ( )

those keys above are reserved for the Window Manager operating on the X Server (currently the XFCE4).

EXTRA KEYBOARD CONFIGURATION

The keyboard can be configured to represent any set of UTF-8 characters directly ! For instance, it can be set up to reproduce LaTeX expanded accented-letters: an "á" will produce "\'a" on the text, or "á" if set up for HTML. So, you can write in Chinese, Thai, Hebrew, Japanese, Russian, etc directly from the keyboard, without consulting any table of characters (as long you know the sound or the corresponding letter-sequencing the specific characters represent).

There are five keyboard configurations available on the default installation: hiragana, katakana, pig-german (a joking configuration), HTML and LaTeX. To create new keyboard configurations, just edit a pure text document and put there your translations; the entry form is:

enumeration = symbol(s):letter;letter;... ;

symbol(s) is(are) the symbol(s) to appear on the editor. After the colon, could appear a letter or a sequence of letters separated by semicolons, that will cause the symbol(s) to be printed. There is no limit on the sequence size or in the symbols list size. For example, you can create a 'lame-greek' extra keyboard configuration with entries like these:

entry001 = Δ:\;D;e;l;t;a;
entry002 = Γ:\;G;a;m;m;a;
entry002 = Θ:\;T;h;e;t;a;
... etc

so, when you type '\Theta', the symbol Θ will appear. Just remember to save the configuration file inside ${CAFE_HOME}/keyboards/

The keyboard configurations are accessible through Ctrl-e-x where x can be:

Ctrl-e +

h = hiragana
k = katakana
l = latex
p = pig-german
s = sgml (html, xml, etc)
0 = normal keyboard

Ctrl-e-= invokes a visual aid.

As keys, only lower case letters, numbers and [ ._- ] (total: 39 entries)

DYNAMIC INSERTIONS

Synopsis: Ctrl d _ '_' is another key.

Dynamic Insertions are retrieved from the principal config file, section [dynamic]. Each entry is formed by a key in the range [a-zA-Z0-9]. That key points to a string that can be a regular static string (in the case that it will make no much sense since there are complex keystrokes available), or a dynamic one. All strings will pass through 'strftime', so any parametres from it will be evaluated. About that: all strings will be assembled by a 'sprintf', so any parametres for strftime must have double '%'.

Normal 'strftime' (man strftime) parametres can be part of the string. Up to 5 parametres are allowed and to separate them, use semicolons. They can be:

  • value of a key from a group of a keyfile config.
    for this use: @file,group,key,default
    example: @personal,name,user
    the engine will look for [persona]name=XXXX entry. If not found,
    will produce 'user' as default.

  • result of single shell command.
    for this use: &cmd,switches,default
    example: &

  • content of an environment variable
    for this use: $varname,default
    example $LOCALETC,/etc/
    will check the environmental variable '$LOCALETC', and if not
    found will produce '/etc/'

the default value will be used in case an error occurs, or the operation results into a null string. This default value is optional, and in its absence, a '?' symbol will be generated when need.

example:

c = "%%Y-%%m-%%d %s %s@%s";@cafe.conf,personal,name,user;@cafe.conf,personal,user,user;@cafe.conf,personal,host,host

 will produce:

2010-06-29 Hiperon hiperon@lepton

t = "%%Hh%%Mmin%%Ss"

 will produce:

10h23min11s

The configuration file for Dynamic Insertions is located on %DOMUS%dyninsertions.conf file. The following are some already programmed in it.

Accessible with Ctrl-d +

c = changelog style: YYYY-MM-DD hh:mm:ss Full Name email@host
d = full current local time: "Wednesday 20 August 2009 01:32:11"
h = julian hour: HHMMSS like: 132144
j = julian date: YYYYMMDD like: 20090812
l = like: Wed, 12 Jun 2010 - 13h21m44s
s = timestamp: YYYYMMDD-HHMMSS, like: 20090812-130133
t = current time: 130133 == 13h01mn33s

Ctrl-d-= invokes a visual aid.

see the documentation for 'strftime' for the codes of each parametre you want.

As keys, only lower case letters, numbers and [ ._- ] (total: 39 entries)

TEXT BLOCK OPERATIONS

Move the cursor to upper left corner of an arbitrary rectangle in the text, and press Ctrl-b. Move the cursor to the desired lower right corner and press again Ctrl-b. Once set, the block buffer will be used instead of the clipboard. So Ctrl-C will copy the block to the buffer. In order to erase the block marks, and return Copy/Cut/Paste operations as usual, press Ctrl-B (Ctrl-Shif-b). With a block set up, press Ctrl-V and the contents of the block buffer will dumped accordingly.

Example: on the picture below:

put the cursor on A, Ctrl-b, then move it to B, Ctrl-b, then Ctrl-c

A C
\|/ ()
`------(oo)
|| (
)
||w--|| \|/
\|/ B

Now, move the cursor to C (you might have to type some spaces), Ctrl-b, then
bring the cursor to the same line of B (or any position past the column
where C resides), and then Ctrl-v

A C
\|/ () \|/ ()
\------(oo)------(oo)
|| () || ()
||w--|| \|/ ||w--|| \|/
\|/ B \|/ B

voilá ! To return to the usual Ctrl-{c,v,x} behavior: Ctrl-B

COMPLEX KEY STROKES

ctrl t _ Inserts a Tag defined by the keystroke "_"

Complex keystrokes is not that complex. They are formed by a sequence of three keystrokes, Ctrl-t being the first two. The third keystroke determines, for each context, a possible string to be inserted at the current cursor position. The text to be inserted is determined by a ckeys configuration file. All ckeys files must reside on $CONFIGPATH/ckeys/ folder. Normally, $CONFIGPATH is set to "~/local/etc/cafe/" folder. The content of each configuration file is straight-forward and can be edited as needed or desired.

The ckeys files are assigned by extension and not by language. This mechanism enables different text-insertions for files using the same syntax (language) but logically set to have different file extensions. For example, using language C, we can develop applications using GTK+ libraries, other applications using XLib libraries, and yet other applications using OpenGL libraries. Naming all those source files having .c extension, limits the text-insertions for those only common to all those libraries, i.e., only the insertions relative to the language. If we rename our source files to have significant extensions, like .gtk, .xlib, and .ogl respectively, we will then enable different and rich text-insertions, while keeping the syntax-highlighting for the C language. More obvious examples are for HTML, using extensions like .xml, .shtml, .htm and so on.

Calling 'ctrl t =', a visual aid will appear if the [tags] section on the context file exists. This visual aid, will show the tag names given in that section, and when pressed will produce the respective insertions associated with that particular key.

To enable different extensions share the same syntax highlightin scheme, add them to the respective language, into the main configuration file (cafe.conf). An example contents:

HTML CONTEXT:

a =
b =
c =
d =
e =
f =
g =
h =

\n

i =
... etc

As keys, only lower case letters, numbers and [ ._- ] (total: 39 entries)

EXTENSIONS

Ctrl = key combination is a door to future user-extensible commands. The sequence will wait for another key, and that key can wait for another one and so on, extending the capacity of automating functions to a few key strokes. It´s clear however that too much keys in the sequence will make the command clumsy and difficult to remember, but still, wisely used can be very helpfull.

As a start, we put a 'new with template' command @ Ctrl = n: it will open a visual list to the user chooses what extension the file will have, and so the syntax highlighting and the complex keystrokes association, without having to save it and choose a name and place to put it first.

The idea behind Ctrl= commands is to use a scripting language to add sophisticate functionality to Café. It is expected that by the time the gamma version hit the roads, GAGA will be already in beta, so it will be associated with Café to create new commands. The interface is already being developed.

MACROS AND MENUS

MACRO:


Macros are a set of utilities engendered in such manner it is callable throughout a command line with parametres. The utilities called can be shell builtins or scripts or any other kind of executables. Macros have their own menu entries.

Each Macro configuration file can receive a project name, or a developer-file extension name, and stored at %ROOT%macros folder. When a project or a file with an extension with the same name is open, the respective macro configuration file is also loaded and the definitions and menus constructed. The new menus, if any, are kept, after the project or the file is closed. If one wants to clean the menubar, it can invoke the item 'Macros: Restore Menu Bar', when this option becomes available.

Macro IDs (will be stored as a group name on the configuration file) cannot have blanks. See examples below.

SHELL:


One can define also a set of command lines that are executed directly by the subjacent shell. A 'shell' is a simple command that will be stored on a list to later re-execution. The output is grabbed from the execution shell and displayed into the menu text widget, allowing it to be copied, or simply analyzed.

-> each macro must have its own [group] name, that consist of the word 'macro' followed by a number.
From version 0.7.0 or greater, the macro can have any [group] name other than 'base'.
spaces are not allowed in [group] and shell items names.

One can edit this file manually or via 'MacroMaker' form, on the 'Macros' item from the 'Tools' Menu.

Macro command line:

VARIABLES ONE CAN USE IN THE MACRO/SHELL DEFINITION:


%b current contents
%s current selection
%f current file name
%w current directory name folders are always '/' terminated
%t capture to selection
%a append capture
%c capture to curpos where capture goes from the execution.
%d julian date YYYYMMDD
%T current time HHMMSS
%e current file name extension (if any, otherwise null) ex: file.ext :: %e == ext
%p current file path ex: /home/user/folder/file.ext :: %p == /home/user/folder/
%B current file base name ex: file.ext :: %B == file
%u user name
%r[n] random number 'n' is optional and means number of digits. examples:
%r an integer with 3 digits (000-999) (default)
%r[3:a-z] a random sequence of three lower case letters (aaa-zzz)
%r[2:a,b,c] a random sequence of two digits only containing a, b or c (aa-cc)
%r[5:a-z,A-Z,0-9] a random sequence of five letters and numbers (00000-zzzzz)
%r[4:A-F,0-9] a random sequence of hexadecimal numbers with four digits (0000-FFFF)

CAPTURE MODES AVAILABLE:


capStdout = [false|true] if true 'stdout' will be redirected
to a new page.
if false will be redirected to msgview.

capStderr = [false|true] if true 'stderr' will be redirected to
the same page as 'stdout'.
if false will be redirected to msgview.

overwrite = [false|true] if false every time the macro runs, a
new page with the stdout is created.
if true the content of the page with
the result, will be overwritten.

SOME EXAMPLES:


[macro1]
brief = it converts a NTM markup to orkut markups
tooltip = converts the current file into orkut markups
capStdout = true
capStderr = true
overwrite = true
cmdline = anatema -i%f -ro
menu = _aNaTeMa:_orkut

[macro2]
brief = it converts a NTM markup to LaTeX markups
tooltip = converts the current file into LaTeX
capStdout = true
capStderr = true
overwrite = true
cmdline = anatema -i=%f -rt -Hscie -Sbook --export=%p%B-book-%r[5].%e
menu = _aNaTeMa:_LaTeX

[macro3]
brief = compiles the LaTeX file
tooltip = compiles a source file based on its extension
capStdout = false
capStderr = false
overwrite = false
cmdline = epc %f
menu = _Compile:_LaTeX

The configuration above, will add the menu aNaTeMa to the main menu bar (since it does not exist at boot up), and populate with the names of the macros. Note that macro 3 will create another menu, Compile, in the main menubar, with a submenu 'LaTeX'.

... default menu bar .../aNaTeMa
| |
| / aNaTeMa pro orkut
| |
| / aNaTeMa pro LaTeX
|
/ Compile
|
/ LaTeX

KEY BINDINGS

Almost all the keys that invoke functions on Café can be customized to the user´s likings. The exceptions are the keys bound also to fixed menus, like Ctrl-c (copy), Ctrl-v (paste), and Ctrl-x (cut). The configuration app, barista, have a whole section dedicated to customizing the key binds, that once modified are stored in the %CONFIGPATH%keybinds.conf.

As any other configuration in Café, it can be manually altered. Just pay attention to details and test your configuration before loading production work. Misconfigured configuration files cause unpredictable results, even uncatchable segmentation faults.

HOOK MODE EXPERIMENTAL

The hook symbol '?', (a.k.a question mark) with Ctrl, opens a new world of possibilities for your text file. Once activated the 'hook mode' (Ctrl-?) searches for TAB characters embedded on your file. Then it treat each one as a column separator and will expand its size until every column stay vertically aligned.

Also, the HookMode starts a syntax highlighting (.?) that colorsthe important aspects of the mode.

The first three lines of the file, that must be Hash-Commented, have special meaning:
1st is a line of hook commands. See below
2nd column names
3rd column unities

Integers numbers will be colored, and decimal numbers as well.
Hook-Commands will be tinted.

example: / first text column

  first line   -> #qtd\titem\tdescription\tvalue      
                  #\t-\t-\t€
                  2 soap   for bath    1.25
                  1 rice   1kg         2.
                  1 steak  250g        3.5
                  \t\t\t

this little piece of text garbage will transform under hookmode to:

          #qtd  item   description  value
          #-    -      -            €
           2    soap   for bath     1.25
           1    rice   1kg          2.oo
           1    steak  250g         3.5o
                                    6.75

\t is a language C abbreviation for a TAB (0x09) character.

If a file with the same name but with ".hook" extension exists, it will be read and interpreted as hook commands, one per line.

A hook command is composed of several parts, separated by colons. The first
upper case letter is the operation and the following items, if any, the operands.

The first operand must specify a destination, and it is a column name or cell. See below.

Currently, the hook commands available are:

Nn where 'N' is any number. Formats a number in this column
to fit in N digits. Example 3n Defines a field of 3 digits.

$:dest
$:dest:x.y where x and y are some digits like 12.3 ou 5.3. Formats the
the numbers in those columns to have 2 decimal places
(default) or the specification of the field digits (x) and decimal
places (y). example: $:D:8.3 Note that this specification follows the
C standard: 8 in this example is the field size, within will
accommodate the mantissa, the decimal point, the signal and the 3
decimal digits.

S:dest:name where dest is a cell´s name. It computes the sum of all
numbers listed on the that column 'name'. The format is
the same as that column. example S:C[9]:value will add all values of
the value´s column and put the result on C[9].

Q:dest:org where dest and org are column´s names. It computes the
square of each element in the column org and put it on dest.

D:dest:X
D:dest:name where dest and name are column´s names. Divides each
element in the column dest by value X, or by the
correspondent value in the column name. X can be a cell too, like B[18].

M:dest:X same as division above, but multiplies.

A:dest:X same as division above, but add.

B:dest:X same as division above, but subtract.

C:dest:org count how many data lines are in the column org.

K:dest:org copy column org to dest. K:L:B (copy column B to location L)

Single cell values can be accessed (to substitute X in the examples above) using the C array notation: single cell: column_name[row_number]. Thus value[7] for example, is the value of the 7th line on column 'value'. So, the command 'M:C:value[3]' will multiply every item on column 'C' (the third column if not named otherwise elsewhere), by the value of the single cell value[3].

After dest(iny) parametre, one can stack several others, like A:F:B:C:D
meaning that the correspondents cells in F (the destination) will be the current value of those cells (if any) plus the corresponding values of columns B, C, and D.
F[i] = F[i] + B[i] + C[i] + D[i]
where i indexes each line of data.

Other commands are being developed, but keep in mind that there is no intention to produce a competitive, in any way, spreadsheet. It is just an aid, for quick and practical log or report files.

By the time of this release, not all functionality is implemented. The manual will be updated to reflect the changes.

CONNECTIONS EXPERIMENTAL

Ctrl \ Activates a network connection interpreter. It scans the current line from its beginning, find some directives and makes a connection if the text acquired comply with the syntax. The command lines must begin with '>>' (greater greater) and the cursor must pose on any position of the line.

Those command lines are composed of pairs of key-values.

for example:

rhost=10.10.10.10;rport=80;

is the same as

remotehost=10.10.10.10;remoteport=80;

and same as

rh=10.10.10.10;rp=80;

and also

remote_host=10.10.10.10;remote_port=80;send=GET / HTTP/1.1\nHost=somemachine\nAccept: /

this command will establishes a network socket to the designated port of the designated remote host, and waits for its response.

If one prefers, you can call Ctrl \ = and a visual aid will appear. In the visual aid, there is a little text box where one can enter the commands.

further interactions are made just typing a line beginning with '>>' and pressing Ctrl \ again. Like a telnet session, but with a whole Text Editor as the Terminal.

The keywords for a connection Café recognizes are:

rh rhost remote_host client connects to
lh lhost local_host server´s machine
ru ruser remote_user client presents
lu luser local_user server presents
rp rport remote_port client connects to
lp lport local_port server listen to

PROTOCOLS EXPERIMENTAL

Protocols is feature of the gama release (version 0.8+) and allows one to use internet sofisticated protocol clients just resting the cursor on a well formed uri and pressing 'Ctrl p'.

Suppose for example that in the middle of a text, there is a uri directing for a site containing some kind of 'howto'. Just rest the cursor on any part of the URI and press Ctrl p. Café will (try to) capture the result of the resulting protocol implementation and post it below the URI.

for example:

.... and that is the case for the automation using Arduino {http://www.arduino.it/howto.html} like Leonardo, Uno, and Mega boards.

As the URI in the example is enclosed in curly braces, it will be opened into another notebook page. Otherwise, the captured page will be inserted below the current paragraph.

Currently, Café can handle the following protocols, using 3rd party tools:

. http (using w3m, elinks, links or lynx)
. ftp (using elinks, links, lynx, ncftp or ftp)
. gopher (using elinks, links or w3s)
. pop3 (using telnet)
. smtp (using telnet)
. dns (using telnet)

As version 0.77 releases, there is no consensus yet as the way Café will interact with the sessions. HTTP interaction is very easy as every interactable item is a URI per se. But all the others have no means giving any hint.

There are currently 4 ways to insert the navigation through the protocol´s result on a Café page:

URI == Uniform Resource Indicator

when pressed Ctrl p over the URI the result will be put:

URI or (URI) at sentence´s end.
[URI] at page´s end.
{URI} at a new notebook page
<URI> at a file in $LOCALDOC (the name came from the first line of text)

DEVELOPMENT

NOTE ABOUT EXPERIMENTAL FEATURES:
as being experimental, the behavior of those features can be modified depending on the release. Be aware of that.

send your sugestions to :

scientiaunix at gmail dot com

  or

hiperon at gmail dot com

  or visit the cafe development forum at

cafe dot sourceforge dot net
Posted by hiperon 2019-07-14

Log in to post a comment.