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