Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --
- Yokohama.vim #2
- キーマッピングを考える
- tsukkee
- --
- 自己紹介
- @tsukkee (つっきー)
- 某メーカーで研究してます
- lingr.vimとか作ってます
- Yokohama.vimは#0以来2回目の参加
- Vimテクニックバイブルが間に合わなかったorz
- -> と思ったらさっき届いた!
- --
- 本日のテーマ
- Vimのキーマッピングについて考えてみる
- 私がキーマッピングについて考えていることを
- 実例を交えてお話したいと思います
- --
- というわけでさっそく!
- --
- その1!
- 押しにくいなら押しやすくすればいい!
- --
- たとえば、Vimは<Esc>を多用するけど<Esc>押しにくいから
- クソだよねww みたいな物言いがありますが…
- 押しにくければ押しやすくすればいい!
- --
- たとえば、以下のような感じ
- inoremap <C-e> <Esc>
- vnoremap <C-e> <Esc>
- cnoremap <C-e> <C-c>
- --
- Shougoさんぐらいになるとこうなる
- inoremap jj <Esc>
- onoremap jj <Esc>
- cnoremap jj <C-c>
- inoremap j<Space> j
- onoremap j<Space> j
- cnoremap j<Space> j
- 私の現在の設定は後ほど…
- --
- ついでに<Leader>も適当に押しやすくしておこう
- (なぜか, (コンマ)に割り当てている人が多い)
- let mapleader = ','
- " デフォルトは\ (バックスラッシュ)
- 余談ですが, (コンマ)はデフォルトで
- どういう挙動か知っていますか?
- sample sample sample sample sample
- --
- 他にも押しにくいと思ったら押しやすいキーを割り当てる
- 隣のタブへ移動
- nnoremap L gt
- nnoremap H gT
- gvimでシステムのクリップボードを使う
- nnoremap gy "*y
- nnoremap gp "*p
- fakeclip使ってる場合は以下のような感じでもOK
- map gy "*y
- map gp "*p
- if exists('$WINDOW') || exists('$TMUX')
- map gY <Plug>(fakeclip-screen-y)
- map gP <Plug>(fakeclip-screen-p)
- endif
- --
- みんな大好きsurrund.vimも使いやすく
- nmap s <Plug>Ysurround
- text texttext text
- --
- ポイント!
- デフォルトマッピングでなんか押しにくいと感じたら即変更
- 普段あんまり使ってないマッピングは躊躇なく潰す
- たとえば
- nnoremap L gt
- とか
- nmap s <Plug>Ysurround
- とかのように、あまり使わないところは
- よく使うところに割り当ててしまう
- --
- その2!
- Vimの挙動を変えてしまう(ような感じにする)!
- --
- カーソルの動きを直感的(?)にする
- nnoremap j gj
- nnoremap gj j
- nnoremap k gk
- nnoremap gk k
- nnoremap 0 g0
- nnoremap g0 0
- nnoremap $ g$
- nnoremap g$ $
- すごーーーーーーーく一行が長いところーーーーーーーーーーーーーーーーーーーは微妙にカーソルを動かしにくいーーーーーーーーーーーーきがする?そんなこともないーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーですか?
- --
- Ex modeの履歴を遡るのもちょっと楽できる
- cnoremap <C-p> <Up>
- cnoremap <Up> <C-p>
- cnoremap <C-n> <Down>
- cnoremap <Down> <C-n>
- --
- i_CTRL-uやi_CTRL-wの操作を
- 操作履歴として覚えておく (Vim Hacks #81 より)
- inoremap <C-u> <C-g>u<C-u>
- inoremap <C-w> <C-g>u<C-w>
- --
- ちょっと高度だけどプラグインを使って
- タグ検索をUniteで置き換える
- nnoremap <buffer> <C-]>
- \ :<C-u>UniteWithCursorWord -immediately tag<CR>
- ヘルプ引くのをref.vimにする
- (これはref.vimがデフォルトで定義するけど^^;)
- nmap K <Plug>(ref-keyword)
- などなど
- --
- ポイント!
- Vimのデフォルトの挙動を拡張したような気になれる!
- 通常のマッピングから慣れるコストほぼ0で使える!
- --
- その3!
- 新たなキーマッピングを編み出せ!
- --
- 最後に編集したところを選択 (kanaさんに教えてもらった)
- nnoremap gc `[v`]
- --
- foldの開閉を簡単にする (ns9tksさんからパクった)
- nnoremap <expr> h
- \ col('.') == 1 && foldlevel(line('.')) > 0 ? 'zc' : 'h'
- nnoremap <expr> l
- \ foldclosed(line('.')) != -1 ? 'zo' : 'l'
- {{{
- folding
- folding
- }}}
- --
- もうちょい高度な例 (Vim Hacks #214 より)
- onoremap ) t)
- onoremap ( t(
- onoremap ] t]
- onoremap [ t[
- function (argument) { hash['key'] }
- --
- ポイント!
- `[ `]とか t とかあまり知られてない(?)けど
- 便利なのがあるので活用する!
- <expr> も組み合わせると可能性が広がる!
- --
- その4!
- Kana神より賜れしプラグインを活用する!
- --
- たとえば、ウィンドウのサイズ変更(<C-w>+とか)を
- 繰り返し入力するのは大変!
- --
- submode.vimを使う
- call submode#enter_with(
- \ 'winsize', 'n', '', '<C-w>>', '<C-w>>')
- call submode#enter_with(
- \ 'winsize', 'n', '', '<C-w><', '<C-w><')
- call submode#enter_with(
- \ 'winsize', 'n', '', '<C-w>+', '<C-w>+')
- call submode#enter_with(
- \ 'winsize', 'n', '', '<C-w>-', '<C-w>-')
- call submode#map('winsize', 'n', '', '>', '<C-w>>')
- call submode#map('winsize', 'n', '', '<', '<C-w><')
- call submode#map('winsize', 'n', '', '+', '<C-w>+')
- call submode#map('winsize', 'n', '', '-', '<C-w>-')
- --
- textmanipと組み合わせて
- call submode#enter_with('textmanip', 'v', 'r', '<C-t>h',
- \ '<Plug>(textmanip-move-left)')
- call submode#enter_with('textmanip', 'v', 'r', '<C-t>j',
- \ '<Plug>(textmanip-move-down)')
- call submode#enter_with('textmanip', 'v', 'r', '<C-t>k',
- \ '<Plug>(textmanip-move-up)')
- call submode#enter_with('textmanip', 'v', 'r', '<C-t>l',
- \ '<Plug>(textmanip-move-right)')
- call submode#map('textmanip', 'v', 'r', 'h',
- \ '<Plug>(textmanip-move-left)')
- call submode#map('textmanip', 'v', 'r', 'j',
- \ '<Plug>(textmanip-move-down)')
- call submode#map('textmanip', 'v', 'r', 'k',
- \ '<Plug>(textmanip-move-up)')
- call submode#map('textmanip', 'v', 'r', 'l',
- \ '<Plug>(textmanip-move-right)')
- テキストのかたまり
- テキストのかたまり
- --
- いろいろキーマッピングしすぎて割り当てるキーがなくなってきた!
- --
- smartchr.vimを使う
- inoremap <expr> = smartchr#loop('=', ' = ', ' == ')
- inoremap <expr> . smartchr#loop('.', '->')
- --
- arpeggio.vimを使う
- 必ず使う前にarpeggio#load()を呼んでおく
- call arpeggio#load()
- Uniteを一発で起動
- Arpeggionnoremap km :<C-u>Unite buffer<CR>
- 2キー以上の同時押しも可能
- Arpeggionnoremap asdf: oHello arpeggio!<Esc>
- --
- 最初の方で触れた<Esc>押しにくい問題も解決!
- Arpeggionmap fj <Esc>
- Arpeggioimap fj <Esc>
- Arpeggiocmap fj <Esc>
- Arpeggiovmap fj <Esc>
- --
- arpeggio.vimを使うコツ
- arpeggioに含まれてるキーに何か割り当てたいときは
- 以下のようにする必要がある
- nnoremap <Plug>(arpeggio-default:j) gj
- nnoremap <Plug>(arpeggio-default:k) gk
- すごーーーーーーーく一行が長いところーーーーーーーーーーーーーーーーーーーは微妙にカーソルを動かしにくいーーーーーーーーーーーーきがする?そんなこともないーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーですか?
- 同時押しをミスったときにリスクが小さいキーを選ぶ
- Arpeggionnoremap dj {rhs}
- とかしちゃうとミスったときにテキストが消える
- Arpeggionnoremap fj {rhs}
- だと、せいぜいカーソルが移動するぐらい
- --
- まとめ
- 押しにくいキーは押しやすくすればいい!
- デフォルトの挙動を拡張する!
- 新たなマッピングを編み出す!
- Kanaさんはやっぱりすごい
- arpeggio.vimとかは実装もかなり面白いので
- 興味ある方は見てみてください
- 他人のvimrcは宝の山!
- --
- 最後に
- 皆様のvimrcに少しでも役に立てば嬉しいです
- ご清聴ありがとうございました!
Add Comment
Please, Sign In to add comment