Vim script で改行時に自動的に \ を挿入したい
Vim script では複数行に渡る処理を記述する場合、先頭に \ を書く必要があります。
" こんな感じで次の行に続けて処理を書く場合は先頭に \ を付ける必要がある NeoBundleLazy 'Shougo/vimfiler', { \ 'depends' : ["Shougo/unite.vim"], \ 'autoload' : { 'commands' : [ "VimFilerTab", "VimFiler", "VimFilerExplorer" ] } \}
で、\ をいちいち書くのがめんどくさかったので改行時に自動的に \ が付くような Vim script をちょっと書いてみました。
[使い方]
" \ が付くケース " 改行時にカーソル位置が行末で無ければ \ がつきます。 aaa{改行}aa " {} [] () 括弧が閉じられてなければ \ を付ける {{改行} [{改行}] {aaa{改行}aaaa} " \ が付かないケース " 行末であれば \ は付かない aaaa{改行} " 括弧が閉じられていれば \ は付かない {aaa}{改行}
[コード]
function! s:add_back_slash(line) if empty(a:line) return '\' elseif a:line[0] ==# " " || a:line[0] !=# " " return '\'.a:line else let line = split(a:line, '\zs') echo line let line[0] = '\' return join(line, "") endif endfunction function! s:back_slash_linefeed() call setline(line("."), s:add_back_slash(getline(line(".")))) return "" endfunction function! s:less(a, b) return a:a[0] == a:b[0] && a:a[1] < a:b[1] || a:a[0] < a:b[0] endfunction function! s:is_closed_bracket(begin, end) return s:less(searchpos(a:begin, "bn"), searchpos(a:end, "bn")) endfunction function! s:is_closed() return !(!s:is_closed_bracket("{", "}") || !s:is_closed_bracket("[", "]")) endfunction function! s:is_line_end() return col('$') == (getpos(".")[2]) endfunction function! s:is_need_back_slash() return !s:is_closed() || !s:is_line_end() endfunction inoremap <silent> <Plug>(back_slash_linefeed) \ <CR><C-r>=<SID>back_slash_linefeed()<CR><Right> inoremap <silent><expr> <Plug>(smart_back_slash_linefeed) \ <SID>is_need_back_slash() ? "\<CR>\<C-r>=\<SID>back_slash_linefeed()\<CR>\<Right>" : "\<CR>" " いい感じに \ を付けて改行 imap <buffer> <CR> <Plug>(smart_back_slash_linefeed) " 明示的に \ を付けて改行する場合 imap <buffer> <C-CR> <Plug>(back_slash_linefeed)
とりあえず、こんな感じ。
括弧の判定は結構ずさんなので穴がありそう。コメントとか考慮してないし。
しばらく使って様子見てみようかな。