[CmdletBinding(SupportsShouldProcess)]param(
  [switch]$sudo,
  [Parameter(Position = 0, ValueFromPipelineByPropertyName, ValueFromPipeline, ValueFromRemainingArguments = $true)]
  [string[]]$Path
)

begin {
  $global:WaitForEditor = (($WaitForEditor, -1 -ne $null)[0], 5 -ne -1)[0]
  $PathForEditor = @()
}
process {
  foreach( $local:P in $Path ) {
    $PathForEditor += $P | Get-Path -Expand
  }
}

end {
  $local:editors = $env:EDITOR,'nvim','codium','code'
  $local:editor = $null
  foreach( $local:testEditor in $editors ) {
    if( $(try{Get-Command -ListImported -Type Application $testEditor -ErrorAction SilentlyContinue}catch{}) ) {
      $editor = "`"$testEditor`""
      break;
    }
  }
  
  if( $editor -match 'vim?"$' ) {
    $editor += ' -p'
  }
  
  if( $EditorProcessName ) {
    if( -not (Get-Process -Name $EditorProcessName -ErrorAction SilentlyContinue) ) {
      Invoke-ExpressionEx -sudo:$sudo "& $editor"
      while( -not (Get-Process -Name $EditorProcessName -ErrorAction SilentlyContinue) ) {
        Start-Sleep -Seconds 1
      }
      Write-Host -ForegroundColor DarkCyan "Please wait, initializing editor..."
      Start-Sleep -Seconds $WaitForEditor
      if( Test-Path variable:EditorWaitStopWatch ) {
        $EditorWaitStopWatch.Restart()
      }
    }
  }
  
  Write-Verbose $($Path | Out-String)
  
  $local:arguments = $PathForEditor | Foreach-Object { "'$_'" }
  if( $Path ) { $arguments = "$arguments" }
  
  if( $PSCmdlet.ShouldProcess( "Edit ($editor): $arguments" ) ) {
    Invoke-ExpressionEx -sudo:$sudo "& $editor $arguments"
  }
}