LoginSignup
2
2

More than 5 years have passed since last update.

個人的な校正用スクリプト collar.vim

Last updated at Posted at 2018-05-21

昨日エントリ書きながらこういうのあったらいいなと思ったものをとりあえずこさえてみました。「襟を正す」イメージですね…オシャレのつもりで関数名が衣類に関わるものになってます。

ソース

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

表記ゆれ
表記揺れ

他動
動詞
  :
  :

既知のバグ

全部潰してるはずです…正規表現周りは想定してないのでなにかあるかも…

ところでこういうの、もうあったらどうしよう…


  1. destain : [他動] ~から汚れを除く。 

  2. リーダーキーを<Space>にすると捗るとかなんとか… 

  3. baste : [他動] ~に仮縫いをする。、~を仕付けする。 

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2