Windows で Vim を使った fuzzy find な定型文コピー
定型文を貼り付ける専用のソフトを使うと楽な気もするけど Vim でできそうだなと思いつたいのでやってみました。
下のようなことがあったので。
- MS-IME の辞書だと長さの制限にひっかかってしまった。
- 会社の PC に新しいソフトを入れるのが面倒。
試していて、ここら辺も良いところだなと思ったところ。
- 関数を書いてクリップボードの中身の編集ができる。
 行頭に文字列を追加するAppendQuote()を書いてみました。
- ファイルを読み込める。
 ReadfileCopy()を書いてみました。
使用プラグイン
- ctrlpvim/ctrlp.vim
- mattn/ctrlp-matchfuzzy
- mattn/ctrlp-launcher
- rhysd/vim-color-spring-night 好みの colorscheme として
再現手順
- 
下の vimrcLauncherをC:\Users\username\vimfilesに保存。
- 
プラグインを用意。 - 使用プラグインを C:\Users\username\_vim\dein\repos\github.comに作者名のディレクトリ\リポジトリ名のディレクトリで用意。
 適宜vimrcLauncherのs:reposPath,s:reposDirsを変更。
 
- 使用プラグインを 
- 
コピー用のファイルを用意。 - 
C:\Users\username\_vim\に.ctrlp-launcher-copyを作成。
 適宜vimrcLauncherのg:ctrlp_launcher_fileを変更。
- 
検索対象の文字列と実行する処理をタブで繋げて書き込み
 クリップボードへコピーするコマンドCopyを用意しているので、その後ろにコピーしたい文字列を書く。.ctrlp-launcher-copymail Copy hogefuga@hogemai.com append > call AppendQuote('>') hosts call ReadfileCopy('C:\WINDOWS\System32\drivers\etc\hosts')
 
- 
- 
C:\path\to\gvim.exe -N -U NONE -i NONE -u ~/vimfiles/vimrcLauncher -c "CtrlPLauncher copy"の実行でシンプルな gVim が起動してCtrlPLauncher copyを実行。

工夫したところ
- 
<ESC>で Vim を終了できるように。
 <ESC>押下後、 0.1 秒後にCursorHoldが発火して:quitが実行される。
- 
gVim の起動を高速化。 
 普段 Shougo/dpp.vim で頑張って 154 個のプラグインを遅延読み込みしてたら 0.3 秒を切るぐらいの起動速度だけど、これは 0.1 秒を切る。- 
デフォルトプラグインの読み込みを停止 
- 
そのほかのファイルの読み込みも停止 - defaults.vim
- filetypes.vim
- indent.vim
- syncolor.vim
 
 
- 
- 
見た目をシンプルに - 
ステータスライン非表示 - CtrlP を起動するとウィンドウが分割されるので、その時のステータスラインも消えるように StatusLineNCをCommentへ
 
- CtrlP を起動するとウィンドウが分割されるので、その時のステータスラインも消えるように 
- 
スクロールバー非表示 
- 
タイトルをシンプルに 
- 
メニュー非表示 
- 
フォントは大き目 
- 
ウィンドウ位置を固定 - 適宜 winposを変更
 
- 適宜 
 
- 
- 
なるべくゴミを残さない - viminfo の読み書きを停止
- CtrlP の履歴を保存しない
 
