ヘッダー追加する vim plugin (denops.vim で!)
denops.vim とは
Alisue
さんが作成している、 Deno を使って Vim / Neovim のプラグインが書けるフレームワークです。
Deno を使って Vim/Neovim のプラグインを書く by denops.vim
せっかくなので、これを使って plugin 作ってみました。
yukimemi/dps-ahdr
作った 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
を書いていて、このスクリプトすぐ実行できる実行形式にしたい!ってときに使えます。
PowerShell をダブルクリックで実行可能に (Set-ExecutionPolicy 不要)
- 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 使いながら保持できるんやろうか・・・。うまい書き方が全然わかっていない・・・。
Discussion