質問するログイン新規登録

回答編集履歴

2

編集

2019/03/06 10:51

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -19,12 +19,11 @@
19
19
  $matchBackup = $Matches
20
20
  try {
21
21
  if ($lastBlock -match '(^[)(.*)') {
22
- $newTypes = [AppDomain]::CurrentDomain.GetAssemblies() | Foreach-Object {
22
+ [AppDomain]::CurrentDomain.GetAssemblies() | Foreach-Object {
23
23
  $_.GetTypes()
24
24
  } | Where-Object {
25
25
  ($_.Name -notlike '*_<staticHelpers>') -and ($_.FullName -ilike "*$($Matches[2])*")
26
- }
27
- $newTypes | ForEach-Object {
26
+ } | ForEach-Object {
28
27
  '[' + $_.FullName + ']'
29
28
  }
30
29
  }

1

追記

2019/03/06 10:51

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -3,4 +3,33 @@
3
3
 
4
4
  補完の件ですが、ISE のエディタでも TabExpansion が使われていることを確認しました。function:\TabExpansion を書き換えれば補完の挙動を変えられますので、それでクラス名を補完するのが現実的だと思います。
5
5
 
6
- 現在使用可能なクラスは `[AppDomain]::CurrentDomain.GetAssemblies()|%{$_.GetTypes()}` で得ることができますが、補完のたびにこれを呼び出すのもパフォーマンスが落ちるでしょう。例えば指定したキーワードがコマンドラインにあった場合に読み直すようにするのはどうでしょうか?
6
+ 現在使用可能なクラスは `[AppDomain]::CurrentDomain.GetAssemblies()|%{$_.GetTypes()}` で得ることができますが、補完のたびにこれを呼び出すのもパフォーマンスが落ちるでしょう。例えば指定したキーワードがコマンドラインにあった場合に読み直すようにするのはどうでしょうか?
7
+
8
+ # 追記
9
+
10
+ 以下のスクリプトを実行することで、外部モジュールで作られたクラスが補完できることを確認しました。
11
+ なお、新クラスのアセンブリ名が `PowerShell Class Assembly` となるのは PowerShell Core の場合で、それ以前のバージョンの場合は `/powershell` のようでした。
12
+
13
+ ```
14
+ function TabExpansion
15
+ {
16
+ param($line, $lastWord)
17
+
18
+ $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart()
19
+ $matchBackup = $Matches
20
+ try {
21
+ if ($lastBlock -match '(^[)(.*)') {
22
+ $newTypes = [AppDomain]::CurrentDomain.GetAssemblies() | Foreach-Object {
23
+ $_.GetTypes()
24
+ } | Where-Object {
25
+ ($_.Name -notlike '*_<staticHelpers>') -and ($_.FullName -ilike "*$($Matches[2])*")
26
+ }
27
+ $newTypes | ForEach-Object {
28
+ '[' + $_.FullName + ']'
29
+ }
30
+ }
31
+ } finally {
32
+ $Matches = $matchBackup
33
+ }
34
+ }
35
+ ```