read:コマンドを使う
Vimにはカレントバッファにファイルを読み込むread:
コマンドがあります。これと外部コマンド実行の!
を組み合わせてシェルの実行結果をVimに取り込みます。
たとえばファイルのリスト出力を取り込みたければexコマンドで
:read: !gci
と入力してやると
シェルがコード 1 で終了しました
続けるにはENTERを押すかコマンドを入力してください
あれ?ENTER押してみるか。
1
2 'gci' は、内部コマンドまたは外部コマンド、
3 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
...(´Д` )
shellを指定しよう
うちで使ってるWindows版Vimは香り屋さんとこのものなんですが、デフォルトのシェル指定がcmd.exeです。
:set shell
shell=C:\WINDOWS\system32\cmd.exe
Windowsに標準搭載されて久しいのに、いまだにメジャーになりきれていないPowerShell。
:set shell=powershell
:read !gci
シェルを切り替えることで
1
2
3
4 ディレクトリ: C:\Users\home
5
6
7 Mode LastWriteTime Length Name
8 ---- ------------- ------ ----
9 d-r--- 2015/09/18 21:41 3D Objects
10 d----- 2015/11/03 18:11 chkopt
11 d-r--- 2015/11/19 21:15 Contacts
12 d-r--- 2015/07/10 20:04 Desktop
13 d-r--- 2015/11/14 19:49 Documents
14 d-r--- 2015/11/14 19:49 Downloads
15 d-r--- 2015/11/19 21:15 Favorites
16 d-r--- 2015/11/19 21:15 Links
でた。面倒なので_vimrcにset shell=powershell
を書いておきましょう。
Write-Hostがリダイレクトされない
もともとこれをやりたかった理由が、シェルスクリプトの実行結果を取り込めるといいなと思ったからなんですが、標準コマンドレットの出力は取り込めるもののWrite-Host
の出力は取り込めませんでした。
Write-Output
で出力したものは取り込めます。
Write-Host
とWrite-Output
の違いは、前者が標準出力限定に対して後者はデフォルトが標準出力。Vimの:read
機能はおそらく画面出力をリダイレクトして出力結果を持ってきているんでしょうね。リダイレクト不可能な出力は取り込めないんでしょう。
装飾不要な出力はWrite-Output
を使うようにするしかないのかなぁ。
ということでちょっと中途半端な結果になってしまいました。PowerShellの仕様だからこれ以上は無理かな。