vim-parteditの活用
基本的には、「ある言語 A 内に存在する、別の言語 B で書かれている部分」に対して威力を発揮すると思われる。1つの言語の中で別言語が入り込む場面は意外と多く、ユースケースとしては以下のようなものが考えられる。
Python や Rust などの言語の docstring/doc comment (Markdown や reStructuredText が用いられる)
YAML などの設定ファイルに書かれている shellscript 的なスクリプト
Vim script 中に記載された Lua または Lua 中に記載された Vim script
Markdown などのマークアップ言語内にある fenced code blocktt
別バッファに切り出すことで以下のような恩恵が受けられる。
言語 B のシンタックスハイライトが付く
もっとも、元のバッファにすでにシンタックスハイライトが付いていればこの恩恵を受けたことにはならないが、ハイライトの精度は向上するかも。
言語 B を書くときのインデントなどの調整が容易になる
場合によっては言語 B の LSP の恩恵を受けられるかもしれない(受けられないかも?)
以下、ユースケース別の設定方法の一例。 "言語B in 言語A" という表記で記述している。
Markdown in Rust
code:after/ftplugin/rust.vim
setlocal formatoptions-=ro " お好みで
let b:partedit_prefix = '/// '
let b:partedit_filetype = 'markdown'
//! 形式のコメントにも対応したい場合は b:partedit_prefix を消して b:partedit_auto_prefix = v:true にする手もあるかも(が、偶然すべての行が同じ文字から始まっていた場合に困ることはある)
Markdown in Python
code:after/ftplugin/python.vim
let b:partedit_prefix = ' '
let b:partedit_filetype = 'markdown'
Python の docstring でよく見るのは Markdown と reStructuredText だが、filetype はとりあえず普段使うほうを選択しておけばよさそう
Markdown と reStructuredText をプロジェクトによって使い分ける場合はファイルタイプで指定するのではなくプロジェクトごとに設定を書くのがよさそう
任意言語 in Markdown
Markdown 内の fenced code block を快適に書きたい場合、開くバッファのファイルタイプが fenced code block で指定したものに自動的に設定されてくれると便利。以下のような設定を行えば、それが実現できる。
code:vim
command! -range ParteditCodeblock call s:partedit_code_block(<line1>, <line2>)
function! s:partedit_code_block(line1, line2)
let line_codeblock_start = getline(a:line1 - 1)
let filetype = matchstr(line_codeblock_start, '\v`\zs-a-zA-Z0-9+\ze') let options = { "filetype": filetype }
call partedit#start(a:line1, a:line2, options)
endfunction
もう少しスマートにできるとよいかも(カーソルを含む fenced code block の範囲を自動決定してくれるとか)。
code:vim
function! s:operator_partedit() abort
let context = context_filetype#get()
if context.range == 0, 0], [0, 0
echohl WarningMsg
echomsg 'Context is not found'
echohl NONE
return
endif
call partedit#start(context.range00, context.range10, \ {'filetype': context.filetype})
" お好みで
" nnoremap <buffer> q <Cmd>ParteditEnd<CR>
endfunction
nnoremap <C-x><C-x> <Cmd>call <SID>operator_partedit()<CR>
上記の任意言語 in Markdown を解決できる