view src/os_vms_fix.com @ 33399:95db67c7b754 v9.0.1958

patch 9.0.1958: cannot complete option values Commit: https://github.com/vim/vim/commit/900894b09a95398dfc75599e9f0aa2ea25723384 Author: Yee Cheng Chin <ychin.git@gmail.com> Date: Fri Sep 29 20:42:32 2023 +0200 patch 9.0.1958: cannot complete option values Problem: cannot complete option values Solution: Add completion functions for several options Add cmdline tab-completion for setting string options Add tab-completion for setting string options on the cmdline using `:set=` (along with `:set+=` and `:set-=`). The existing tab completion for setting options currently only works when nothing is typed yet, and it only fills in with the existing value, e.g. when the user does `:set diffopt=<Tab>` it will be completed to `set diffopt=internal,filler,closeoff` and nothing else. This isn't too useful as a user usually wants auto-complete to suggest all the possible values, such as 'iblank', or 'algorithm:patience'. For set= and set+=, this adds a new optional callback function for each option that can be invoked when doing completion. This allows for each option to have control over how completion works. For example, in 'diffopt', it will suggest the default enumeration, but if `algorithm:` is selected, it will further suggest different algorithm types like 'meyers' and 'patience'. When using set=, the existing option value will be filled in as the first choice to preserve the existing behavior. When using set+= this won't happen as it doesn't make sense. For flag list options (e.g. 'mouse' and 'guioptions'), completion will take into account existing typed values (and in the case of set+=, the existing option value) to make sure it doesn't suggest duplicates. For set-=, there is a new `ExpandSettingSubtract` function which will handle flag list and comma-separated options smartly, by only suggesting values that currently exist in the option. Note that Vim has some existing code that adds special handling for 'filetype', 'syntax', and misc dir options like 'backupdir'. This change preserves them as they already work, instead of converting to the new callback API for each option. closes: #13182 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
author Christian Brabandt <cb@256bit.org>
date Fri, 29 Sep 2023 20:45:04 +0200
parents 6e4e0d43b20b
children
line wrap: on
line source

$!
$! OS_VMS_FIX.COM
$! Copyright (C) 2000, Stephen P. Wall
$!
$! Filter files for "#if" line continuations using a '\' and convert
$! them to use comments for the continuation.  Necessary for VAXC - it
$! doesn't understand the '\'.
$!
$! Yes, this is honkin' ugly code, but I deliberately avoided
$!     if ...
$!     then
$!	   ....
$!     endif
$! and call/subroutine/endsubroutine constructs, because I can still
$! remember when DCL didn't have them, and I wanted this to be as
$! portable as possible, so...  If you want to structure it nicer for
$! your own use, please feel free to do so.  However, please only
$! distribute it in its original form.
$!
$! I wrote it in DCL for portability and ease of use - a C version
$! would definitely run faster, but then I'd have to deal with compiler
$! differences, and users would have to deal with configuring and
$! building it.  With DCL, it runs out-of-the-box.
$!
$! Note that if you use this from a VMS system to modify files on a
$! mounted network drive, f$search() may return only the first matching
$! file when it tries to resolve wildcards.  I have been unable to find
$! a way around this.  Either copy the files to a local disk, or specify
$! each file individually (Keep in mind if you do this that VMS limits
$! you to eight parameters, so you'll only be able to filter eight files
$! at a time).
$!
$! Ideas...
$! - Use 'search filespec "#","if","\"/mat=and' to quickly eliminate
$!   files that definitely don't need filtering.  This should speed
$!   things up considerable.  Reading and writing every line from every
$!   file takes quite a bit of time...
$! - Error handling isn't great.  Come up with something better....
$!
$! E-mail addresses:
$! Steve Wall		hitched97@velnet.com
$! Zoltan Arpadffy      arpadffy@polarhome.com
$! John W. Hamill       jhamill3@ford.com
$!
$! Modification History:
$! 13Jul00 SWall	Initial Version
$! 14Jul00 ZArpadffy    Display usage
$! 06Mar01 JHamill      Ctrl-M problem fix
$!
$! If no parameters, or "-h" for a parameter, print usage and exit
$
$ all = "''p1'''p2'''p3'''p4'''p5'''p6'''p7'''p8'"
$ if (all .nes. "") .and. (p1 .nes. "-h") .and. (p1 .nes. "-H") then goto startup
$
$ write sys$output "OS_VMS_FIX - DECC->VAXC pre-processor directive convert script"
$ write sys$output "Usage: @OS_VMS_FIX <filename_1> <filename_2> <...>"
$ write sys$output "       @OS_VMS_FIX <filename with wildcard> <...>"
$ write sys$output ""
$ write sys$output "Example: @OS_VMS_FIX *.c *.h [.proto]*.pro"
$ write sys$output "Please note, you can define up to 8 parameters."
$ write sys$output ""
$ exit
$
$! Create an FDL file to convert VFC format files to Stream_LF.
$! VMS OPEN/WRITE command creates VFC files.  When VFC files are read
$! out under unix, they appear to have binary data embedded in them.
$! To be friendly, we'll convert them to Stream_LF, which reads just
$! file on unix.
$
$startup:
$ on control_y then goto stopfdl
$ open/write fdl []convert.fdl
$ write fdl "SYSTEM"
$ write fdl " SOURCE VAX/VMS"
$ write fdl "FILE"
$ write fdl " ORGANIZATION SEQUENTIAL"
$ write fdl "RECORD"
$ write fdl " BLOCK_SPAN YES"
$ write fdl " CARRIAGE_CONTROL CARRIAGE_RETURN"
$ write fdl " FORMAT STREAM"
$ write fdl " SIZE 0"
$ close fdl
$ on control_y then goto endparamloop
$
$! Some symbols for use later on...
$
$ spc = ""
$ spc[0,8] = 32
$ tab = ""
$ tab[0,8] = 9
$
$! Scan all positional arguments, do wildcard expansion, and call the
$! filter routine on each resulting filename.
$
$ cnt = 0
$paramloop:
$ cnt = cnt + 1
$
$! VMS only allows command line parameters P1 - P8, so stop after
$! processing 8 arguments.
$
$ if cnt .eq. 9 then goto endparamloop
$
$! Skip any empty parameter.
$
$ if P'cnt' .eqs. "" then goto paramloop
$
$! Got a parameter - do wildcard expansion.
$
$ arg = f$parse(P'cnt')
$ write sys$output "Parsing ''arg'..."
$ last = ""
$fileloop:
$ file = f$search(arg, 1)
$
$! f$search() returns "" after the last of multiple matches.
$
$ if file .eqs. "" then goto endfileloop
$
$! Strip the version number.
$
$ file = f$parse(file,,,"DEVICE") + f$parse(file,,,"DIRECTORY") + -
         f$parse(file,,,"NAME") + f$parse(file,,,"TYPE")
