2014-10-06 2 views
1

я обычно хочу, чтобы изменить второй (или третий) атрибут в строку HTML:Возможно изменение Vim в N позиции линии? Например. ci2"

<div class="Something" data-change="TOBECHANGED">Test</div>

В настоящее время я делаю п» затем ; при необходимости затем CI «. Я понимаю, что я мог бы найти и заменить, но это не то, что меня интересует.

Тогда это произошло, что я должен быть в состоянии сделать что-то вроде C2I» (Change 2 In ") .Это не работает - возможно ли это? Если да, то какой правильный синтаксис?

+0

Вы можете использовать '3f'', чтобы перейти непосредственно к третьему' '', а затем использовать 'ci''. – jdehesa

+0

Да, возможно, это лучше, чем то, что я делаю сейчас, спасибо. пытаться просто невозможно? –

+0

Я не знаю, возможно ли то, что вы хотите ... поэтому я не опубликовал его в качестве ответа, это просто «связанное предложение». – jdehesa

ответ

1

С помощью встроенных команд это двухэтапный процесс: сначала найдите кавычки (например, через 3f"), затем выберите их (ci").

Но вы можете сделать это одним шагом через пользовательские текстовые объекты. У меня есть следующие, с помощью которого вы можете сделать c2if":

" af{c}, if{c}  a/inner [count]'th next {c} text object in the current 
"   line. 
" aF{c}, iF{c}  a/inner [count]'th previous {c} text object in the 
"   current line. 
"   For example, "dif(" would go to the next "()" pair and 
"   delete its contents. 
" Source: Steve Losh, https://bitbucket.org/sjl/dotfiles/src/tip/vim/.vimrc 
function! s:NextTextObject(scope, isBackward) 
    let l:char = ingo#query#get#Char() 
    if empty(l:char) | return | endif 

    let l:save_cursor = getpos('.') 
    let l:direction = (a:isBackward ? 'F' : 'f') 
    " Special case for "tag" text object. 
    let l:findChar = tr(l:char, 't', '>') 

    let l:nextTextObject = l:direction . l:findChar . 'v' . a:scope . l:char 

    " To handle [count], we can't just prepend it to the f/F command, as 
    " depending on the text object, there can be two identical delimiters that 
    " need to be skipped (e.g. in i", but not in i[). Instead, select each text 
    " object in turn, and then repeat at the corresponding border. 
    let l:count = v:count1 
    while l:count > 1 
     let l:cursor = getpos('.') 
      execute 'normal!' l:nextTextObject . "\<Esc>" . 
      \ (a:isBackward ? 'g`<' . (a:scope ==# 'i' ? "\<Left>" : '') : '') 
     if l:cursor == getpos('.') 
      call cursor(l:save_cursor[1:2]) 
      execute "normal! \<C-\>\<C-n>\<Esc>" | " Beep. 
      return 
     endif 
     let l:count -= 1 
    endwhile 

    execute 'normal!' l:nextTextObject 
    if mode() ==# 'n' 
     call cursor(l:save_cursor[1:2]) 
     execute "normal! \<C-\>\<C-n>\<Esc>" | " Beep. 
    endif 
endfunction 
onoremap <silent> af :<C-u>call <SID>NextTextObject('a', 0)<CR> 
xnoremap <silent> af :<C-u>call <SID>NextTextObject('a', 0)<CR> 
onoremap <silent> if :<C-u>call <SID>NextTextObject('i', 0)<CR> 
xnoremap <silent> if :<C-u>call <SID>NextTextObject('i', 0)<CR> 

onoremap <silent> aF :<C-u>call <SID>NextTextObject('a', 1)<CR> 
xnoremap <silent> aF :<C-u>call <SID>NextTextObject('a', 1)<CR> 
onoremap <silent> iF :<C-u>call <SID>NextTextObject('i', 1)<CR> 
xnoremap <silent> iF :<C-u>call <SID>NextTextObject('i', 1)<CR> 

Примечание: Это требует моего ingo-library plugin.

+0

Ingo, спасибо, если вы можете обновить ответ, просто чтобы прямо сказать, что это невозможно с «запасом» Vim. Я отмечу это как ответ. Я думаю, что важно, чтобы любые будущие поисковики знали, что это не так, возможно, используя метод, о котором я спрашивал. –

+0

Хорошо, сделано! –

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