ファイル
" gvim -N -U NONE -i NONE -u ~/vimfiles/vimrcLauncher -c "CtrlPLauncher copy"
" benchmark
" gvim -N -U NONE -i NONE -u ~/vimfiles/vimrcLauncher -c "CtrlPLauncher copy" --startuptime vimrcLauncher.log
scriptversion 3
set encoding=utf-8
scriptencoding utf-8
" encoding 設定で起動が 0.03s 遅くなる?誤差?
let s:reposPath = expand('~\_vim\dein\repos\github.com\')
let s:reposDirs = [
     \ 'ctrlpvim\ctrlp.vim',
     \ 'mattn\ctrlp-launcher',
     \ 'mattn\ctrlp-matchfuzzy',
     \ 'rhysd\vim-color-spring-night',
     \]
" このファイルのあるディレクトリに .ctrlp-launcher-copy を作成しておく。
let g:ctrlp_launcher_file = '~/_vim/.ctrlp-launcher'
" 普段 CtrlP を使っているなら別のディレクトリを指定
let g:ctrlp_cache_dir = '~/_vim/.ctrlpLauncher'
" 表示行
let s:lines = 5
" ウィンドウ位置
let s:winposX = 700
let s:winposY = 200
" 不要なプラグイン、設定を読み込まない
" plugin
let g:loaded_getscriptPlugin   = 1
let g:loaded_gzip              = 1
let g:loaded_logiPat           = 1
let g:loaded_manpager_plugin   = 1
let g:loaded_matchparen        = 1
let g:loaded_netrw             = 1
let g:loaded_netrwPlugin       = 1
let g:loaded_netrwSettings     = 1
let g:loaded_netrwFileHandlers = 1
let g:loaded_rrhelper          = 1
let g:loaded_spellfile_plugin  = 1
let g:loaded_tar               = 1
let g:loaded_tarPlugin         = 1
let g:loaded_2html_plugin      = 1
let g:loaded_tutor_mode_plugin = 1
let g:loaded_vimball           = 1
let g:loaded_vimballPlugin     = 1
let g:loaded_zip               = 1
let g:loaded_zipPlugin         = 1
" defaults.vim
let g:skip_defaults_vim        = 1
" filetypes.vim
let g:did_load_filetypes       = 1
" indent.vim
let g:did_indent_on            = 1
" syncolor.vim
let g:syntax_cmd               = 'disable'
" viminfo は読み書きしない
set viminfo=
" simple window
let g:did_install_default_menus = 1
let g:did_install_syntax_menu = 1
" guioptions-=r 右スクロールバーを消すと起動が 0.03s ほど遅くなる? 誤差?
set guioptions+=M guioptions-=m guioptions-=e guioptions-=T guioptions+=! guioptions-=r
" 末尾に半角スペースあり。~ を消すため。
set fillchars=eob:\ 
" 自分の環境では、この gVim の起動は Autohotkey のホットキーに割り当てているけれど、前面に出ないことがあるので vimLauncher をキーワードに前面に出るように処理している
set title
set titlestring=vimLauncher
" remove statusline
" 末尾に半角スペースあり。バッファ名を消すため
set statusline=\ 
set laststatus=0
autocmd ColorScheme * :highlight! link StatusLineNC Comment
" set plugins
for s:dir in s:reposDirs
  execute($'set runtimepath+={s:reposPath}{s:dir}')
endfor
" CtrlP
let g:ctrlp_max_history = 0
let g:ctrlp_match_window = $'bottom,order:btt,min:{s:lines},max:{s:lines},results:0'
let g:ctrlp_regexp = 0
" デフォルトのキーマップを別の操作に使いたい場合は、デフォルトのキーマップも変更する
let g:ctrlp_prompt_mappings = {
      \ 'PrtBS()'              : ['<bs>', '<c-]>', '<c-h>'],
      \ 'ToggleType(1)'        : ['<c-up>'],
      \ 'ToggleType(-1)'       : ['<c-down>'],
      \ 'PrtCurLeft()'         : ['<c-b>', '<left>', '<c-^>'],
      \ 'PrtCurRight()'        : ['<c-f>', '<c-l>', '<right>'],
      \ 'AcceptSelection("e")' : ['<cr>', '<2-LeftMouse>', '<m-m>'],
      \ 'PrtHistory(-1)'       : [],
      \ 'PrtSelectMove("j")'   : ['<c-j>', '<down>', '<m-j>', '<c-n>'],
      \ 'PrtHistory(1)'        : [],
      \ 'PrtSelectMove("k")'   : ['<c-k>', '<up>', '<m-k>', '<c-p>'],
      \ 'AcceptSelection("v")' : [],
      \ 'PrtInsert("c")'       : ['<c-v>', '<MiddleMouse>', '<insert>'],
      \ 'ToggleByFname()'      : [],
      \ 'PrtDelete()'          : ['<c-d>', '<del>'],
      \ 'PrtDeleteEnt()'       : ['<F7>', '<c-w>'],
      \ 'PrtDeleteWord()'      : ['<c-q>'],
      \ }
" ctrlp-matchfuzzy
let g:ctrlp_match_func = #{match: 'ctrlp_matchfuzzy#matcher'}
" spring-night
let g:spring_night_kill_italic = 1
let g:spring_night_kill_bold = 1
filetype plugin indent on
syntax on
" colorscheme は起動時間にほぼ影響ない
colorscheme spring-night
set guifont=MS_ゴシック:h18
execute($'set lines={s:lines+3}')
execute($'winpos {s:winposX} {s:winposY}')
function! Copy(s) abort
  call setreg("*", a:s)
  quit
endfunction
command! -nargs=1 Copy call Copy(<q-args>)
function AppendQuote(quote) abort
  call getreg("*", 1, v:true)
        \ ->map({_, v -> $'{a:quote} {v}'})
        \ ->setreg("*")
  quit
endfunction
function ReadfileCopy(file) abort
  call readfile(a:file)->setreg("*")
  quit
endfunction
" <ESC> でVimを終了
set updatetime=100
autocmd CursorHold <buffer> :quit
最後に
以外に操作感が良いので、ウィンドウ切り替えも Vim と Autohotkey を使って検討中。

Discussion