2013-07-31 2 views
2

У меня есть много пунктов меню, как эти:Как объединить записи меню для нормального и визуального режима?

nnoremenu <silent> 94.015.10 &MyMenu.Test\ :call Test("%","keyw2",keyw3")<CR> 
vnoremenu <silent> 94.015.10 &MyMenu.Test\ :<C-U>call Test("'<,'>","keyw2",keyw3")<CR> 

Один для обычного режима 'nnoremenu' и
One для визуального режима 'vnoremenu'

С теми же ключевыми словами, кроме первого («%», «<, '>»)

Невозможно объединить их вместе?

p.e. можно ли это сделать:

an <silent> 94.015.10 &MyMenu.Test\ :call Test("","keyw2",keyw3")<CR> 

и проверить в пределах функции, если активен нормальный режим или визуальный режим?

+0

Я хотел бы спросить, почему вы предпочитаете ': menu' команды над': карта 'команды !? – user1146332

+0

@ user1146332, Привет, чтобы ответить на ваш вопрос: с помощью команды меню я могу добавить его в выпадающем меню в интерфейсе gui. – Reman

+0

Я знаю это, но вы действительно используете меню в своих сеансах vim !? Просто из любопытства. – user1146332

ответ

1

Когда вы используете :an, визуальный режим автоматически прерывается с помощью <C-C>. Это означает, что больше нет способа восстановить режим (и ваш префикс <C-U> не нужен); если вам нужна информация о режиме, вы должны сохранить два разных определения меню.

Если вы хотите уменьшить дублирование кода, вам необходимо использовать другие средства, например. метапрограммирование (т. е. создание и :executing команд определения меню в цикле).

Edit: По желанию, вот пример того, как я бы решить это, чтобы избежать дублирования:

for [mode, range] in [['n', '%'], ['v', "'<,'>"]] 
    execute printf('%snoremenu <silent> 94.015.10 &MyMenu.Test\ :call Test(%s,"keyw2","keyw3")<CR>', mode, string(range)) 
endfor 
+0

Не могли бы вы привести краткий пример, как это сделать с метапрограммированием в цикле (или сказать мне, где больше узнать об этом)? – Reman

+0

@ Remonn: Вот вы где. Надеюсь, это поможет. –

+0

Спасибо Инго К. – Reman