2017-01-04 4 views
1

У меня есть следующий XML-файл:выбрать несколько последовательных тегов XML в Vim

<outer> 
    <middle> 
    <inner>1</inner> 
    </middle> 
    <middle> 
    <inner>2</inner> 
    </middle> 
    <middle> 
    <inner>3</inner> 
    </middle> 
    <middle> 
    <inner>4</inner> 
    </middle> 
</outer> 

, где я бы выбрал весь middle2 тег с vat.

Есть ли способ расширить этот выбор, включив следующий тег middle (3) с некоторой комбинацией клавиш?

Мне было бы интересно только сделать это пометкой, то есть, если есть комбинация, которая всегда может использоваться независимо от структуры следующего тега.

ответ

0

После выбора первого блока тегов с vat нажмите CTRL + VJ (<c-v>j) это будет включать в себя следующую inner (3)

Edit:

для вашего нового Например, вы можете нажать 4$ после vat, чтобы получить блок тегов ниже.

Edit:

Я написал сценарий ExpandTagBlock, который позволяет расширить из же tagblock нажав F4:

nmap <silent> <F4> :set opfunc=ExpandTagBlock<CR>[email protected] 
vmap <silent> <F4> :<C-U>call ExpandTagBlock(visualmode(), 1)<CR> 

function! Check() 
    let [email protected]@ 
    if @@ =~# '\_s*<[^>]*\_.*</[^>]*>\_s*' 
     let str=substitute(str,'\_s*<[^>]*>\_.*\(<\/[^>]*>\)\_s*', '\1','g') 
     return str 
    else 
     return '' 
    endif 
endfunction 

function! ExpandTagBlock(type, ...) 
    let sel_save = &selection 
    let &selection = "inclusive" 
    let reg_save = @@ 

    if a:0 
     silent exe "normal! gvy" 
    elseif a:type ==# 'line' 
     silent exe "normal! '[V']y" 
    else 
     silent exe "normal! `[v`]y" 
    endif 
    let str=Check() 
    if str ==# '' 
     echohl ErrorMsg | echomsg "Selection not a Tag block !" | echohl None 
    else 
     silent exe "silent! normal! gv/".escape(str,'/')."/e\r" 
endif 

    let &selection = sel_save 
    let @@ = reg_save 
endfunction 

Вот Demo:

enter image description here


Расширение же блока тегов делается вниз только сейчас. Сценарий очень подходит для улучшения или модификации.

+0

Я догадался, вы имели в виду писать строчную 'j'? вместо этого вместо символа «J». Тем не менее, это просто работает linuxise, я изменил пример, чтобы уточнить вопрос – Chirlo

+0

. Для вашего нового примера вы можете развернуть его, введя '3j' или' 4 $ '. –

0

Ответ Meninx действительно правильный с ванильным vim. Следующее предполагает, что вы выбираете те теги, потому что хотите сделать для них материал. Возможно, вам вообще не нужно будет выбирать их, если у vim были дополнительные определения для текстовых объектов.

Если вы редактируете XML (или HTML и т. Д.) На регулярной основе, однако, вы можете посмотреть в плагины Тима Поупа, которые добавляют движения для «круглых скобок, скобок, кавычек, тегов XML» , и более." Это основывается на идее, что стиль редактирования vim основан на «текстовых объектах», то есть на словах, предложениях, параграфах и тэгах.

Например, в vanilla vim, caw будет «меняться вокруг слова». Используя подключаемый модуль, упомянутый ниже, вы сможете делать такие вещи, как cs'<q>, что «меняет окружающие одинарные кавычки с тегом <q>...</q>».

ВИМ-объемный добавляет общее назначение движения для «окружающей среды», которая является одним из наиболее часто используемых плагин во всех VIM Я составляю скрытые видел плавающих вокруг:

Вы также можете проверить vim-ragtag, который добавляет расширенную поддержку XML, HTML, PHP и т. Д. Тегов и улучшает vim-surround. Я не использую это сам, но это набор ярлыков, отображенных на C-X, т.е. C-X-<CR> окутает «Foo» в:

<foo> 
^ 
</foo> 

Другой соперник machakann-х ВИМ-сэндвич , Проверьте это здесь:


Если вы не имеете VIM плагин менеджер, может я предлагаю использовать junegunn's vim-plug.

После ВИМ-вилки set up, установка первых двух плагинов будет столь же легко, как добавить следующие строки в .vimrc:

Plug 'tpope/vim-surround' 
Plug 'tpope/vim-ragtag' 

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

  • Нет связанных вопросов^_^