PSReadlineすげぇ

https://github.com/lzybkr/PSReadLine
すげぇ

PowerShell5.0だと最初から入ってる
それ以前なら PowerShellGet 導入してそっから入れてね、ですって

PowerShell5.0でカラフルになってたのはこいつのおかげらしい
あとこれ入ってるとなんか history の保存・復元を自前でやらんでいい感じがする
大変ありがたい

いろいろ便利なキーボードショートカットがあってやばい
Ctrl+Spaceで補完候補出すやつとかやばい

Ctrl+Spaceで補完候補出す

どんなショートカットがあるかは

Get-PSReadlineKeyHandler

でわかるよ

あとね、じぶんで割り当ての変更を好きなようにできるし
なんと自分で機能を作ることもできちゃうっぽい

Set-PSReadlineKeyHandler

を使う
Readmeにリンクされてる$PROFILEのサンプルで実際にどんな感じにするのかわかる
サンプル自体もかなり有用そうなのが多くてドキドキフワフワする

とりあえずカーソル位置の単語にクォートをかぶせてくれる(または取り除く)やつ
それとなんもないとこでクォートのキー打ったらクォートを2つ入力してその間をフォーカスするやつ
このふたつをパクってくっつけて Alt+'Alt+" でいい感じに動くようにした
なかなかゴキゲンだ
日本語キーボードじゃないとダメになってる気がするけどだいじょうぶぼくはこまらない

Set-PSReadlineKeyHandler -Key "Alt+'", 'Alt+"' `
                         -BriefDescription ToggleQuoteArgument `
                         -LongDescription "単語をクォートで括るまたはクォートを取り除く" `
                         -ScriptBlock {
    param($key, $arg)

    $Quote = switch ($key.Key)
    {
        D2 {'"'}
        D7 {"'"}
        default {return}
    }

    $ast    = $null
    $tokens = $null
    $errors = $null
    $cursor = $null
    [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$ast, [ref]$tokens, [ref]$errors, [ref]$cursor)

    $tokenToChange = $null
    foreach ($token in $tokens)
    {
        $extent = $token.Extent
        if ($extent.StartOffset -le $cursor -and $extent.EndOffset -ge $cursor)
        {
            $tokenToChange = $token

            # If the cursor is at the end (it's really 1 past the end) of the previous token,
            # we only want to change the previous token if there is no token under the cursor
            if ($extent.EndOffset -eq $cursor -and $foreach.MoveNext())
            {
                $nextToken = $foreach.Current
                if ($nextToken.Extent.StartOffset -eq $cursor)
                {
                    $tokenToChange = $nextToken
                }
            }
            break
        }
    }

    if ($tokenToChange -ne $null)
    {
        $extent = $tokenToChange.Extent
        $tokenText = $extent.Text
        if ($tokenText[0] -eq $Quote -and $tokenText[-1] -eq $Quote)
        {
            # Switch to no quotes
            $replacement = $tokenText.Substring(1, $tokenText.Length - 2)
        }
        else
        {
            # Add single quotes
            $replacement = $Quote + $tokenText + $Quote
        }

        [Microsoft.PowerShell.PSConsoleReadLine]::Replace(
            $extent.StartOffset,
            $tokenText.Length,
            $replacement)
    }
    else
    {
        $line   = $null
        $cursor = $null
        [Microsoft.PowerShell.PSConsoleReadLine]::Insert($Quote * 2)
        [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref] $line, [ref] $cursor)
        [Microsoft.PowerShell.PSConsoleReadLine]::SetCursorPosition($cursor - 1)
    }
}

細かいとこちゃんと理解してるわけじゃないので今後ちょいちょい勉強していこう
つまり [Microsoft.PowerShell.PSConsoleReadLine] ちゃんがキモなんだろう
これ使えばタブ補完だって好きにできちゃうんだぜ!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中