This repository has been archived by the owner on Oct 31, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
ecvimlib.ps1
executable file
·138 lines (108 loc) · 4.2 KB
/
ecvimlib.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# ecvimlib.ps1: Editorconfig Vimscript core CLI, PowerShell version,
# library routines.
# Copyright (c) 2018 Chris White. CC-BY-SA 3.0.
# N.B.: debug output uses Warning only because those are displayed by default.
#Requires -Version 3
# Get the directory of this script. From
# https://stackoverflow.com/a/5466355/2877364 by
# https://stackoverflow.com/users/23283/jaredpar
$global:DIR = $PSScriptRoot
### Set up debugging output ============================================
$global:debug=$env:EDITORCONFIG_DEBUG # Debug filename
if($global:debug -and ($global:debug -notmatch '^/')) {
# Relative to this script unless it starts with a slash. This is because
# cwd is usually not $DIR when testing.
$global:debug="${DIR}/${global:debug}"
}
### Process args =======================================================
function de64_args($argv) {
$argv | % {
$b64 = $_ -replace '-','=' -replace '_','/' -replace '\.','+'
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($b64))
}
}
### Helpers ============================================================
# Append a string to $debug in UTF-8 rather than the default UTF-16
filter global:D($file = $debug) {
if($debug) {
echo $_ | Out-File -FilePath $file -Encoding utf8 -Append
}
}
# Escape a string for Vim
function global:vesc($str) {
return "'" + ($str -replace "'","''") + "'"
}
# Escape a string for a command-line argument.
# See https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.arguments?view=netframework-4.7.2
function global:argesc($arg) {
return '"' + ($arg -replace '"','"""') + '"'
}
### Find the Vim EXE ===================================================
function global:Find-Vim
{
if($env:VIM_EXE) {
if($debug) { echo "Using env Vim $($env:VIM_EXE)" | D }
return $env:VIM_EXE
}
$vims = @(get-childitem 'c:\program files*\vim\**\vim.exe' | `
sort LastWriteTime -Descending) # @() => always array
# write-host ($vims | format-table | out-string) # DEBUG
# write-host ($vims | get-member | out-string)
if($vims.count -gt 0) {
if($debug) { echo "Using found Vim $($vims[0].FullName)" | D }
return $vims[0].FullName
}
throw "Could not find vim.exe. Please set VIM_EXE to the path to your Vim."
} #Find-Vim
### Runner =============================================================
# Run a process with the given arguments.
function global:run_process
{
param(
[Parameter(Mandatory=$true, Position=0)][string]$run,
[string]$extrapath,
[string]$stdout, # Redirect stdout to this file
[string]$stderr, # Redirect stderr to this file
[string[]]$argv # Arguments to $run
)
$si = new-object Diagnostics.ProcessStartInfo
if($extrapath) {
$si.EnvironmentVariables['path']+=";${extrapath}"
}
$si.FileName=$run
# Stringify the arguments (blech)
$argstr = $argv | % { (argesc $_) + ' ' }
$si.Arguments = $argstr;
if($debug) { echo "Running process $run with arguments >>$argstr<<" | D }
$si.UseShellExecute=$false
# DEBUG $si.RedirectStandardInput=$true
if($stdout) {
if($debug) { echo "Saving stdout to ${stdout}" | D }
$si.RedirectStandardOutput=$true;
}
if($stderr) {
if($debug) { echo "Saving stderr to ${stderr}" | D }
$si.RedirectStandardError=$true;
}
$p = [Diagnostics.Process]::Start($si)
# DEBUG $p.StandardInput.Close() # < /dev/null
$p.WaitForExit()
$retval = $p.ExitCode
if($stdout) {
echo "Standard output:" | D $stdout
$p.StandardOutput.ReadToEnd() | `
Out-File -FilePath $stdout -Encoding utf8 -Append
}
if($stderr) {
echo "Standard error:" | D $stderr
$p.StandardError.ReadToEnd() | `
Out-File -FilePath $stderr -Encoding utf8 -Append
}
$p.Close()
return $retval
}
if($debug) {
echo "======================================================" | D
Get-Date -format F | D
}
$global:VIM = Find-Vim