dps-ahdr plugin with Denops (Deno)
Deno で vim plugin が書ける、 vim-denops/denops.vim っていうすごい plugin があるのです。 せっかくなので、これを使って plugin 作ってみました。
作った plugin は、 現在のバッファにヘッダーを追加するやつ。
Denops Add Header -> dps-ahdr
インストールは dein.vim だとこんな感じ。
- dein.toml
[[plugins]] repo = 'vim-denops/denops.vim' [[plugins]] repo = 'yukimemi/dps-ahdr' hook_add = ''' " let g:ahdr_debug = v:true " let g:ahdr_cfg_path = "~/.ahdr_my_settings.toml" '''
依存として、 denops.vim が必要。(もちろん Deno も。)
どんなときに使うかというと、例えば、 PowerShell
を書いていて、このスクリプトすぐ実行できる実行形式にしたい!ってときに使えます。
- hello.ps1
Write-Host "Hello world !"
こんな hello.ps1
ファイルを作成しても、なぜか ps1
ファイルはダブルクリックしてもメモ帳が開くだけ・・・。
そこで、 vim / neovim でこの hello.ps1 を開いているときに以下コマンドを実行すると・・・。
:DenopsAhdr default
こんなファイルが出来上がり、ダブルクリックで実行できるようになります。
- hello.cmd
@set __SCRIPTPATH=%~f0&@powershell -NoProfile -ExecutionPolicy ByPass -InputFormat None "$s=[scriptblock]::create((gc -enc utf8 -li \"%~f0\"|?{$_.readcount -gt 2})-join\"`n\");&$s" %* @exit /b %errorlevel% Write-Host "Hello world !"
他にも・・・。
- regadd.bat
reg add HKLM\Environment /v myvar /t reg_sz /d "Hello!"
というバッチ実行したくても、そのままじゃ管理者権限なく実行できない!!
そこで・・・
:DenopsAhdr admin
とすると、こんなファイルができあがり、ダブルクリックで UAC 昇格実行できる。
- regadd_a.bat
@openfiles > nul 2>&1
@if %errorlevel% equ 0 goto :ALREADY_ADMIN_PRIVILEGE
@powershell.exe -Command Start-Process '%~f0' %* -verb runas
@exit /b %errorlevel%
:ALREADY_ADMIN_PRIVILEGE
reg add HKLM\Environment /v myvar /t reg_sz /d "Hello!"
これらのヘッダー追加定義は toml で設定してあり、デフォルトの定義は現状以下の設定になっている。
[[ps1]] name = "default" prefix = "" suffix = "" ext = ".cmd" header = ''' @set __SCRIPTPATH=%~f0&@powershell -NoProfile -ExecutionPolicy ByPass -InputFormat None "$s=[scriptblock]::create((gc -enc utf8 -li \\"%~f0\\"|?{$_.readcount -gt 2})-join\\"`n\\");&$s" %* @exit /b %errorlevel% ''' [[ps1]] name = "pause" prefix = "" suffix = "_p" ext = ".cmd" header = ''' @set __SCRIPTPATH=%~f0&@powershell -NoProfile -ExecutionPolicy ByPass -InputFormat None "$s=[scriptblock]::create((gc -enc utf8 -li \\"%~f0\\"|?{$_.readcount -gt 2})-join\\"`n\\");&$s" %*&@pause @exit /b %errorlevel% ''' [[ps1]] name = "wait" prefix = "" suffix = "_w" ext = ".cmd" header = ''' @set __SCRIPTPATH=%~f0&@powershell -NoProfile -ExecutionPolicy ByPass -InputFormat None "$s=[scriptblock]::create((gc -enc utf8 -li \\"%~f0\\"|?{$_.readcount -gt 2})-join\\"`n\\");&$s" %*&@ping -n 30 localhost > nul @exit /b %errorlevel% ''' [[javascript]] name = "default" prefix = "" suffix = "" ext = ".cmd" header = ''' @set @junk=1 /* @cscript //nologo //e:jscript "%~f0" %* @exit /b %errorlevel% */ ''' [[javascript]] name = "pause" prefix = "" suffix = "_p" ext = ".cmd" header = ''' @set @junk=1 /* @cscript //nologo //e:jscript "%~f0" %* @pause @exit /b %errorlevel% */ ''' [[javascript]] name = "wait" prefix = "" suffix = "_w" ext = ".cmd" header = ''' @set @junk=1 /* @cscript //nologo //e:jscript "%~f0" %* @ping -n 30 localhost > nul @exit /b %errorlevel% */ ''' [[dosbatch]] name = "admin" prefix = "" suffix = "_a" ext = ".bat" header = ''' @openfiles > nul 2>&1 @if %errorlevel% equ 0 goto :ALREADY_ADMIN_PRIVILEGE @powershell.exe -Command Start-Process \'%~f0\' %* -verb runas @exit /b %errorlevel% :ALREADY_ADMIN_PRIVILEGE '''
- [[filetype]]: vim の
filetype
。 - name:
DenopsAhdr
コマンドの引数に指定する名前。この名前かつ、filetype
で合致した設定を使う。 - prefix: 保存するファイル名の頭につける文字。
- suffix: 保存するファイル名のお尻につける文字。
- ext: 保存するファイルの拡張子。
- header: 追加するヘッダー。
上記の toml
はデフォルト設定なので変更はできない。
追加したい場合はデフォルトだと、 ~/.ahdr.toml
に自分の好きな設定を記載すれば追加で読み込まれる。
もしくは別の場所にしたい場合は、 g:ahdr_cfg_path
で指定する。
今開いているバッファの fenc
と ff
を保持したかったから、 Deno で書いてるのに、結局 vim
の関数でほとんど実施している・・・。あんまり Deno で書く意味はなかった・・・? (・_・;)
でも、 toml
で設定書くのが簡単に読み込めたりするのは Deno の利点じゃないかな!!
うまいこと fenc
と ff
を Deno 使いながら設定できるんやろうか・・・。うまい書き方が全然わかっていない・・・。