読者です 読者をやめる 読者になる 読者になる

Vimでも <C-s> で保存がしたい!

※この記事はVim Advent Calendar 2012の246日目の記事です。


最近SSDが壊れてGitHubにpushしていない.vimrcの設定が消失しました。
しかも定期的なバックアップの設定をしておいたつもりが動いていませんでした。
設定している人はこの際にバックアップが動いているか確認してはいかがでしょうか。


さて、今回は吹っ飛ばした設定の中で、記憶からサルベージした設定を1つご紹介しましょう。
Windowsに慣れ親しむと、Vimでも<C-s>が使いたくなるものです。
これは手癖のようなもので、ふとした瞬間に「:w<CR>」を押していたのが
つい一打鍵で済む「<C-s>」を押してしまいがちです。
ならばVimでも<C-s>で保存できるようにしてしまいましょう。


CUIでも使えるようにしました。CUI版ではダイアログは出ません。
ちなみにLinuxのシェル上で<C-s>を押すとデフォルトだと画面が固まるので、.bashrc等で一回 stty stop undef または stty -ixon を実行する必要があります。間違えて<C-s>を押した場合は<C-q>で戻ります。*1

imap <script> <C-s> <SID>(gui-save)<Esc>
nmap <script> <C-s> <SID>(gui-save)
imap <script> <SID>(gui-save) <C-o><SID>(gui-save)
nnoremap      <SID>(gui-save) :<C-u>call <SID>gui_save()<CR>
function! s:gui_save()
    if bufname('%') ==# ''
        browse confirm saveas
    else
        update
    endif
endfunction

GUI版でのみ動きます。
保存ダイアログでのファイル作成、上書きなど他のWindows用エディタと同じ使い勝手になっているはずです。


ちなみに最初の2行の部分を

imap <script> <C-s> <SID>(gui-save)<Esc>
nmap <script> <C-s> <SID>(gui-save)

から

imap <script> <C-s> <SID>(gui-save)
nmap <script> <C-s> <SID>(gui-save)

に変えると、インサートモードで保存したあとノーマルモードに戻るのを防ぐことができます。
ただし自分は保存したタイミングで一区切り付けてノーマルモードに戻りたいので、冒頭のような設定となっています。

*1:@h_eastさんに端末の場合は設定が必要なことを補足しておいた方が良いとの指摘を頂きました。ありがとうございます。