mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 02:10:05 +08:00
141 lines
4.3 KiB
PowerShell
141 lines
4.3 KiB
PowerShell
# ecvimlib.ps1: Editorconfig Vimscript core CLI, PowerShell version,
|
|
# library routines.
|
|
# Copyright (c) 2018--2019 Chris White. All rights reserved.
|
|
# Licensed CC-BY-SA, version 3.0 or any later version, at your option.
|
|
#
|
|
# 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
|