2015-06-12 4 views
1

Я нашел this function:программирует дифф ВИМ функции ВИМ дифф отображение

" Set up a keymapping from <Leader>df to a function call. 
" (Note the function doesn't need to be defined beforehand.) 
" Run this mapping silently. That is, when I call this mapping, 
" don't bother showing "call DiffToggle()" on the command line. 
nnoremap <silent> <Leader>df :call DiffToggle()<CR> 

" Define a function called DiffToggle. 
" The ! overwrites any existing definition by this name. 
function! DiffToggle() 
    " Test the setting 'diff', to see if it's on or off. 
    " (Any :set option can be tested with &name. 
    " See :help expr-option.) 
    if &diff 
     diffoff 
    else 
     diffthis 
    endif 
:endfunction 

Теперь я хотел бы добавить дополнительное условие, если есть выбранный текст (визуальный режим) вызвать другую команду вместо diffthis , Linediff

Чтение функции Я предполагаю, что мне нужна дополнительная опция для тестирования, например, с &dif, но с визуальной опцией. Что-то вроде:

function! DiffToggle() 
    if &dif 
     diffoff 
    elseif &visual 
     Linediff 
    else 
     diffthis 
    endif 
:endfunction 

Это не работает, но есть ли у кого-нибудь подсказки, чтобы заставить его работать? Кроме того, было бы очень полезно использовать любую ссылку о том, что и как установить переменные такого типа в vim.

Редактировать Я закончил с этим в моем vimrc, (работы):

"LINEDIFF/VIMDIFF 
"-------------- 

nnoremap <silent> <Leader>df :call DiffToggle('n')<CR> 
xnoremap <silent> <Leader>df :call DiffToggle('x')<CR> 

function! DiffToggle(mode) range 
    echo "difftoggle..." 
    if &diff 
     diffoff 
     echo "diffoff..." 
    else 
     if a:mode=='x' 
      echo "linediff..." 
      echo a:firstline."---".a:lastline 
      call linediff#Linediff(a:firstline, a:lastline) 
     else 
      echo "diff..." 
      diffthis 
     endif 
    endif 
:endfunction 
+0

'ElseIf имеет ('визуальный') '? ': help has()' –

+0

Или если вам нужно проверить текущий режим (визуальный, вставить, обычный и т. Д.), Вызывается 'mode()'. –

+0

имеет() только сообщает вам, поддерживается ли функция, поэтому в моем случае всегда возвращается 1 – vivoconunxino

ответ

3

Просто позвоните немного другую функцию от xnoremap <Leader>df ...? Этот вызов будет вызываться, когда вы находитесь в визуальном режиме.

Или пройти режим в качестве аргумента в вашу функцию:

nnoremap <silent> <Leader>df :call DiffToggle('n')<CR> 
xnoremap <silent> <Leader>df :call DiffToggle('x')<CR> 

... и проверить a:mode внутри вашей функции, имеющей следующий прототип:

function! DiffToggle(mode) 
+0

спасибо за подсказку, я попробую завтра и дам вам знать – vivoconunxino

+0

Hi Laser, я пробовал, но не сделал работаем правильно, теперь он выполняет DiffToggle один раз в строке, выбранной в visualmode. Могу ли я заставить его выполнить его только один раз? – vivoconunxino

+0

Я думаю, вам нужно добавить ключевое слово 'range' в ваш прототип функции (' h: function', '/ range')" \t \t \t Когда добавлен аргумент [range], ожидается, что функция будет заботиться самого диапазона. Диапазон передается как «a: firstline» и «a: lastline». Если [диапазон] исключен, «: {range} call» вызовет функцию для каждой строки в диапазоне, с помощью курсора в начале каждой строки. См. | function-range-example |. " – VanLaser

Смежные вопросы