Guest User

Untitled

a guest
Jan 21st, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.30 KB | None | 0 0
  1. --
  2.  
  3. Yokohama.vim #2
  4.  
  5. キーマッピングを考える
  6.  
  7. tsukkee
  8.  
  9.  
  10.  
  11.  
  12.  
  13. --
  14.  
  15. 自己紹介
  16.  
  17. @tsukkee (つっきー)
  18.  
  19. 某メーカーで研究してます
  20.  
  21. lingr.vimとか作ってます
  22.  
  23. Yokohama.vimは#0以来2回目の参加
  24.  
  25. Vimテクニックバイブルが間に合わなかったorz
  26. -> と思ったらさっき届いた!
  27.  
  28.  
  29.  
  30.  
  31. --
  32.  
  33. 本日のテーマ
  34.  
  35. Vimのキーマッピングについて考えてみる
  36.  
  37. 私がキーマッピングについて考えていることを
  38.  
  39. 実例を交えてお話したいと思います
  40.  
  41.  
  42.  
  43.  
  44.  
  45. --
  46.  
  47. というわけでさっそく!
  48.  
  49.  
  50.  
  51.  
  52.  
  53. --
  54.  
  55. その1!
  56.  
  57. 押しにくいなら押しやすくすればいい!
  58.  
  59.  
  60.  
  61.  
  62.  
  63. --
  64.  
  65. たとえば、Vimは<Esc>を多用するけど<Esc>押しにくいから
  66.  
  67. クソだよねww みたいな物言いがありますが…
  68.  
  69.  
  70. 押しにくければ押しやすくすればいい!
  71.  
  72.  
  73.  
  74.  
  75.  
  76. --
  77.  
  78. たとえば、以下のような感じ
  79.  
  80. inoremap <C-e> <Esc>
  81. vnoremap <C-e> <Esc>
  82. cnoremap <C-e> <C-c>
  83.  
  84.  
  85.  
  86.  
  87. --
  88.  
  89. Shougoさんぐらいになるとこうなる
  90.  
  91. inoremap jj <Esc>
  92. onoremap jj <Esc>
  93. cnoremap jj <C-c>
  94. inoremap j<Space> j
  95. onoremap j<Space> j
  96. cnoremap j<Space> j
  97.  
  98. 私の現在の設定は後ほど…
  99.  
  100.  
  101.  
  102.  
  103.  
  104. --
  105.  
  106. ついでに<Leader>も適当に押しやすくしておこう
  107. (なぜか, (コンマ)に割り当てている人が多い)
  108.  
  109. let mapleader = ','
  110. " デフォルトは\ (バックスラッシュ)
  111.  
  112.  
  113.  
  114. 余談ですが, (コンマ)はデフォルトで
  115. どういう挙動か知っていますか?
  116.  
  117. sample sample sample sample sample
  118.  
  119.  
  120.  
  121.  
  122. --
  123.  
  124. 他にも押しにくいと思ったら押しやすいキーを割り当てる
  125.  
  126. 隣のタブへ移動
  127. nnoremap L gt
  128. nnoremap H gT
  129.  
  130. gvimでシステムのクリップボードを使う
  131. nnoremap gy "*y
  132. nnoremap gp "*p
  133.  
  134. fakeclip使ってる場合は以下のような感じでもOK
  135. map gy "*y
  136. map gp "*p
  137. if exists('$WINDOW') || exists('$TMUX')
  138. map gY <Plug>(fakeclip-screen-y)
  139. map gP <Plug>(fakeclip-screen-p)
  140. endif
  141.  
  142.  
  143.  
  144.  
  145. --
  146.  
  147. みんな大好きsurrund.vimも使いやすく
  148.  
  149. nmap s <Plug>Ysurround
  150.  
  151. text texttext text
  152.  
  153.  
  154.  
  155.  
  156. --
  157.  
  158. ポイント!
  159.  
  160. デフォルトマッピングでなんか押しにくいと感じたら即変更
  161.  
  162. 普段あんまり使ってないマッピングは躊躇なく潰す
  163. たとえば
  164. nnoremap L gt
  165. とか
  166. nmap s <Plug>Ysurround
  167. とかのように、あまり使わないところは
  168. よく使うところに割り当ててしまう
  169.  
  170.  
  171.  
  172.  
  173.  
  174. --
  175.  
  176. その2!
  177.  
  178. Vimの挙動を変えてしまう(ような感じにする)!
  179.  
  180.  
  181.  
  182.  
  183. --
  184.  
  185. カーソルの動きを直感的(?)にする
  186.  
  187. nnoremap j gj
  188. nnoremap gj j
  189. nnoremap k gk
  190. nnoremap gk k
  191. nnoremap 0 g0
  192. nnoremap g0 0
  193. nnoremap $ g$
  194. nnoremap g$ $
  195.  
  196. すごーーーーーーーく一行が長いところーーーーーーーーーーーーーーーーーーーは微妙にカーソルを動かしにくいーーーーーーーーーーーーきがする?そんなこともないーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーですか?
  197.  
  198.  
  199.  
  200.  
  201. --
  202.  
  203. Ex modeの履歴を遡るのもちょっと楽できる
  204.  
  205. cnoremap <C-p> <Up>
  206. cnoremap <Up> <C-p>
  207. cnoremap <C-n> <Down>
  208. cnoremap <Down> <C-n>
  209.  
  210.  
  211.  
  212.  
  213.  
  214. --
  215.  
  216. i_CTRL-uやi_CTRL-wの操作を
  217. 操作履歴として覚えておく (Vim Hacks #81 より)
  218.  
  219. inoremap <C-u> <C-g>u<C-u>
  220. inoremap <C-w> <C-g>u<C-w>
  221.  
  222.  
  223.  
  224.  
  225.  
  226. --
  227.  
  228. ちょっと高度だけどプラグインを使って
  229.  
  230. タグ検索をUniteで置き換える
  231. nnoremap <buffer> <C-]>
  232. \ :<C-u>UniteWithCursorWord -immediately tag<CR>
  233.  
  234. ヘルプ引くのをref.vimにする
  235. (これはref.vimがデフォルトで定義するけど^^;)
  236.  
  237. nmap K <Plug>(ref-keyword)
  238.  
  239. などなど
  240.  
  241.  
  242.  
  243.  
  244.  
  245. --
  246.  
  247. ポイント!
  248.  
  249. Vimのデフォルトの挙動を拡張したような気になれる!
  250.  
  251. 通常のマッピングから慣れるコストほぼ0で使える!
  252.  
  253.  
  254.  
  255.  
  256.  
  257. --
  258.  
  259. その3!
  260.  
  261. 新たなキーマッピングを編み出せ!
  262.  
  263.  
  264.  
  265.  
  266.  
  267. --
  268.  
  269. 最後に編集したところを選択 (kanaさんに教えてもらった)
  270.  
  271. nnoremap gc `[v`]
  272.  
  273.  
  274.  
  275.  
  276. --
  277.  
  278. foldの開閉を簡単にする (ns9tksさんからパクった)
  279. nnoremap <expr> h
  280. \ col('.') == 1 && foldlevel(line('.')) > 0 ? 'zc' : 'h'
  281.  
  282. nnoremap <expr> l
  283. \ foldclosed(line('.')) != -1 ? 'zo' : 'l'
  284.  
  285.  
  286. {{{
  287. folding
  288. folding
  289. }}}
  290.  
  291.  
  292.  
  293.  
  294. --
  295.  
  296. もうちょい高度な例 (Vim Hacks #214 より)
  297.  
  298. onoremap ) t)
  299. onoremap ( t(
  300. onoremap ] t]
  301. onoremap [ t[
  302.  
  303. function (argument) { hash['key'] }
  304.  
  305.  
  306.  
  307.  
  308.  
  309. --
  310.  
  311. ポイント!
  312.  
  313. `[ `]とか t とかあまり知られてない(?)けど
  314. 便利なのがあるので活用する!
  315.  
  316. <expr> も組み合わせると可能性が広がる!
  317.  
  318.  
  319.  
  320.  
  321.  
  322. --
  323.  
  324. その4!
  325.  
  326. Kana神より賜れしプラグインを活用する!
  327.  
  328.  
  329.  
  330.  
  331. --
  332.  
  333. たとえば、ウィンドウのサイズ変更(<C-w>+とか)を
  334.  
  335. 繰り返し入力するのは大変!
  336.  
  337.  
  338.  
  339.  
  340.  
  341. --
  342.  
  343. submode.vimを使う
  344.  
  345. call submode#enter_with(
  346. \ 'winsize', 'n', '', '<C-w>>', '<C-w>>')
  347. call submode#enter_with(
  348. \ 'winsize', 'n', '', '<C-w><', '<C-w><')
  349. call submode#enter_with(
  350. \ 'winsize', 'n', '', '<C-w>+', '<C-w>+')
  351. call submode#enter_with(
  352. \ 'winsize', 'n', '', '<C-w>-', '<C-w>-')
  353. call submode#map('winsize', 'n', '', '>', '<C-w>>')
  354. call submode#map('winsize', 'n', '', '<', '<C-w><')
  355. call submode#map('winsize', 'n', '', '+', '<C-w>+')
  356. call submode#map('winsize', 'n', '', '-', '<C-w>-')
  357.  
  358.  
  359.  
  360.  
  361.  
  362. --
  363.  
  364. textmanipと組み合わせて
  365.  
  366. call submode#enter_with('textmanip', 'v', 'r', '<C-t>h',
  367. \ '<Plug>(textmanip-move-left)')
  368. call submode#enter_with('textmanip', 'v', 'r', '<C-t>j',
  369. \ '<Plug>(textmanip-move-down)')
  370. call submode#enter_with('textmanip', 'v', 'r', '<C-t>k',
  371. \ '<Plug>(textmanip-move-up)')
  372. call submode#enter_with('textmanip', 'v', 'r', '<C-t>l',
  373. \ '<Plug>(textmanip-move-right)')
  374. call submode#map('textmanip', 'v', 'r', 'h',
  375. \ '<Plug>(textmanip-move-left)')
  376. call submode#map('textmanip', 'v', 'r', 'j',
  377. \ '<Plug>(textmanip-move-down)')
  378. call submode#map('textmanip', 'v', 'r', 'k',
  379. \ '<Plug>(textmanip-move-up)')
  380. call submode#map('textmanip', 'v', 'r', 'l',
  381. \ '<Plug>(textmanip-move-right)')
  382.  
  383. テキストのかたまり
  384. テキストのかたまり
  385.  
  386.  
  387.  
  388.  
  389.  
  390. --
  391.  
  392. いろいろキーマッピングしすぎて割り当てるキーがなくなってきた!
  393.  
  394.  
  395.  
  396.  
  397.  
  398. --
  399.  
  400. smartchr.vimを使う
  401.  
  402. inoremap <expr> = smartchr#loop('=', ' = ', ' == ')
  403. inoremap <expr> . smartchr#loop('.', '->')
  404.  
  405.  
  406.  
  407.  
  408.  
  409. --
  410.  
  411. arpeggio.vimを使う
  412.  
  413. 必ず使う前にarpeggio#load()を呼んでおく
  414. call arpeggio#load()
  415.  
  416. Uniteを一発で起動
  417. Arpeggionnoremap km :<C-u>Unite buffer<CR>
  418.  
  419. 2キー以上の同時押しも可能
  420. Arpeggionnoremap asdf: oHello arpeggio!<Esc>
  421.  
  422.  
  423.  
  424.  
  425.  
  426. --
  427.  
  428. 最初の方で触れた<Esc>押しにくい問題も解決!
  429.  
  430. Arpeggionmap fj <Esc>
  431. Arpeggioimap fj <Esc>
  432. Arpeggiocmap fj <Esc>
  433. Arpeggiovmap fj <Esc>
  434.  
  435.  
  436.  
  437.  
  438.  
  439. --
  440.  
  441. arpeggio.vimを使うコツ
  442.  
  443. arpeggioに含まれてるキーに何か割り当てたいときは
  444. 以下のようにする必要がある
  445.  
  446. nnoremap <Plug>(arpeggio-default:j) gj
  447. nnoremap <Plug>(arpeggio-default:k) gk
  448.  
  449. すごーーーーーーーく一行が長いところーーーーーーーーーーーーーーーーーーーは微妙にカーソルを動かしにくいーーーーーーーーーーーーきがする?そんなこともないーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーですか?
  450.  
  451. 同時押しをミスったときにリスクが小さいキーを選ぶ
  452. Arpeggionnoremap dj {rhs}
  453. とかしちゃうとミスったときにテキストが消える
  454. Arpeggionnoremap fj {rhs}
  455. だと、せいぜいカーソルが移動するぐらい
  456.  
  457.  
  458.  
  459.  
  460.  
  461. --
  462.  
  463. まとめ
  464.  
  465. 押しにくいキーは押しやすくすればいい!
  466.  
  467. デフォルトの挙動を拡張する!
  468.  
  469. 新たなマッピングを編み出す!
  470.  
  471. Kanaさんはやっぱりすごい
  472. arpeggio.vimとかは実装もかなり面白いので
  473. 興味ある方は見てみてください
  474.  
  475. 他人のvimrcは宝の山!
  476.  
  477.  
  478.  
  479.  
  480.  
  481. --
  482.  
  483. 最後に
  484.  
  485. 皆様のvimrcに少しでも役に立てば嬉しいです
  486.  
  487. ご清聴ありがとうございました!
Add Comment
Please, Sign In to add comment