2011-06-17 17 views
1

私は、スクリプト内にdate<Tab>のパターンを挿入マップして、現在の日付をYYYY-MM-DDの形式で挿入しました。Vimの挿入モードマッピングの動作を変更するには?

inoremap <script> <silent> <buffer> date<Tab> <C-R>=strftime("%Y-%m-%d")<CR> 

私はタブを押したときにのみ、Vimは唯一の最後の文字が入力された表示され、それはかなりanoyingで挿入モードでパターンを入力して、代わりの日付文字列でそれを交換する前に、完全なパターンの表示を開始私はそれを使用したくないとき。私は、例えば、 '日付' を入力していた場合、これはVimのディスプレイが( '|は' カーソル表現である)ものです:

  • |d
  • |a
  • |t
  • data|

また、のタブを使用するSnipmate vimプラグインをインストールしました。 k私はスニペットをコードテンプレートで置き換えています。スニペットを入力しているときは、前に説明したように振る舞いません。 Snipmateが実行するのは、Tabキーのみをマッピングすることです。キーを押すと、前の単語が取得され、スニペットの1つと一致するかどうかが確認されます。

  • Vimは一切そのマッピングにそれを変更する前に、完全なパターンを表示設定しないための方法があります:私は2つの質問を残して、そのうちの1への答えは私の問題を解決し、言っ

  • 同じマッピングを使用する2つのプラグインを使用できますか?もし私がのタブキーをマップしているように、そしてカーソルの前の単語が「日付」であるときはいつでも、私のプラグインは動作し、他の場合にはSnipmateが動作します。

+0

私はここにあなたの最善の策は、あなたが望むものに展開「日付」という名前のスニペットを書くことになると思います。私が正しくリコールすれば、スニペットはスニペット内のネイティブのvimscriptをサポートしているので、これは非常に簡単に行うことができます。あなたの最初の質問に対する答えは「いいえ」です。 –

+1

あなたが望むものを達成する最良の方法は、挿入モードで入力すると自動的に展開される略語です。あなたは[私が与えたこの回答](http://stackoverflow.com/questions/6344750/how-do-i-insert-current-time-into-a-file-using-vim/6344929#6344929)を参照することができます。現在の時間の挿入方法に関する質問(http://stackoverflow.com/questions/6344750/how-do-i-insert-current-time-into-a-file-using-vim) 。 – abcd

+0

@Randy Morris - スクリプトのためのマッピングなので、私にとってはうまくいくだろうが、誰もがSnipmateを使用するとは想定できない。しかし、ありがとう! – freitass

答えて

0
  • 私が知っているように、それはキーマップマッチングにおけるいくつかのマップの一部である場合Vimはあなたが入力するすべての文字を食べるようになる「検索マップ」の状態を、「オフ」にするそのような設定があるようですん。

  • Vimは特定のアクションに1つのキーのみをバインドすることができるので、キーを2つの方法で行うことはできません。一方、 "展開"アクションを実行するために他のキーを使用するように "snipmate"を構成することができます。そして、それはあなたが主要な紛争の問題に会うとき、通常の方法でなければなりません。また、あなたが何かを行うには、「省略」を使用することができます

    :abbreviate <expr> :date: strftime("%Y-%m-%d") 
    

    をしかし、私はそれのため申し訳ありません、「食べるマッチング」もここに存在します。

2

最初の回答はノーです。

第二にはノーもあるが、それはエミュレートすることができます。

一般的な方法は、(fraworが必要です)以下の通りです:

" plugin/tab.vim 
execute frawor#Setup('0.0', {'@/mappings': '0.0'}) 
" Make sure that mappings were set up 
runtime! after/plugin/snipMate.vim 

" Get information about already existing mapping 
" (it was defined by snipmate) 
let s:snipmap=s:_r.map.maparg('<Tab>', 'i', 0) 

" Create a new mapping with unique lhs 
let s:snipmap.lhs='<SNR>'.s:_sid.'_OldSnipMap' 
call s:_r.map.map(s:snipmap) 

function s:F.insdate() 
    if getline('.')[:(col('.')-1)][-4:] is# 'date' 
     return repeat("\<BS>", 4).strftime("%Y-%m-%d") 
    else 
     " Here is the magic: I have a choice to either use remappable mapping 
     " or <C-\><C-o>:call feedkeys()<CR> workaround for nore mapping 
     return "\<C-\>\<C-o>:call feedkeys(\"\\<SNR>".s:_sid."_OldSnipMap\")\n" 
    endif 
endfunction 
call s:_f.mapgroup.add('Tab', {'tab': {'lhs': '<Tab>', 'rhs': s:F.insdate, 'mode': 'i'}}) 

注あなたの例では、あなたが<Tab>をマッピングしていないことを、あなたがマップdate<Tab>だから、スニペットマッピングに干渉しない。上記のコードでは、IMAPプラグインと同じ方法を使用しています。{lhs}の最後のキーが押されたときに、以前のキーがバッファにあるかどうかを確認します。彼らがそれらを削除し、代わりに{rhs}を挿入する場合。したがって、遅くても動作する場合でもdate<Tab>と入力することができます。

注2:これは一般的な方法です。あなたは、単に<Tab> {RHS}を見て、frawor依存性やコードのほとんどをドロップすることができます。

function s:Insdate() 
    if getline('.')[:(col('.')-1)][-4:] is# 'date' 
     return repeat("\<BS>", 4).strftime("%Y-%m-%d") 
    else 
     return "\<C-g>u\<C-r>=TriggerSnippet()\n" 
    endif 
endfunction 
inoremap <Tab> <C-r>=<SID>Insdate()<CR> 
関連する問題