$
$! f$search() returns the same filename over and over if there are no
$! wildcards in it.
$
$ if file .eqs. last then goto endfileloop
$ last = file
$
$! Got a valid file - filter it.
$
$ gosub filter
$
$! Reset our error handling.
$
$ on control_y then goto endparamloop
$
$! See if there's another matching filename.
$
$ goto fileloop
$endfileloop:
$
$! Check for another parameter.
$
$ goto paramloop
$endparamloop:
$
$! Finished - delete the FDL file.
$
$ delete []convert.fdl;
$
$! So long, and thanks for all the fish...
$
$ exit
$
$
$! User aborted with Control-Y during creation of FDL file.
$! Close the file, delete it, and exit with an error status.
$
$stopfdl:
$ close fdl
$ delete []convert.fdl;
$ exit %X10000000
$
$
$! Filter a file.
$
$filter:
$ write sys$output "Filtering ''file'..."
$
$! Get a temporary filename from the subroutine parameter.
$
$ tmp = f$parse(file,,,"DEVICE") + f$parse(file,,,"DIRECTORY") + -
        "tmp_" + f$parse(file,,,"NAME") + f$parse(file,,,"TYPE")
$ on control_y then goto aborted
$ open /read input 'file'
$ open /write output 'tmp'
$ changed = 0
$readloop:
$ read/end_of_file=endreadloop/error=readlooperror input line
$
$! Get the first 3 non-blank character on the line.
$
$ start = f$extract(0,3,f$edit(line,"COLLAPSE,LOWERCASE"))
$
$! If the line doesn't start with some form of "#if", just write it to
$! the temp file.
$
$ if start .nes. "#if" then goto writeit
$chkbkslsh:
$
$! See if the line ends in a backslash.  If not, write it to the temp file.
$
$ if f$extract(f$length(line)-1,1,line) .nes. "\" then goto writeit
$
$! Ok, got a line that needs to be modified.  Mark this file as changed,
$! then replace the backslash at the end with the beginning of a comment
$! (/*), and write it to the temp file.
$
$ changed = 1
$ line = f$extract(0,f$length(line)-1,line) + "/*"
$ write/symbol output line
$
$! Get another line from the input.
$
$ read/end_of_file=endreadloop/error=readlooperror input line
$
$! Grab all the blank space from the beginning of the line.
$
$ spaces = ""
$spaceloop:
$ if (f$extract(0,1,line) .nes. spc) .and. (f$extract(0,1,line) .nes. tab) -
        then goto endspaceloop
$ spaces = spaces + f$extract(0,1,line)
$ line = f$extract(1,f$length(line)-1,line)
$ goto spaceloop
$endspaceloop:
$
$! Stick an end-comment (*/) after the leading blanks, then go back and
$! check for a trailing backslash again, to catch code that continues
$! across multiple lines.
$
$ line = spaces + "*/ " + line
$ goto chkbkslsh
$
$! Write the current line, (will either be an untouched line, or the
$! last line of a continuation) to the temp file, and go back to look
$! for more input.
$!
$writeit:
$ write/symbol output line
$ goto readloop
$
$! Hit EOF.  Close the input & output, and if the file was marked as
$! changed, convert it from VMS VFC format, to the more common Stream_LF
$! format, so it doesn't show up full of garbage if someone tries to
$! edit it on another OS.
$!
$endreadloop:
$ close input
$ close output
$ if changed .eq. 0 then goto nocopy
$ convert 'tmp' 'file' /fdl=[]convert.fdl
$nocopy:
$ delete 'tmp';
$
$! Exit this subroutine.
$
$ goto endfunc
$
$! Got a read error.  Say so, and trash the temp file.
$
$readlooperror:
$ write sys$error "Error processing file ''file'"
$ goto errorend
$
$! Got an interrupt.  Say so, and trash the temp file.
$
$aborted:
$ write sys$error "Aborted while processing file ''file'"
$
$! Common code for read errors and interrupts.
$
$errorend:
$ close input
$ close output
$ delete 'tmp';
$ return %X10000000
$
$! End of filter subroutine.
$
$endfunc:
$ return
$
$! EOF