# encoding: ascii
# api: powershell
# title: ISE-Lines
# description: ISE-Lines module v 1.2
# version: 1.2
# type: module
# author: Scott Hardwick
# license: CC0
# function: Duplicate-Line
# x-poshcode-id: 5811
# x-archived: 2015-04-03T06:27:26
# x-published: 2015-04-02T03:57:00
#
# Updated for PowerShell 2.0 RTM
# Original authors Poetter & Kriszio
# Provides Line cmdlets for working with ISE
# Duplicate-Line – Duplicates current line
# Conflate-Line – Conflates current and next line
# MoveUp-Line – Moves current line up
# MoveDown-Line – Moves current line down
# Delete-TrailingBlanks – Deletes trailing blanks in the whole script
# Delete-BlankLines – Remove blank lines from the selected text
#
#requires -version 2.0
## ISE-Lines module v 1.2
##############################################################################################################
## Provides Line cmdlets for working with ISE
## Duplicate-Line - Duplicates current line
## Conflate-Line - Conflates current and next line
## MoveUp-Line - Moves current line up
## MoveDown-Line - Moves current line down
## Delete-TrailingBlanks - Deletes trailing blanks in the whole script
##
## Usage within ISE or Microsoft.PowershellISE_profile.ps1:
## Import-Module ISE-Lines.psm1
##
##############################################################################################################
## History:
## 1.2 - Minor alterations to work with PowerShell 2.0 RTM and Documentation updates (Hardwick)
## Include Delete-BlankLines function (author Kriszio I believe)
## 1.1 - Bugfix and remove line continuation character while joining for Conflate-Line function (Kriszio)
## 1.0 - Initial release (Poetter)
##############################################################################################################
## Duplicate-Line
##############################################################################################################
## Duplicates current line
##############################################################################################################
function Duplicate-Line
{
$editor = $psISE.CurrentFile.Editor
$caretLine = $editor.CaretLine
$caretColumn = $editor.CaretColumn
$text = $editor.Text.Split("`n")
$line = $text[$caretLine -1]
$newText = $text[0..($caretLine -1)]
$newText += $line
$newText += $text[$caretLine..($text.Count -1)]
$editor.Text = [String]::Join("`n", $newText)
$editor.SetCaretPosition($caretLine, $caretColumn)
}
## Conflate-Line
##############################################################################################################
## Conflates current and next line
## v 1.1 fixed bug on last but one line and remove line continuation character while joining
##############################################################################################################
function Conflate-Line
{
$editor = $psISE.CurrentFile.Editor
$caretLine = $editor.CaretLine
$caretColumn = $editor.CaretColumn
$text = $editor.Text.Split("`n")
if ( $caretLine -ne $text.Count )
{
$line = $text[$caretLine -1] + $text[$caretLine] -replace ("(``)?`r", "")
$newText = @()
if ( $caretLine -gt 1 )
{
$newText = $text[0..($caretLine -2)]
}
$newText += $line
if ( $caretLine -ne $text.Count - 1)
{
$newText += $text[($caretLine +1)..($text.Count -1)]
}
$editor.Text = [String]::Join("`n", $newText)
$editor.SetCaretPosition($caretLine, $caretColumn)
}
}
## MoveUp-Line
##############################################################################################################
## Moves current line up
##############################################################################################################
function MoveUp-Line
{
$editor = $psISE.CurrentFile.Editor
$caretLine = $editor.CaretLine
if ( $caretLine -ne 1 )
{
$caretColumn = $editor.CaretColumn
$text = $editor.Text.Split("`n")
$line = $text[$caretLine -1]
$lineBefore = $text[$caretLine -2]
$newText = @()
if ( $caretLine -gt 2 )
{
$newText = $text[0..($caretLine -3)]
}
$newText += $line
$newText += $lineBefore
if ( $caretLine -ne $text.Count )
{
$newText += $text[$caretLine..($text.Count -1)]
}
$editor.Text = [String]::Join("`n", $newText)
$editor.SetCaretPosition($caretLine - 1, $caretColumn)
}
}
## MoveDown-Line
##############################################################################################################
## Moves current line down
##############################################################################################################
function MoveDown-Line
{
$editor = $psISE.CurrentFile.Editor
$caretLine = $editor.CaretLine
$caretColumn = $editor.CaretColumn
$text = $editor.Text.Split("`n")
if ( $caretLine -ne $text.Count )
{
$line = $text[$caretLine -1]
$lineAfter = $text[$caretLine]
$newText = @()
if ( $caretLine -ne 1 )
{
$newText = $text[0..($caretLine -2)]
}
$newText += $lineAfter
$newText += $line
if ( $caretLine -lt $text.Count -1 )
{
$newText += $text[($caretLine +1)..($text.Count -1)]
}
$editor.Text = [String]::Join("`n", $newText)
$editor.SetCaretPosition($caretLine +1, $caretColumn)
}
}
## Delete-TrailingBlanks
##############################################################################################################
## Deletes trailing blanks in the whole script
##############################################################################################################
function Delete-TrailingBlanks
{
$editor = $psISE.CurrentFile.Editor
$caretLine = $editor.CaretLine
$newText = @()
foreach ( $line in $editor.Text.Split("`n") )
{
$newText += $line -replace ("\s+$", "")
}
$editor.Text = [String]::Join("`n", $newText)
$editor.SetCaretPosition($caretLine, 1)
}
## Delete-BlankLines
##############################################################################################################
## Deletes blank lines from the selected text
##############################################################################################################
function Delete-BlankLines
{
# Code from the ISECream Archive (http://psisecream.codeplex.com/), originally named Remove-IseEmptyLines
# Todo it would be nice to keep the caretposition, but I found no easy way
# of course you can split the string into an array of lines
$editor = $psISE.CurrentFile.Editor
#$caretLine = $editor.CaretLine
if ($editor.SelectedText)
{
Write-Host 'selected'
$editor.InsertText(($editor.SelectedText -replace '(?m)\s*$', ''))
}
else
{
$editor.Text = $editor.Text -replace '(?m)\s*$', ''
}
$editor.SetCaretPosition(1, 1)
}
##############################################################################################################
## Inserts a submenu Lines to ISE's Custum Menu
## Inserts command Duplicate Line to submenu Lines
## Inserts command Conflate Line Selected to submenu Lines
## Inserts command Move Up Line to submenu Lines
## Inserts command Move Down Line to submenu Lines
## Inserts command Delete Trailing Blanks to submenu Lines
## Inserts command Delete Blank Lines to submenu Lines
##############################################################################################################
if (-not( $psISE.CurrentPowerShellTab.AddOnsMenu.Submenus | where { $_.DisplayName -eq "Lines" } ) )
{
$linesMenu = $psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("_Lines",$null,$null)
$null = $linesMenu.Submenus.Add("Duplicate Line", {Duplicate-Line}, "Ctrl+Alt+D")
$null = $linesMenu.Submenus.Add("Conflate Line", {Conflate-Line}, "Ctrl+Alt+J")
$null = $linesMenu.Submenus.Add("Move Up Line", {MoveUp-Line}, "Ctrl+Shift+Up")
$null = $linesMenu.Submenus.Add("Move Down Line", {MoveDown-Line}, "Ctrl+Shift+Down")
$null = $linesMenu.Submenus.Add("Delete Trailing Blanks", {Delete-TrailingBlanks}, "Ctrl+Shift+Del")
$null = $linesMenu.Submenus.Add("Delete Blank Lines", {Delete-BlankLines}, "Ctrl+Shift+End")
}
# If you are using IsePack (http://code.msdn.microsoft.com/PowerShellPack) and IseCream (http://psisecream.codeplex.com/),
# you can use this code to add your menu items. The added benefits are that you can specify the order of the menu items and
# if the shortcut already exists it will add the menu item without the shortcut instead of failing as the default does.
# Add-IseMenu -Name "Lines" @{
# "Duplicate Line" = {Duplicate-Line}| Add-Member NoteProperty order 1 -PassThru | Add-Member NoteProperty ShortcutKey "Ctrl+Alt+D" -PassThru
# "Conflate Line" = {Conflate-Line}| Add-Member NoteProperty order 2 -PassThru | Add-Member NoteProperty ShortcutKey "Ctrl+Alt+J" -PassThru
# "Move Up Line" = {MoveUp-Line}| Add-Member NoteProperty order 3 -PassThru | Add-Member NoteProperty ShortcutKey "Ctrl+Shift+Up" -PassThru
# "Move Down Line" = {MoveDown-Line}| Add-Member NoteProperty order 4 -PassThru | Add-Member NoteProperty ShortcutKey "Ctrl+Shift+Down" -PassThru
# "Delete Trailing Blanks" = {Delete-TrailingBlanks}| Add-Member NoteProperty order 5 -PassThru | Add-Member NoteProperty ShortcutKey "Ctrl+Shift+Del" -PassThru
# "Delete Blank Lines" = {Delete-BlankLines} | Add-Member NoteProperty order 6 -PassThru | Add-Member NoteProperty ShortcutKey "Ctrl+Shift+End" -PassThru
# }