Zenn
😎

Windows で Vim を使った fuzzy find な定型文コピー

2025/02/11に公開

定型文を貼り付ける専用のソフトを使うと楽な気もするけど Vim でできそうだなと思いつたいのでやってみました。

下のようなことがあったので。

  • MS-IME の辞書だと長さの制限にひっかかってしまった。
  • 会社の PC に新しいソフトを入れるのが面倒。

試していて、ここら辺も良いところだなと思ったところ。

  • 関数を書いてクリップボードの中身の編集ができる。
    行頭に文字列を追加する AppendQuote() を書いてみました。
  • ファイルを読み込める。
    ReadfileCopy() を書いてみました。

使用プラグイン

再現手順

  • 下の vimrcLauncherC:\Users\username\vimfiles に保存。

  • プラグインを用意。

    • 使用プラグインを C:\Users\username\_vim\dein\repos\github.com作者名のディレクトリ\リポジトリ名のディレクトリ で用意。
      適宜 vimrcLaunchers:reposPath, s:reposDirs を変更。
  • コピー用のファイルを用意。

    • C:\Users\username\_vim\.ctrlp-launcher-copy を作成。
      適宜 vimrcLauncherg:ctrlp_launcher_file を変更。

    • 検索対象の文字列実行する処理タブ で繋げて書き込み
      クリップボードへコピーするコマンド Copy を用意しているので、その後ろにコピーしたい文字列を書く。

      .ctrlp-launcher-copy
      mail	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 を起動するとウィンドウが分割されるので、その時のステータスラインも消えるように StatusLineNCComment
    • スクロールバー非表示

    • タイトルをシンプルに

    • メニュー非表示

    • フォントは大き目

    • ウィンドウ位置を固定

      • 適宜 winpos を変更
  • なるべくゴミを残さない

    • viminfo の読み書きを停止
    • CtrlP の履歴を保存しない

ファイル

vimrcLauncher
" 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 を使って検討中。

GitHubで編集を提案

Discussion

ログインするとコメントできます