昨日エントリ書きながらこういうのあったらいいなと思ったものをとりあえずこさえてみました。「襟を正す」イメージですね…オシャレのつもりで関数名が衣類に関わるものになってます。
ソース
collar.vim
let g:collar_marks = [ [
\ '`', '~', '!', '@', '#', '$', '%', '^',
\ '&', '*', '(', ')', '_', '-', '+', '=',
\ '[', ']', '{', '}', ';', ':', '''', '"',
\ '<', '>', ',', '.', '/', '?', '|', '\', ' ' ],
\[ '`', ' ̄', '!', '@', '#', '$', '%', '^',
\ '&', '*', '(', ')', '_', 'ー', '+', '=',
\ '[', ']', '{', '}', ';', ':', '’', '”',
\ '<', '>', '、', '。', '/', '?', '|', '\', ' ' ]
\]
function! s:deStain() abort
let char = matchstr(getline('.'), '.', col('.')-1)
let isFullMark = char2nr(char) < 128 ? 0 : 1
let m = 0
try
while char2nr(g:collar_marks[isFullMark][m]) != char2nr(char)
let m += 1
endwhile
execute 'normal r'.g:collar_marks[!isFullMark][m]
catch /E684/
echo 'no match.'
endtry
endfunction
function! s:getBasteFile(...) abort
let l:toBaste = expand('%:p')
let newBaste = [ expand('%'),'v1', 'baste' ]
let dup = 1
while filereadable(join(newBaste,'.'))
let dup += 1
let newBaste[1] = 'v'.dup
endwhile
let basteFile = join(newBaste, '.')
execute('new '.basteFile)
put! = l:toBaste
write
endfunction
function! s:getBasteList(basteList) abort
let l:returnList = []
let l:currentList = []
for b in a:basteList
if b != ''
call add(l:currentList, b)
else
if len(l:currentList) > 0
call add(l:returnList, copy(l:currentList))
let l:currentList = []
endif
endif
endfor
return len(l:currentList) > 0 ? add(l:returnList, copy(l:currentList)) : l:returnList
endfunction
function! s:goBaste() abort
let l:toBaste = getline(1)
let bufLine = 2
while getline(bufLine) == '' && bufLine < line('$')
let bufLine += 1
endwhile
try
if bufLine >= line('$')
throw 'noreplace'
endif
let l:toBasteBuf = bufwinnr(bufnr(l:toBaste))
if l:toBasteBuf > 0
execute(l:toBasteBuf.'wincmd w')
elseif filereadable(l:toBaste) == 1
execute('split '.l:toBaste)
else
throw 'nofile'
endif
for b in l:basteList
execute('%s/\v%('.join(b[1:],')|%(').')/'.b[0].'/gc')
endfor
catch /nofile/
echo 'no such file '''.l:toBaste.''''
catch /noreplace/
echo 'no replace.'
endtry
endfunction
command! <silent> DeStain call s:deStain()
command! -nargs=? -complete=file BasteFile call s:getBasteFile(<f-args>)
command! Baste call s:goBaste()
ナニコレ
今やることは2つだけです。
記号の半角/全角を入れ替えるdeStain()
関数1
更新前のスクリプトは正規表現のエスケープ考えずにmatch()
を使うという頭の悪いことをしていたので、変換リストの兼ね合いで一番簡単そうなchar2nr()
を使う方法に変えました。適当に:DeStain
をリマップして使ってやってください。筆者は<Space><Space>
で使ってます。2
表記揺れを一気に修正するbaste()
関数3
:BasteFile
をすると表記揺れ修正用のバッファが開きます。見つけた表記揺れを空行区切りでどんどん書いていってください。一応Very Magicモードの正規表現で書けるようになっていますが、スクリプト上では|
でまとめてヒットするようにしてあるので見つけたらどんどん追加していくほうが手っ取り早いとおもいます。チェックが終わったら:Baste
とすると、区切った表記揺れの最初の行の単語に置換されます。
例
個人的な校正用スクリプト collar.vim.md
表記ゆれ
表記揺れ
他動
動詞
:
:
既知のバグ
全部潰してるはずです…正規表現周りは想定してないのでなにかあるかも…
ところでこういうの、もうあったらどうしよう…