2014-10-01 5 views
1

Каждый так часто, я нахожу рисование простых диаграмм ASCII в Vim:Vim: центрирование текста в выборе

 +-----------+ 
... --> | foo  | --> ... 
     +-----------+ 

Большую часть времени там проводится обеспечение текст центрируется:

 +-----------+ 
... --> | foo | --> ... 
     +-----------+ 

К сожалению , до сих пор мне не удалось автоматизировать этот процесс: я бы предположил, что вы выбираете поле (например, «foo» плюс ведущее/конечное пустое пространство) в визуальном режиме, затем вводите команду для центрирования этого выбора (встроенный Vim-модуль :center применяется к вся строка, которая мне не помогает.)

Что-то вроде этого уже существует? Если нет, как я могу создать простой скрипт для этой конкретной операции?

+0

я написал сценарий, чтобы блокировать тексты, он поддерживает 'с, г, L' выравнивание. вы можете проверить, полезно ли это: https://github.com/sk1418/blockit – Kent

+0

Это выглядит очень похоже на то, что мне нужно, но я изо всех сил старался заставить его работать должным образом в моем предварительном тестировании: я выбрал «foo», (плюс окружающие пробелы) и использовали ': '<,'> Block' - но это переформатировало всю строку, а не только одну. – AnC

+0

«blockit» не будет делать то, что вы хотите. Он также добавляет «ящик». но вы можете посмотреть, как была выполнена часть выравнивания. – Kent

ответ

6

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

Примечание

  • , что это работает только для выбора в одной строке.
  • также не следует выбирать символы границы (например, | в вашем примере).
  • он работает только для визуального выбора
  • создать v-mapping, если вам это нравится.
  • если он не подходит для ваших нужд, пожалуйста, измените функцию.

    function! GetVisual() 
        try 
         let v_save = @v 
         normal! gv"vy 
         return @v 
        finally 
         let @v = v_save 
        endtry 
    endfunction 
    
    fun! CenterMe() 
        let v = GetVisual() 
        "let l = getline('.') 
        let lre = '^\zs\s*\ze\S' 
        let rre = '\s*$' 
        let sp= matchstr(v,lre) 
        let sp .= matchstr(v,rre) 
        let ln=len(sp) 
        let v = substitute(v,lre,sp[:ln/2-1],'') 
        let v = substitute(v,rre,sp[ln/2:],'') 
        let ve_save = &virtualedit 
        let v_save = @v 
        let &virtualedit = 'all' 
        call setreg('v', v,visualmode()) 
        normal! gvx"vP 
        let @v = v_save 
        let &virtualedit = ve_save 
    endf 
    

Это работает как:

enter image description here

+0

Это в значительной степени то, на что я надеялся - теперь мне просто нужно понять код ... Большое спасибо! – AnC

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