2016-09-22 4 views
3

Возможно ли создать блок комментариев ASCII вокруг блока кода?Сделать поле ascii вокруг кодового блока в Vim

  • ASCII коробка должна быть достаточно умна расширить рамку вокруг максимальной ширины кода . Но он должен также очистить любые конечные пробелы.
  • Обратите внимание: в начале кода не должно быть строки столбца.
  • В моем коде, показанном ниже, ; является символом комментария.
  • Блок кода может содержать строки комментариев.
  • потока Работа может быть
    1. выбрать блок кода в визуальном режиме
    2. Применить изменения.

Ниже приведен пример.

Перед

; Convert to radians   
    theta45 = (theta + 45.)/!RADEG 
    theta90 = (theta + 90.)/!RADEG 
    theta = theta/!RADEG  
    Ey = Ey * normal    

    ; Engineering shear strain  
    Gxy = shear * Exy    

После

; -----------------------------------------; 
    ; Convert to radians      ; 
    theta45 = (theta + 45.)/!RADEG   ; 
    theta90 = (theta + 90.)/!RADEG   ; 
    theta = theta/!RADEG     ; 
    Ey = Ey * normal       ; 
              ; 
    ; Engineering shear strain    ; 
    Gxy = shear * Exy      ; 
; -----------------------------------------; 

То, что я пытался до сих пор

'<,'>s/^\(\s*\)\(.*\)$/\=join([submatch(1), ';', submatch(2), repeat('-', 50-len(submatch(1)) - len(submatch(2))), ';'], '') 

note Сначала я выбрал визуальный блок.

Проблемы, связанные с ней

  • это добавляет «-» символ каждой строки, вместо первой и последней строки
  • Она начинается с первой строки и заканчивается последней строке, я предпочитаю его имеют блок до и после выбранных строк.
  • Конечные пробелы не удаляются.
  • Поскольку у меня есть подсветка поиска, она выделяет весь визуальный блок после операции.

Вот как это выглядит:

;; Convert to radians   ------------------; 
    ;theta45 = (theta + 45.)/!RADEG------------------; 
    ;theta90 = (theta + 90.)/!RADEG------------------; 
    ;theta = theta/!RADEG  ------------------; 
    ;Ey = Ey * normal    ------------------; 
;--------------------------------------------------; 
    ;; Engineering shear strain ------------------; 
    ;Gxy = shear * Exy  ------------------------; 

Хотя, это не очень близко к тому, что я хочу получить. Я мог только зайти так далеко!

Спасибо за чтение и вашу помощь.

+1

Это не прямой ответ на ваш вопрос, но есть много бесплатных онлайн-инструментов, которые могут создавать красиво-отформатированные таблицы ASCII, учитывая некоторый вклад. Вот ссылка на один из них: https://ozh.github.io/ascii-tables/ –

ответ

0

Вот один улучшение (разбит на несколько строк для удобства чтения):

:'<,'>s/.*/\=submatch(0) . repeat(' ', 50-len(submatch(0)) + 2) . ';'/ | 
\ '>put ='; ' . repeat('-', 50) . ';' | 
\ '<put! ='; ' . repeat('-', 50) . ';' | 
\ nohlsearch 
  • Чтобы добавить строки для блока, используйте отдельные команды (:put); вы можете использовать метки визуального выделения ('< и '>), чтобы задать границы выбора. Регистр выражений = позволяет генерировать строки.
  • :nohlsearch очищает поиск подсветки

Вот результат:

; --------------------------------------------------; 
    ; Convert to radians        ; 
    theta45 = (theta + 45.)/!RADEG     ; 
    theta90 = (theta + 90.)/!RADEG     ; 
    theta = theta/!RADEG       ; 
    Ey = Ey * normal         ; 
                ; 
    ; Engineering shear strain      ; 
    Gxy = shear * Exy         ; 
; --------------------------------------------------; 

Есть еще некоторые вопросы:

  • Расчет длины работает только для печатаемых, не являющихся символов табуляции ASCII ,
  • Ширина жестко закодирована. Было бы лучше сначала определить максимальную длину блока.

Если вы действительно хотите разработать это, первый шаг, который я рекомендую, заключается в том, чтобы поместить все команды в :function.

Возможно, вы также захотите взглянуть на мой AlignFromCursor plugin, который занимается аналогичной проблемой (хотя бы для полной реализации проблемы :-).

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

+0

Спасибо Ingo. Он отлично работает. Благодарим вас за советы относительно очень удобного форматирования в среде совместной работы. Я запомню это. Еще раз спасибо. – Cricrazy

1

Как об этом:

<esc>'>o;<esc>'<O;<esc>v'>j:norm 51A <C-v><esc>51|Dr;<cr>:'<s/ /-/g<cr>:'>&&<cr> 

Объяснение:

Сначала нам нужно добавить дополнительные строки. Итак, визуальный режим <esc>, перейдите к концу предыдущего выбора и добавьте в него новую строку с точкой с запятой. '>o;<esc>. Затем вернитесь к началу предыдущего выбора и добавьте в него новую строку с точкой с запятой вверх '<O;<esc>. Теперь нам нужно запустить визуальный режим на этой линии, перейти к предыдущему концу и еще одну строку v'>j. Прямо сейчас, буфер выглядит так:

; 
Here 
are 
a whole bunch of 
uneven 
lines 
; 

и все это визуально выбрано. Затем нам нужно сделать каждую строку заполненной до 50 пробелов. Так,

:norm 51A <C-v><esc>51Dr; 

будет первым добавить 51 места, а затем перейти к 51-м столбце, удалить до конца, и заменить 50-й точкой с запятой.Теперь наш буфер выглядит следующим образом:

;            ; 
Here            ; 
are            ; 
a whole bunch of         ; 
uneven           ; 
lines           ; 
;            ; 

Теперь мы просто заменяющие пространства для черточек на начало выбора:

:'<s/ /-/g<cr> 

и сделать то же замену на конце выбора:

:'>&&<cr> 

Теперь буфер выглядит следующим образом:

;-------------------------------------------------; 
;Here            ; 
;are            ; 
;a whole bunch of         ; 
;uneven           ; 
;lines           ; 
;-------------------------------------------------; 

Очевидно, что вы, вероятно, захотите обернуть это в картографирование, функцию или макрос для удобства.

+0

спасибо за ответ. – Cricrazy