Hello Chris,

thank you for this master piece. The line editing in GNU APL is a bit
cumbersome.

But the apl session gets blocked during editing (edif2).

Currently I have no clue, how to analyze it.

Thank you again.

Hans-Peter


Am 30.07.2018 um 20:52 schrieb Chris Moller:
>
> Thanks, Jürgen.
>
> And for anyone interested, my editor interface native function is
> available at https://github.com/ChrisMoller/edif.git
>
> Basically, what it does is allow users to invoke external editors from
> within APL sessions, i.e., while running APL, you can edit functions
> using vi, emacs, gvim, nano, and probably other editors (those are the
> ones I've tested) and when the function is saved it will fixed in
> APL.  Two versions are included, libedif and libedif2, the former,
> which I usually ⎕fx as 'edif', runs in the APL process and defaults to
> opening the function in vi.  libedif2, which I usually ⎕fx as 'edif2',
> spawns separate processes for the editors (defaulting to emacs) it
> opens, allowing the user to go on using APL while the editor is
> open--including testing saved functions real-time without having to
> close the editor--and allowing any number of edit windows to be open
> simultaneously on different functions. 
>
> Feedback welcome, and here's the README:
>
>
>
>
>
> edif is a GNU APL native function that allows the use of external editors
> from within an APL session.
>
> Usage:
>
>     edif 'function_name'
>     or
>     edif2 'function_name'
>
> Both of these will open an editor, typically vi or emacs, containing the
> present definition of the specified function, or, if the function doesn't
> exist, a boilerplate function header consisting of the function name.
> After saving the edited definition and exiting the editor, the function
> will appear in the APL workspace..  (In the case of a new function, the
> boilerplate name can be edited as necessary:
>
>     fubar
>
> can be edited to
>
>     z←x fubar y
>
> and the right thing will be fixed in APL.  (Even existing functions can be
> modified this way.))
>
> The two versions of the function differ in that the first version, edif,
> suspends the current APL session until the editor is closed, while the
> second version, edif2, opens the editor in a separate process, in a
> separate window, while the APL session remains active.  This allows
> functions to be edited and tested concurrently without having to go
> into and out of the editor.  edif2 also allows multiple editor windows
> to be open simultaneously on different functions.
>
> Both versions have a dyadic form:
>
>     'editor' edif 'function_name'
>     or
>     'editor' edif2 'function_name'
>
> where 'editor' is the editor to be invoked.  For example:
>
>     'vi' edif 'fubar'
>
> would open function fubar using the vi editor.
>
>     'emacs' edif2 'fu'
>     'emacs' edif2 'bar'
>
> would open functions fu and bar in separate emacs windows.
>
> edif will look for the environment variable EDIF and will use the string
> specified by that variable as the command line to invoke the chosen
> editor.
> For example:
>
>    export EDIF="nano"
>
> will cause edif to default to using the nano editor.  Similarly, the EDIF2
> variable affects the default edif2 editor.
>
> edif has been tested with emacs, vi, and nano; edif2 with emacs and gvim.
> The default editor for edif is vi; the default for edif2 is
>
>    "emacs --geometry=40x20  -background '#ffffcc' -font 'DejaVu Sans
> Mono-10'"
>
> The dyadic form is a one-shot thing--edif doesn't remember editors
> specified this way and the monadic form will go back to using the
> default or environment-specified editor.
>
> edif may be included in the workspace with:
>
>     'libedif.so' ⎕fx 'edif'
>    
> and edif2 with:
>
>     'libedif2.so' ⎕fx 'edif2'
>
> Of course, you can use any function names you like and, as long as you use
> different names, both versions can be used at the same time.
>
> So far as I can tell, edif doesn't interfere with Elias Mårtenson's
> emacs APL mode, but I haven't thoroughly tested that.
>
> By the way, "edif" is short for "editor interface."
>
>
>
> Implimentation note:
>
> edif and edif2 work by storing an editable version of the specified
> function in:
>
> /var/run/user/<uid>/<pid>/<name>.apl 
>
> where <uid> is the user's userid, <pid> is the process id of the APL
> session, and <name> is the function name.  This allows multiple users
> each to have multiple simultaneous APL sessions with workspaces with
> identical names.  No locking is done by edif and I've no idea if APL
> itself has any protection against a writable workspace being open in
> multiple simultaneous sessions, but it opens up the possibility that
> you can hose the workspace.  So while, as far as edif is concerned
> you can have multiple simultaneous sessions aimed at the same lib0
> workspace, you probably shouldn't do it.
>
> Also, I've no idea if Windows or any Linux distribution other than
> Fedora has a /var directory, so using this directory may be non-portable.
>
>
>
> On 30/07/18 10:52, Juergen Sauermann wrote:
>> Hi Chris,
>>
>> thanks, done in *SVN 1060*.
>>
>> /// Jürgen
>>
>>
>> On 07/30/2018 03:59 PM, Chris Moller wrote:
>>>
>>> Here's an even simpler, more direct, patch:
>>>
>>>     Index: LineInput.cc
>>>     ===================================================================
>>>     --- LineInput.cc        (revision 1054)
>>>     +++ LineInput.cc        (working copy)
>>>     @@ -966,6 +966,11 @@
>>>      const int b0 = fgetc(stdin);
>>>         if (b0 == EOF)
>>>            {
>>>     +       if (errno == EINTR) {
>>>     +         clearerr (stdin);
>>>     +         CIN.unsetf( std::ios_base::unitbuf );
>>>     +         goto again;
>>>     +       }
>>>             if (got_WINCH)
>>>                {
>>>                  got_WINCH = false;
>>>
>>>
>

Reply via email to