PowerShell 自前の関数セット

## 概要
PowerShellをそこそこ上手く使うために、いろいろ書いた
既に秘伝のタレと化したりして、あんまり使わないものも存在する

これらのスクリプトは別ファイルで保存しており、別記事
[PowerShellの起動時に複数スクリプトを読み込ませる](https://qiita.com/customtea/items/15ef854eb7543009c2e9)
を利用してまとめて読み込んでいる（まあ分割するほど多いわけでも無いんだけど…）

## Aliases
```powershell
Set-Alias l ls
function ll { ls -lF }
function la { ls -AlF }
function lla { ls -la }

Set-Alias vi vim
Remove-Item alias:curl
Set-Alias curl curl.exe

Remove-Item alias:ls
Set-Alias ls lsd.exe
```
- lでもlsに（これはUbuntuとかはデフォルトの.bashrcにあったと思う）
- llやlaやllaもlsにオプションを与えて実行される（オプションを渡す場合はエイリアスではできない）
- viをvimに
- curlをInvoke-WebRequestからWindowsにひっそり存在するcurl.exeに差し替えたりしている。
- lsをlsd.exeに変えているが、PowerShellのGet-ChildItemの表示の悪さたるやという感じなので、Rust製のlsコマンドを利用している。（もともとLinuxユーザーとしては結構良い）

## MyFunctions
```powershell
function sudo( $Program, $Argument ){
    if( $Argument -eq $null ){
        Start-Process $Program -Verb runas
    }
    else{
        Start-Process $Program -Verb runas $Argument
    }
}

Remove-Item alias:cd
function cd( $Directory ){
	Push-Location . -StackName hist
	if( $Directory -eq $null ){
		Set-Location ~
	} else {
		if(Test-Path $Directory){
			Set-Location $Directory
		}
		else{
			echo "Not found '$Directory' directory"
		}
    }
}

function cd-(){
	Pop-Location -StackName hist
	Push-Location . -StackName hist
}

function open( $Directory ){
	if( $Directory -eq $null ){
		explorer .
	}
	else{
		if(Test-Path $Directory){
			explorer $Directory
		}
		else{
			echo "Not found '$Directory' directory"
		}
    }
}

function ls{
	param(
		[switch]$a,
		[switch]$l,
		[switch]$al,
		[switch]$la,
		$Directory
	)

	if($Directory -eq $null){
		$Directory = "."
	}

	if($al -Or $la){
		Get-ChildItem -force $Directory
	}elseif($a){
		cmd /C dir /D /A $directory
	}elseif($l){
		Get-ChildItem $Directory
	}else{
		cmd /C dir /D $directory
	}
}

function which( $Target ){
	cmd /C Where $Target
}

function su(){
    sudo powershell.exe
}

function touch( $Filename){
    if(Test-Path $Filename){
		(Get-Item $Filename).LastWriteTime = (Get-Date)
    }
    else{
		New-Item $Filename
    }
}
```
ファイル名がプログラミングの教科書テンプレみたいな名前だけど、実際自分で作った関数なので…
実装したのは

- sudoもどき
    - もどきなので、完璧ではないがsudoをつけたあとのプログラムは管理者権限で実行される。
    - あくまで「管理者権限で実行」を呼び出しているようなものなので、新しいウィンドウで新しいターミナル上で実行される。
    - とはいえそれほどターミナルで管理車権限がほしいときもあまりない
- cd改
    - 改というほど変わってはいない、`cd`単体で実行したときにホームディレクトリに戻って欲しいので作った。
    - 欲を言えば`cd -`でさっきまで居たディレクトリに戻りたい~~が面倒なので実装していない。~~ 実装した．Linuxのpushd/popdと同等の機能を使って，移動のたびにスタックへ格納している．厳密には一つだけ持つようにするべきだが，簡易実装のためしていない
- `cd -` もどき
    - 実装上`cd -`というのはうまくオプションとして認識されないので，スペースなしで`cd-`というコマンドにして，戻すようにしている．戻ると同時にカレントディレクトリをpushしているので，実用上は同じ
- openもどき
    - MacOSにある`open`もどき
    - もどきなのでファイルエクスプローラーを開く以外の能は無いが、実質クリックした挙動と同じなので、画像ファイルならビュワーが開いたりする。（URLは開かない）
- ls（lsdを使う前まで使ってた改良型）
    - lsdを使う前まで利用していた。
    - Get-ChildItemよりはsystem32の`dir`のほうがまだ見やすい程度のもの
    - 一応 l a la al のオプションに対応している。というか適当に対応させた。la と al に違いは無い
- which UNIX風味
    - 実体はsystem32のwhereを呼び出している。
    - PowerShellにも`where`というコマンドがあるが、全然違うものが実装されている。whereの中身はwhere-objectというコマンドレット、使い方はよく知らない。
- suもどき
    - 要するにsudoでpowershell呼び出したら、新しいウィンドウだけど管理者権限で使えるウィンドウだね、というだけのことである
- touch改
    - UNIX仕様のtouch
    - 正直ファイルのタイムスタンプ更新よりは、新規作成が目的なので必要無いがどうせならということで、タイムスタンプの更新機能もついている。その目的で使ったことはない

## utf16script
このスクリプトはutf16でエンコードしていないと動かない
（もともとファイルが分割されたのはこいつのせい）

```powershell
Set-Alias "ｐｙてょｎ" python
```
まあ、よくある日本語入力有効化したまんまだった事故に使えるぐらい。あまり意味はない


## 番外編

## Addons
```powershell
Set-PSReadLineKeyHandler -Key Tab -Function Complete
#Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete

Import-Module posh-git
Import-Module oh-my-posh
Set-PoshPrompt -Theme powerlevel10k_lean
#Set-PoshPrompt -Theme slim
```
- PSReadLine
    - PowerShellの補完機能が気に食わない人が多いと思われるが、その設定ができる
    - 上が、UNIX的な補完方法で複数選択肢があるところで止まる
    - 下が、zsh的？な補完方法で、選択肢が下に表示される

- oh-my-posh
    - Powerlineを表示するための外部プログラムのoh-my-poshを動作させる。
    - テーマはpowerlevel10k_leanというのを使っている。結構シンプル
- 全体的にロードが結構重い

使用するにはインストールが必要

``` powershell
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
Install-Module -Name PSReadLine -Scope CurrentUser -Force -SkipPublisherCheck
```

## googler
googlerというコマンドラインで検索できるアプリケーションを便利に使うためのラッパー

```powershell
function ggr(){
	$EXTENSIONS = @($args)
	python d:customtea/bin/googler.py -n3 --np $EXTENSIONS
}

function wiki(){
	$EXTENSIONS = @($args)
	python d:customtea/bin/googler.py -n3 -w "https://ja.wikipedia.org/" --np $EXTENSIONS
}

function googler(){
	$EXTENSIONS = @($args)
	python d:customtea/bin/googler.py $EXTENSIONS
}
```
- ggr
    - 結果を3行だけ表示
    - プロンプト無し
    - ちょっとググる用
- wiki
    - 結果を3行だけ表示
    - 検索先はWikipediaの日本語のみ
    - ウィキりたいたいときに使う
- googler
    - googlerを呼び出すだけ
    - googlerはpythonコードなので、頭にpythonとつけるのが嫌だったから作っただたのラッパー

これら3つのコマンドすべて、引数は一つの文字列に潰して平たくして渡している。