Hatena::ブログ(Diary)

C++でゲームプログラミング

2014-01-10

[]textobj の両端へ移動する operator つくった

この記事は Vim Advent Calendar 2013 41日目の記事になります。

また、明日11日は21時から Vimプラグイン読書会が開催されます。

興味のある方は参加してみるとよいと思います。


さて、今回のネタですが、vim-operator-jump_side という operator を作成しました。

この operator は何をするのかというと textobj の先頭、もしくは末尾へと移動する operator になります。


[インストール]

NeoBundle "kana/vim-operator-user"
NeoBundle "osyo-manga/vim-operator-jump_side"

[設定]

" デフォルトではキーマッピングしていないので任意のキーにマッピングして下さい

" textobj の先頭へ移動する
nmap <Space>h <Plug>(operator-jump-head)
" textobj の末尾へ移動する
nmap <Space>l <Plug>(operator-jump-tail)

" こちらは該当する場所の外側へ移動する
" textobj の先頭へ移動する
nmap <Space>h <Plug>(operator-jump-head-out)
" textobj の末尾へ移動する
nmap <Space>l <Plug>(operator-jump-tail-out)

で、これで何が出来るのかというと例えば、

<Plug>(operator-jump-tail)iw

を行うと単語の末尾へ移動したり、

<Plug>(operator-jump-tail)i(

で、対応する次の ) へと移動することが出来たりします。

ぶっちゃけ、作ってみたものの有効かどうかは未知数です。

いくつかの既存の textobj と組み合わせると強力になったりするかもしれません。

たいていの場合は f でおk,という気もする。

あと

nmap <C-n> <Plug>(operator-jump-tail-out)iw

みたいなマッピングをすると面白いかも。

yoiyoi322yoiyoi322 2014/03/02 23:33 インデントの先頭に移動するものを仕立てたくて、
vim-operator-jump_side で何とかしようとしているのですがなかなか動作してくれなくて難儀してます。
アドバイスいただけないでしょうか。

以下に、vimrcで関係ありそうな部分を貼り付けます。
よろしくお願いします。

--
NeoBundleLazy 'kana/vim-textobj-user'

NeoBundleLazy 'kana/vim-textobj-indent', {
\ 'depends': 'kana/vim-textobj-user',
\ 'autoload': {
\ 'mappings': [['xo', 'ai'], ['xo', 'aI'], ['xo', 'ii'], ['xo', 'iI']]
\ }
\ }

NeoBundleLazy 'osyo-manga/vim-operator-jump_side', {
\ 'depends': ['kana/vim-textobj-user', 'kana/vim-textobj-indent'],
\ 'autoload': {
\ 'mappings': [
\ '<Plug>(operator-jump-head)',
\ '<Plug>(operator-jump-tail)',
\ ],
\ }
\ }

nmap <Leader><Leader> <Plug>(operator-jump-head)ai

osyo-mangaosyo-manga 2014/03/03 00:24 コメントありがとうございます。
NeoBundle "kana/vim-operator-user" は入っていますでしょうか。

yoiyoi322yoiyoi322 2014/03/03 01:09 kana/vim-operator-user をdependsに入れて解決することが出来ました。
# 実言うと textobjと勘違いしていました(汗
ありがとうございました

osyo-mangaosyo-manga 2014/03/03 01:11 りょーかいです。

yoiyoi322yoiyoi322 2014/03/03 01:37 いや〜便利です。カーソル移動がはかどります。
ありがとうございます。

一つ要望があります。
もし可能であればお願いしたいです。

vimの機能に選択中にOで選択範囲の先端と末尾をカーソル位置がトグルする機能がありますが、
これをvim-operator-jump_side に盛り込んでもらうことは可能でしょうか?

<Plug>(operator-jump-head)実行時にすでにカーソルが先頭位置にあれば、<Plug>(operator-jump-tail)を実行。
逆に<Plug>(operator-jump-tail)実行時にすでにカーソルが末尾位置にあれば、<Plug>(operator-jump-head)を実行。
カーソル位置が先頭(末尾)でなければすでに要されている<Plug>(operator-jump-head/tail)を実行

よろしくお願いします。

osyo-mangaosyo-manga 2014/03/03 15:17 ありがとうございます。
とりあず <Plug>(operator-jump-toggle) を追加しました。
カーソル位置が先頭であれば末尾に、末尾であれば先頭に移動します。
それ以外の位置の場合は先頭に移動します(これは Vim 側の仕様。
あとできれば github の Issues へコメントしてもらえると助かります。そちらのほうがやりとりがし易いので。

yoiyoi322yoiyoi322 2014/03/03 23:34 対応有難うございます。
快適に動作しいます。

今後リクエストの際はgithubに投げたいと思います。

osyo-mangaosyo-manga 2014/03/04 09:41 ありがとうございました:)
ところで『<Plug>(operator-jump-head)実行時にすでにカーソル位置が〜』という機能は微妙だと思ったので『<Plug>(operator-jump-toggle)』を追加したのですが、<Plug>(operator-jump-toggle) だけでよかったでしょうか。

yoiyoi322yoiyoi322 2014/03/04 22:19 自分のやりたいことはちょうど<Plug>(operator-jump-toggle)なのでちょうどよかったです。

yoiyoi322yoiyoi322 2014/03/04 22:22 その後、kanaさんのvim-textobj-indent と組み合わせて使っていたのですが、
連続toggle時外に出ちゃうなと悩んで
https://github.com/kana/vim-textobj-indent/issues/7
こんなやりとりをして、あたふた(汗、していました。

osyo-mangaosyo-manga 2014/03/04 22:26 > 自分のやりたいことはちょうど<Plug>(operator-jump-toggle)なのでちょうどよかったです。
了解っす。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証