2012-08-24 37 views
0

我有以下幾點:是否可以使用<C-R> =與VIM命令?

map <F6> :SCCompile<cr> 
map! <F6> <c-r>=SingleCompile#Compile()<cr> 

我想在第二映射使用:SCCompile過,這可能嗎?

目前我有另一個命令,我真的不想包裝在一個函數調用。我在插入模式下使用<c-r>=,因爲它不會創建撤銷點,並且除了這個限制外,它一直效果不錯。我試過execute但它不起作用。

+0

你幾乎總是要使用'的noremap'代替'remap'。如果你使用重映射,有一天你會破壞你的設置。看[這裏](http://learnvimscriptthehardway.stevelosh.com/chapters/05.html)爲什麼。 –

+0

@NielsBom謝謝。 –

回答

1

你可以做這樣的事情:

​​

的命令不是簡單:

  • 在這裏,我們要求Vim離開<c-r>=
  • 使用<lt>允許後執行某些鍵在命令行模式下擴展<cr>而不是在<c-r>=
  • 使用?:運營商忽略由feedkeys()函數返回的值

請參閱:help feedkeys()

+0

直接使用''有什麼好處?奇科想避免''因爲它創建了一個撤消點。 –

+0

@IngoKarkat在兩種情況下,我都沒有真正看到''創建撤消點(我嘗試過':undolist')。對於我來說,上面所寫的兩條命令只是爲了減少代碼重複,第二條命令應該使用' ='。但是,如果它與直接使用''相同,爲什麼它被接受? – xaizek

+0

對我來說,':undolist'顯示'N個變化',其中N> 1;另外,'u'逐位刪除輸入的文本。 –

0

你可以建立在我最近的similar question的答案上。這是完全一樣的問題:像:call,定製Vim命令不返回任何東西,但<C-R>需要返回的東西表達:

function! SingleCompileWrapper() 
    SCCompile 
    return '' 
endfunction 

map! <F6> <C-R>=SingleCompileWrapper()<CR> 
+0

我真的不想像我說的那樣寫一個包裝。 –