16
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VimAdvent Calendar 2018

Day 11

fキーをnoremap可能にするfmap.vim

Last updated at Posted at 2018-12-10

今回の主題 :point_down:

begin.jpg

事前知識 (noremap, fFtT)

Hi, メリークリスマス :snowman:

皆さんnoremapしてますか?
例えばnnoremapはnormalモードに対するキーマッピングを定義する機能で、以下のような機能を実現できました。

" <Space>h, j, k, lでwindowを上下左右に移動する
nnoremap <Space>h <C-w>h
nnoremap <Space>j <C-w>j
nnoremap <Space>k <C-w>k
nnoremap <Space>l <C-w>l
" 各レジスタの内容を表示する
nnoremap <silent> q: :<C-u>register<CR>
--- レジスタ ---
""   ような
"0   Vim Advent Calendar 2018ボツ記事(vital.vimで関数型プログラミング入門)^J
"1   :+1: ^J
"2   ## まとめ^J)"
...

またvimは標準でnormalモードのfキー、F, t, Tキーへのマッピングを提供します。
例えばあなたが:point_down: の ^ の上(c)にカーソルを乗せている場合

a b c d e
    ^

feキーを押下するとこの :point_down: 前方のeの位置に移動し

a b c d e
        ^

Fbを押したならこの後方のbの位置に

a b c d e
  ^

teなら前方のeの手前に

a b c d e
       ^

Taなら後方のbの手前に移動します。

a b c d e
 ^
  • f{char}: 後方の{char}に移動
  • F{char}: 後方の{char}に移動
  • t{char}: 前方の{char}の手前に移動
  • T{char}: 前方の{char}の手前に移動

もちろんtextobjとしても使用できます。

a b c d e
    ^

:arrow_down:
dfd
:arrow_down:

a b  e
    ^

話はもう一度noremapに戻って……

nnoremapはnormalモードに対するキーマッピングの定義で、他には以下の*noremapコマンドがあります。

_ :inoremap: insertモード用
_ :vnoremap: virtual + selectモード用
_ :cnoremap: cmdモード用
_ :tnoremap: terminal
_ :noremap: 全部用

あれ……fnoremapがないよ?

概要

fmap.vimは:FNoremapコマンドを提供します :flushed:

例えば以下のように設定することで

nmap f <Plug>(fmap-forward-f)
nmap F <Plug>(fmap-backward-f)
nmap t <Plug>(fmap-forward-t)
nmap T <Plug>(fmap-backward-t)
" 全角括弧の開き
FNoremap p

normalモードの fp キーでこのような :point_down: カーソルジャンプをすることができます!

a ( b c d ) e
     ^

:arrow_down:

a ( b c d ) e
           ^

標準のfFtTを潰したくない場合は<leader>f (FtT) にマッピングすると便利です。

nmap <leader>f <Plug>(fmap-forward-f)
nmap <leader>F <Plug>(fmap-backward-f)
nmap <leader>t <Plug>(fmap-forward-t)
nmap <leader>T <Plug>(fmap-backward-t)

事例

fmap.vimはfFtTでひらがな、カタカナ、句読点等を打つのが面倒だったために作られました。
ですので日本語記事の執筆において、特に助けになります。
任せてください。

例えばこんなMarkdownのコードがあったとします。

にこ「ええ! よく『関数型プログラミングにおいて再帰を直に書く必要はなく、畳込みを用いることができる』っていう言論があるけれど、Semigroupを使えば畳み込みすら直に扱わなくていいってことよ」

1行がとっても長くて、特定の場所にジャンプしにくいですね。
行頭から「畳込みを用いることができる」の「畳」にジャンプしたい場合はf(IME切り替え)たたみ(変換)(Enter)(IME切り替え)もしくはf(IME切り替え)、(Enter)(IME切り替え)という長ったらしいストロークが必要です。

これが普通のMarkdown(※)ならの後に改行を入れてもいいのですが

にこ「ええ!
よく『関数型プログラミングにおいて再帰を直に書く必要はなく、
畳込みを用いることができる』っていう言論があるけれど、
Semigroupを使えば畳み込みすら直に扱わなくていいってことよ」

Qiita Flavor Markdownはなぜかコードの改行に対して実際の改行 (<br/>) を入れてしまうので、そのようにしたくない場合にその手は使えません。

※ CommonMarkのこと

ここでFNoreMap , 、を用いると、f,lのみでジャンプすることが可能になります。
その後fmap.vimはvim標準の;をコロしませんので、f,;lでSemigroupの「S」に飛ぶこともできます。

あるいはfmap.vimはデフォルトで'miで平仮名の「み」にジャンプするマッピングが有効になっているので、「畳」に飛ぶためにf'mihhしてもいいでしょう。

まとめ

fmap.vimはfFtTの後のキーに対してマッピングを定義するためのプラグインです。

日本語記事の執筆活動の支援を目的に作られました。
ただし機能はもっと一般的なものですので、日本語以外の言語でも役立つでしょう。

よければ使ってね :metal::flushed::metal:

end.jpg

16
3
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
16
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?