2011-06-17 50 views
1

我已經在腳本中插入映射date<Tab>模式以插入格式爲YYYY-MM-DD的當前日期。如何更改Vim插入模式映射行爲?

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

當我開始插入模式下輸入模式,而不是按日期字符串替換它之前顯示完整的模式,只有當我按下標籤時,Vim只顯示最後一個字符類型的,這是很是煩人當我不想使用它。如果我輸入 '日期',比如,這是Vim顯示( '|' 是光標表示):

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

另外,我已經安裝了Snipmate vim插件,它使用了Tab k用代碼模板替換片段,當我輸入代碼片段時,它的行爲不像我之前描述的那樣。 Snipmate所做的只是映射標籤鍵,當按鍵時,它會得到前一個單詞並檢查它是否與其片段之一匹配。

這就是說,我會留下兩個問題和答案,其中一個解決我的問題:

  • 是否有配置VIM將其變爲其映射前不顯示完整的圖樣的方法嗎?

  • 我可以使用相同的映射有兩個插件嗎?就像我映射標籤鍵也一樣,並且每當光標前面的單詞是'date'時,我的插件就會起作用,而Snipmate會在其他情況下起作用。

+0

我覺得這裏最好的辦法是寫一個名爲「日期」是擴展到你想要的片段。如果我沒有記錯,snipmate支持原生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只能綁定一個鍵到一個特定的動作,所以沒有辦法讓一個鍵做兩件事情,你可能希望。另一方面,您可以配置「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>所以它不會干擾snipmate映射。上面的代碼使用與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>