как я могу свести в таблицу абзацы с пробелом в качестве единственного разделителя

У меня есть следующий фрагмент конфигурации nagios. Я не мог придумать команду tabularize для табличных значений параметров, которые разделены только табуляцией/пробелами.

define service{
    use                             local-service,srv-pnp         
    name        http
    service_description             http
    check_command     check_http!-w 5 -c 10 -H www.kpoint.com -u /
    register      0
}

РЕДАКТИРОВАТЬ:

Ожидаемый результат

define service{
    use                   local-service,srv-pnp         
    name                  http
    service_description   http
    check_command         check_http!-w 5 -c 10 -H www.kpoint.com -u /
    register              0
}

Есть ли альтернатива табулированию?


person Manish Sapariya    schedule 23.05.2014    source источник
comment
Что ты хочешь делать?   -  person pfnuesel    schedule 23.05.2014
comment
Пожалуйста, укажите ожидаемый результат; ваши неудачные попытки также дадут понимание.   -  person Ingo Karkat    schedule 23.05.2014
comment
Этот сработал. :Tab /^\s*\w* [Ссылка на этот пост][1]. [1]: stackoverflow.com/questions/11497593/   -  person Manish Sapariya    schedule 23.05.2014
comment
@ManishSapariya, ты почти был прав. :Tabularize/^\s\+\w*/ Пожалуйста, опубликуйте это как ответ   -  person Peter Rincker    schedule 23.05.2014


Ответы (2)


Следующая команда делает свое дело.

:Tabularize /^\s*\w*

Ссылка, хотя и не отвечает на точный вопрос, есть ответ.

person Manish Sapariya    schedule 24.05.2014

Очень грязный и быстрый способ сделать это:

function! GetOffsetSpacesAndReplace()
    let [line1,col1] = getpos("'<")[1:2]
    let [line2,col2] = getpos("'>")[1:2]
    let max_len = 0
    for i in range(line1, line2)
        let my_line = getline(i)
        let matching_str = matchstr(my_line, '^\s*\w*\s*')
        if len(matching_str) > max_len
            let max_len = len(matching_str)
        endif
    endfor
    for i in range(line1, line2)
        let my_line = getline(i)
        let matching_str = matchstr(my_line, '^\s*\w*\s*')
        let col_pos = len(matching_str)
        call setpos('.', [0, i, col_pos, 0])
        let @s=' '
        if max_len - col_pos > 0
            execute 'normal! "s'.(max_len - col_pos).'p'
        endif
    endfor
    return 1
endfunction

vmap <silent> <buffer> <F3> :call GetOffsetSpacesAndReplace()<CR>

Эта функция позволяет вам визуально выбрать внутренний блок, а затем запустить функцию для отступа по вашему желанию.

Это грязно в основном потому, что отвечает только вашим требованиям.

Чтобы использовать более гибкий инструмент для создания отступов, вам, вероятно, следует проверить отличный плагин vim-easy- выровнять.

Пользуюсь каждый день без проблем.

person FlogFR    schedule 23.05.2014
comment
@SteveC Ссылка на упомянутый пакет вряд ли противоречит правилам :). - person Veedrac; 23.05.2014
comment
Ты прав. Я сделал очень грязный и быстрый сценарий, чтобы ответить на вопрос. Но сохранил тот факт, что плагин будет более гибким :) - person FlogFR; 26.05.2014