Skip to content

Instantly share code, notes, and snippets.

@ujihisa
Last active March 17, 2024 02:40
Show Gist options
  • Save ujihisa/5675878 to your computer and use it in GitHub Desktop.
Save ujihisa/5675878 to your computer and use it in GitHub Desktop.

Vim Advent Calendar 181日目

Vim Advent Calendar 181日目の記事です。昨日はcohamaさんによるVim のコマンドラインモードを使いこなそうでした。

本記事は久々の文書による記事です。せっかくなので口頭で説明しづらいkey mappingについて綴りたいと思います。

すでに

などのkey mappingに関するVim Advent Calendar記事があがっています。

Altキーのすすめ

keyboard

MacでいうCmdキー、LinuxでいうAltキーのことです。スペースのすぐ左、Xの下にあるキーのことです。このキーはmodifier keyであるにもかかわらずFPの消費が極端に少ないという特殊な性質があります。したがって我々Vim使いは、ctrlキーなどのFP消費量の大きいキーを差し控え、このキーの使用を最大化するべきです。(*1)

normal modeやvisual modeでctrlキーを使うのは情弱、という名言がありました。spaceなどをprefixとして様々なキーを割り当てたり、あるいはsなどの一部のキーを潰してそれをprefixに用いる、などがよく使われていることと思います。しかしながらinsert modeへのキー割り当てはこのようにいきません。直接入力する対象のkey以外を使わなければなりません。

この記事は、altキーを再発見します。

Mapping方法

<M-として指定します。<D-<A-とすると一部の環境でしか動作しなくなるため危険です。 たとえば~/.vimrcにて以下のようにすることでAlt-Backslashにneosnippetのjump-or-expandの割り当てを行います。

imap <M-\> <Plug>(neosnippet_jump_or_expand)

なお著者は端末のvimを積極的に避ける派ですが、どうしても端末のvimを使わざるをえない状況に陥りそうであるならば、thincaさんの端末の Vim でも Alt キーを使うが便利です。

著者のvimrcからいくつか引用することで具体例としましょう。

omap <Space>p %
omap <M-9> %

operator-pending modeの%をかなりよく使うのですが、%はとても入力しにくいことで有名です。著者はながらく<space>pで代用していましたが、最近Alt-9にするとよいのではないかと発見しました。つまり、Alt-(をshiftを押さずに打鍵するという意味です。

inoremap <M-BS> <C-w>

insert modeのままでの単語単位の削除です。また著者はinsert modeの<BS>に様々な昨日を割り当てているため、それらを回避したいときにも活用しています。

nnoremap <silent> <M-j>      :<C-u>execute 'tabnext' 1 + (tabpagenr() + v:count1 - 1) % tabpagenr('$')<CR>:redraw<CR>
nnoremap <M-k>  gT

Alt-jAlt-kでタブページを移動するためのものです。著者は同様の設定をChromeやSkypeに割り当てており、ほとんどすべてのアプリケーションでタブ間移動を同じインタフェースで行えるようにしています。とても便利です。

" <C-g> is to swap visual mode and select mode. <C-g> is difficult to type.
" Use Alt-g instead
vnoremap <M-g> <C-g>
snoremap <M-g> <C-g>
## 脚注

visual modeとselect modeの<C-g>がたまに便利なものの入力しにくさトップレベルなのでAlt-gにしました。

nmap <M-o> <Plug>(openbrowser-open)

openbrowser.vim用の設定です。Mac OSXのFinderはアイコンを選択した状態でCmd-Oとするとそのファイルを開きます。その流れで、Vim上でもURLをAlt-oすることでブラウザで開くようにしました。便利です。

augroup vimrc-vimshell
  autocmd!
  autocmd FileType vimshell call s:vimshell_local()
augroup END

function! s:vimshell_local()
  (長いので中略)
  inoremap <buffer> <expr><M-l>  unite#sources#vimshell_history#start_complete(!0)
endfunction

vimshell専用設定です。vimshellではinsert modeの<C-l>でヒストリをuniteることができるのですが、それを<M-l>でできるようにしています。(似た記述でiexeにも対応させています)

imap <M-l> <Plug>(neocomplcache_start_unite_complete)

neocomplcacheは補完候補が多すぎるときなどのためその候補をuniteに委ねる機能があります。補完ポップアップがでているとき、つまりinsert modeのときにしか使えないので、これもaltりましょう。

nnoremap <sid>(command-line-enter) q:
xnoremap <sid>(command-line-enter) q:
nnoremap <sid>(command-line-norange) q:<C-u>

nmap :  <sid>(command-line-enter)
xmap :  <sid>(command-line-enter)
imap <M-:> <Esc><sid>(command-line-enter)

これは正直あまりつかっていません。insert modeから直接Alt-:でcmdwinを開くようにしています。

imap <M-\> <Plug>(neosnippet_jump_or_expand)
smap <M-\> <Plug>(neosnippet_jump_or_expand)
nmap <M-\> a<M-\>
xmap <M-\> <Plug>(neosnippet_expand_target)

前述のneosnippet用の設定です。著者はneosnippet病で、かなり頻繁に用いています。

imap <expr> <M-v> col('$') <= col('.') ? '<C-o>"+p' : '<C-o>"+P'

vnoremap <M-c> "+y

Alt-cAlt-vでコピペができるようにしています。

nmap <M--> <Plug>(fontzoom-smaller)
nmap <M-=> <Plug>(fontzoom-larger)

fontzoom.vim用の設定です。MacVimではCmd-+Cmd--をshiftキーなしで用いることでフォントサイズを変更することができました。それとまったく同じものをGentooのGVimで利用可能にしています。

まとめ

いかがでしたか。著者は今後ますますAltキーを多用することになると思います。

脚注

  • (*1) 小指が長いなど、FPが非常に大きな人にとっては本記事は不要です。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment