Hatena::Groupvim

bless {category => 'vim'}, shift

2010-01-30現在のfoldのみ開いた状態にする このエントリーのブックマークコメント

func! s:fold_current_expand()
    silent! %foldclose!
    normal! zvzz
endfunc
nnoremap z<Space>   :call <SID>fold_current_expand()<CR>

ka-nachtka-nacht2010/01/30 19:16nnoremap z<Space> zMzvzz

tyrutyru2010/01/31 09:43> id:ka-nacht
こんな簡単にできるとは!
早速.vimrcを書き直しました。
ありがとうございます。

EnhriimaaEnhriimaa2012/03/25 15:35Full of slainet points. Don't stop believing or writing!

gyowqrrfzsqgyowqrrfzsq2012/03/25 18:475K1occ <a href="http://vensjxwkcdfr.com/">vensjxwkcdfr</a>

wrbtznjwrbtznj2012/03/27 01:10yaHrYs <a href="http://cxzuaayvlpug.com/">cxzuaayvlpug</a>

dczafdadczafda2012/03/27 21:23fLkrCr , [url=http://irbypyyutosp.com/]irbypyyutosp[/url], [link=http://lhxpzuegernv.com/]lhxpzuegernv[/link], http://xnthracckxbt.com/

トラックバック - http://vim.g.hatena.ne.jp/tyru/20100130

2010-01-16<C-k>でEmacsっぽく行末までを削除 at インサートモード・コマンドライン このエントリーのブックマークコメント

追記:

よりEmacsっぽく、インサートモードで行末にいる時は次の行を連結するようにした。

インサートモード

inoremap <C-k> <C-o>D

冒頭で言ったように、よりEmacsっぽくするならこんな感じ。

func! s:kill_line()
    let curcol = col('.')
    if curcol == col('$')
        join!
        call cursor(line('.'), curcol)
    else
        normal! D
    endif
endfunc
inoremap <C-k>  <C-o>:<C-u>call <SID>kill_line()<CR>

join!、normal!ってのがなんかいいですね(ぇ

コマンドラインモード

let g:vimrc_saved_cmdline = ''
func! s:save_front()
    let g:vimrc_saved_cmdline = strpart(getcmdline(), 0, getcmdpos() - 1)
    return ''
endfunc
cnoremap <Plug>(vimrc-save-front) <C-r>=<SID>save_front()<CR>
cnoremap <Plug>(vimrc-delete-all) <End><C-u>
cnoremap <Plug>(vimrc-insert-saved) <C-r>=g:vimrc_saved_cmdline<CR>
cmap <C-k> <Plug>(vimrc-save-front)<Plug>(vimrc-delete-all)<Plug>(vimrc-insert-saved)

id:thincaさんから一行でできると教えていただきました。

cnoremap <C-k> <C-\>e getcmdpos() == 1 ? '' : getcmdline()[:getcmdpos()-2]<CR>

(2012/04/04 追記)

ふと今の設定も載せてみる。

上の設定冗長すぎる・・・2年前か・・・

inoremap <expr> <C-k> "\<C-g>u".(col('.') == col('$') ? '<C-o>gJ' : '<C-o>D')
cnoremap <C-k> <C-\>e getcmdpos() == 1 ? '' : getcmdline()[:getcmdpos()-2]<CR>

thincathinca2010/01/16 18:07> コマンドラインモード
cnoremap <C-k> <C-\>egetcmdline()[:getcmdpos()-2]<CR>

tyrutyru2010/01/16 20:16まさかワンライナーでできるとはw id:thinca++
行頭にいる(getcmdpos() == 1)時置き換えできてなかったのでちょっと修正して追記してみました。

# 文字列をスライスで取り出せるのをすっかり忘れてた...
# あと<C-r>=と<C-\>eって同じかと思ってたけど、<C-r>=は挿入して、<C-\>eは全部を置き換えるのか...これは便利。

thincathinca2010/01/16 20:24ああ、すいません。その場で作って良くテストもせずに書き込みました…。
修正どうもです。

KuanishKuanish2013/03/02 23:37It's really great that peolpe are sharing this information.

KuanishKuanish2013/03/02 23:37It\'s really great that peolpe are sharing this information.

トラックバック - http://vim.g.hatena.ne.jp/tyru/20100116

2010-01-06()の閉じ括弧などを自動的に閉じる このエントリーのブックマークコメント

ふとはてブこんなのを見つけました。

どうやら()を自動的に閉じる設定のようです。(多分)

ちょうどこの設定を色々弄ったりしてて、やっと自分なりの最適解に辿り着いたのでちょっとメモしてみます。


arpeggio.vim

といってもarpeggio.vimを導入しただけです。

このプラグインは簡単に言えばマッピングの「同時押し」をサポートするものです。

例えばこんな設定があったとします。

Arpeggio noremap! $( ()<Left>

こうするとインサートモードとコマンドラインモードで「$」と「(」を同時に押すと「()<Left>」が実行されることになります。

最初は

Arpeggio noremap! () ()<Left>

としてたのですが、右手の中指と薬指で同時に押すのが案外辛かったため最終的には上の設定にしました。

僕の場合「$」を押すのが(Perlの経験からか)そんなに辛くなく、上下の位置的にも「(」と同じ位置にあるため、両手で押しやすかったというのがこのマッピングにした理由でもあります。


同時押しの何がうれしいか

インサートモードやコマンドラインモードなどでは入力したキーがそのまま入力されるため、Escape, Alt, Ctrl, Shiftなどのメタキーと組み合わせないと副作用のあるマッピングができてしまいます。

そういうことを気にせずマッピングできるため、自分は随分とマッピングの選択肢が増えました。

また当然ノーマルモードなどでもマッピングが可能です。


設定を晒してみる

let g:arpeggio_timeoutlen = 70
call arpeggio#load()

Arpeggio noremap! $( ()<Left>
Arpeggio noremap! 4[ []<Left>
Arpeggio noremap! $< <><Left>
Arpeggio noremap! ${ {}<Left>

Arpeggio noremap! $) \(\)<Left><Left>
Arpeggio noremap! 4] \[\]<Left><Left>
Arpeggio noremap! $> \<\><Left><Left>
Arpeggio noremap! $} \{\}<Left><Left>

Arpeggio noremap! #( 「」<Left>
Arpeggio noremap! 3[ 『』<Left>
Arpeggio noremap! #< 【】<Left>
Arpeggio noremap! #{ 〔〕<Left>

Arpeggio inoremap gk     <C-o>O
Arpeggio inoremap gj     <C-o>o

silent Arpeggio nnoremap <silent> <Leader>1    :call ChangeEncoding()<CR>
silent Arpeggio nnoremap <silent> <Leader>2    :call ChangeFileEncoding()<CR>
silent Arpeggio nnoremap <silent> <Leader>3    :call ChangeNL()<CR>

" SKK like mappings (japanese arrows)
Arpeggio noremap! zk ↑
Arpeggio noremap! zl →
Arpeggio noremap! zj ↓
Arpeggio noremap! zh ←

まず

let g:arpeggio_timeoutlen = 70

はそれぞれのキーが何msの間に押されたら「同時押し」とするかの設定です。

自分はデフォルトの40msだとちょっと短すぎる気がしたので70msにしました。


そして次の

call arpeggio#load()

は:Arpeggioコマンドを.vimrcで使う場合に必要となるものです。

Vimの設定ファイルは.vimrc、その次に.vim/plugin/*.vimが読み込まれます。

が、arpeggio.vimは.vim/autoload/arpeggio.vim*1にほとんど書かれているので、順番はあまり関係ありません。

ただautoloadというのは関数のみなので、コマンドは定義することができません。

なので関数のみのインターフェースを使うならこの行は要りませんが、

可読性のため、:Arpeggioコマンドを定義するためにarpeggio#load()を実行しています。


そしていよいよマッピングの設定です。

Arpeggio noremap! $( ()<Left>
Arpeggio noremap! 4[ []<Left>
Arpeggio noremap! $< <><Left>
Arpeggio noremap! ${ {}<Left>

Arpeggio noremap! $) \(\)<Left><Left>
Arpeggio noremap! 4] \[\]<Left><Left>
Arpeggio noremap! $> \<\><Left><Left>
Arpeggio noremap! $} \{\}<Left><Left>

Arpeggio noremap! #( 「」<Left>
Arpeggio noremap! 3[ 『』<Left>
Arpeggio noremap! #< 【】<Left>
Arpeggio noremap! #{ 〔〕<Left>

自分はVimperatorの経験からか数字キーに手を伸ばすのも慣れてしまったため苦痛には感じませんが、遠い数字キーを使う必要はありません。

ただ覚えやすさからこういうマッピングにしたというだけです。


Arpeggio inoremap gk     <C-o>O
Arpeggio inoremap gj     <C-o>o

これはインサートモード中に次の行/前の行に改行する設定です。

行の途中などにいても改行(次/前の行にジャンプ)できるので便利です。

前は<C-CR>と<S-CR>に割り当てていたのですが、このマッピングgVimでないとマッピングできませんでした。

たまに端末版Vim(?)も使うのでこの設定にしました。


silent Arpeggio nnoremap <silent> <Leader>1    :call ChangeEncoding()<CR>
silent Arpeggio nnoremap <silent> <Leader>2    :call ChangeFileEncoding()<CR>
silent Arpeggio nnoremap <silent> <Leader>3    :call ChangeNL()<CR>

これらの関数内ではprompt.vimを使っています。

prompt.vimに関してはいつか紹介します。

現在自分が開発しているプラグインで、プロンプト用のインターフェースを提供するものです。

興味があったらGithubのリポジトリを訪れてください。


" SKK like mappings (japanese arrows)
Arpeggio noremap! zk ↑
Arpeggio noremap! zl →
Arpeggio noremap! zj ↓
Arpeggio noremap! zh ←

あとこの設定は矢印(↑→↓←)をSKKみたく変換せずに入力できると便利かな、と一瞬思って設定したのですが結局使ってません。どうしてもこういうことがやりたかったらIMをSKKに変えるか、VimでのみSKKを使いたかったらskk.vimというものがあります。


おわり

       \ヽ, ,、
        `''|/ノ
         .|
     _    |
     \`ヽ、|
       \, V
         `L,,_
         |ヽ、)
         .|
        /                   ,、
   _,,....,,_  /                  ヽYノ
-''":::::::::::::`''.|                 r''ヽ、.|
ヽ:::::::::::::::::::::| :\                ー-ヽ|ヮ
 |::::::;ノ´ ̄ | :::::::\_,. -‐ァ     __   ___`|   ______
 |::::ノ   ヽ、ヽr-r'"´  (.__   ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、
_,.!イ_  _,.ヘーァ'二ハ二ヽ、へ,_7   'r ´          ヽ、ン、
::::::rー''7コ-‐'"´    ;  ', `ヽ/`7 ,'==─-      -─==', i
r-'ァ'"´/  /! ハ  ハ  !  iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |
!イ´ ,' | /__,.!/ V 、!__ハ  ,' ,ゝ レリイi (ヒ_]     ヒ_ン ).| .|、i .||
`!  !/レi' (ヒ_]     ヒ_ン レ'i ノ   !Y!""  ,___,   "" 「 !ノ i |
,'  ノ   !'"    ,___,  "' i .レ'    L.',.   ヽ _ン    L」 ノ| .|
 (  ,ハ    ヽ _ン   人!      | ||ヽ、       ,イ| ||イ| /
,.ヘ,)、  )>,、 _____, ,.イ  ハ    レ ル` ー--─ ´ルレ レ´
                                      ┼ヽ  -|r‐、. レ |
                                       d⌒) ./| _ノ  __ノ

締めの言葉が思いつきませんでした。

*1:autoloadに関しては:help autoload

トラックバック - http://vim.g.hatena.ne.jp/tyru/20100106

2010-01-01「GVimを再起動させる〜」をプラグインにしてみた このエントリーのブックマークコメント

SimbarasheSimbarashe2012/03/25 21:29It's wonedrufl to have you on our side, haha!

トラックバック - http://vim.g.hatena.ne.jp/tyru/20100101

2009-12-31DumbBuf.vimその後 このエントリーのブックマークコメント


コメント頂いたりしたので思い出しました。

DumbBuf.vimは現在随分前回のと色々変更点があるのですが、まだChangeLogにも書いてないし、そのまとめも兼ねてここに書いてしまおうと思います。

あとこのエントリを書いてるたった今明けました。おめでとうございます。


...とここまで列挙して思ったより少なかったので困惑しています。

また、<Plug>(dumbbuf-open)を他のキーにマッピングしたい方は以下の設定を.vimrcに書いてください。

let g:dumbbuf_no_default_hotkey = 0
map 好きなマッピング <Plug>(dumbbuf-open)

では、vim.orgに投稿してきます。皆さんよいお年を。



追記

...と、かっこよく締めたと思ったらバグ見つけました。

問題解決に後々面倒くさそうなことになりそうなので、<Plug>(dumbbuf-open)の件はなかったことにしてください。

UTCの0時までにはバグ修正します。

俺、絶対0時にvim.orgにアップロードして、世界中のVimmersにHappy New Yearって言ってやるんだ...ほんとはJSTの予定だったけど。


# バッファを開くマッピングにトグルするキーを割り当ててるけど、

# キーが2文字以上だと失敗する...

# ただしgg(バッファ内では念のため素のggにマッピングされてある)は働く。他の2文字以上のキーも働く。なんで?

#

# :call feedkeys(';b', 'n')だと動かないけどfeedkeys(';b', 'm')だと動く。なんで?

#

# ユーザ定義の2文字以上のマッピングが入力できない?

#

# あー`<buffer>`のマッピングが優先されるけど、

# そのまま`<buffer>`でないマッピングにフォールバックはしないのか?

# 優先って言葉にフォールバックは含まれないのか?(そんなことなさそうだけど...

#

# 英語版ヘルプ見たら

# The local buffer mappings are used before the global ones.

# と書いてある。

# やっぱフォールバックしそうなもんだけど。

#

# そもそも<Leader>bだけ動かないのはなんでだろう...


...えーと結局g:dumbbuf_timeoutlenというオプションを増やし、バッファ内での&timeoutlenを決められるようにしました。

これまでは0で、もし候補があっても即座に1文字目のマッピングが起動してましたが、g:dumbbuf_timeoutlenでキーを押してタイムアウトまでの時間が決められるということです。

これで解決ですね!(逃げたとか言わないでください



宣伝

現在prompt.vimというプラグインを書いてます。

元々のアイデアは.vimrcに書いていたメニュー付きリストを出す関数ですが、それを機能の一部として、PerlのIO::Prompt*1という最高にクールなモジュールインターフェースを真似たものを作ろうということで、現在作業中です。

まぁ便利なプロンプト関数を提供するだけのものなので、使わない人は使わないかもしれませんが。

*1:案外日本での検索結果が少ない...?(これぐらい?)Perl Hacksには載ってるのですが...

JulioJulio2012/06/28 10:52It's a pleasure to find such rationality in an answer. Welcome to the dbeate.

cpenkyyloccpenkyyloc2012/06/29 04:39Gv9pQS <a href="http://wzwhoqamohas.com/">wzwhoqamohas</a>

crsyuwtqzrncrsyuwtqzrn2012/06/29 15:43xAhfpC , [url=http://lhmugqgqzvcy.com/]lhmugqgqzvcy[/url], [link=http://ieqepjvqfgat.com/]ieqepjvqfgat[/link], http://ulbgoegnskum.com/

enmqitpcenmqitpc2012/07/01 01:26s4JYcp <a href="http://lyfcfenztuhb.com/">lyfcfenztuhb</a>

aqykjybuaqykjybu2012/07/01 06:19SQnI8R , [url=http://ayzabxcpjctl.com/]ayzabxcpjctl[/url], [link=http://kvarowslcoko.com/]kvarowslcoko[/link], http://zwmmakvazxfq.com/

トラックバック - http://vim.g.hatena.ne.jp/tyru/20091231