여러 줄의 중간을 들여쓰기

여러 줄의 중간을 들여쓰기

나는 종종 다음과 같은 상황에 직면합니다.

title : Jekyll Bootstrap
tagline: Site Tagline
author :
  name : Name Lastname
  email : [email protected]
  github : username
  twitter : username
  feedburner : feedname

vim인수가 잘 정렬되지 않은 경우 들여쓰기가 한 줄씩 이동할 필요 없이 2개의 공백으로 정의되는 가장 가까운 들여쓰기에 정렬된 각 해당 인수로 형식을 지정하는 표준 방법이 있습니까? 예를 들면 다음과 같습니다:

title   : Jekyll Bootstrap
tagline : Site Tagline
author  :
  name      : Name Lastname
  email     : [email protected]
  github    : username
  twitter   : username
  feedburner: feedname

업데이트:

나는 믿는다테이블 형식.vim내가 찾고 있는 플러그인이지만 무언가가 블록의 일부여야 한다고 결정할 때 줄 시작 부분의 공백 수를 고려하는 정규식을 구성하는 데 어려움을 겪고 있습니다 Tabularize/:. 즉, 다음을 생성합니다.

title       : Jekyll Bootstrap
tagline     : Site Tagline
author      :
  name      : Name Lastname
  email     : [email protected]
  github    : username
  twitter   : username
  feedburner: feedname

는 다음의 예입니다.문서여기서 다음은 정규식을 통해 달성됩니다.

abc,def,ghi
a,b
a,b,c

:표로 표시 /^[^,]*\zs,/r0c0l0

abc,def,ghi
  a,b
  a,b,c

그러나 원래 예제보다 더 복잡한 다음과 같이 하위 블록을 평가하면서 동일한 블록의 앞 부분에 동일한 수의 공백이 있는 각 줄을 고려할 때 이것을 공식화하는 방법을 잘 모르겠습니다.

comments :
  provider : disqus
  disqus :
    short_name : jekyllbootstrap
  livefyre :
    site_id : 123
  intensedebate :
    account : 123abc
  facebook :
    appid : 123
    num_posts : 5
    width : 580
    colorscheme : light

다음과 같이 변환됩니다 tabularize\some_regular_expression_I_cant_figure_out.

comments :
  provider      : disqus
  disqus        :
    short_name    : jekyllbootstrap
  livefyre      :
    site_id       : 123
  intensedebate :
    account       : 123abc
  facebook      :
    appid         : 123
    num_posts     : 5
    width         : 580
    colorscheme   : light

답변1

그만큼표로 만들기vim용 플러그인은 당신이 원하는 것을 정확하게 할 수 있습니다. 타자치기까지 온다Tabularize /:

그러나 이것은 아마도 왼쪽의 들여쓰기를 유지하지 못할 것입니다.

업데이트된 질문을 수정하세요.: Tabular를 사용하여 직접 수행할 수는 없었지만 범위에서 검색 및 바꾸기를 수행하는 두 번째 명령을 사용하여 이 작업을 수행할 수 있었습니다.

 :%s/\([ ]*\)[[:alpha:][:punct:]]*[ ]*/\0\1/

앞에 있는 일정량의 공백을 검색하여 :이 세미콜론 바로 앞에 붙여넣습니다.

답변2

그래서 나쁜 소식과 좋은 소식입니다. 나쁜 소식은 Tabular가 약간의 작업 없이는 사용자가 요청한 작업을 실제로 수행할 수 없다는 것입니다. 당면한 문제에는 Tabular가 일반적으로 액세스할 수 있는 것보다 더 많은 컨텍스트가 필요합니다. 좋은 소식은 Tabular가 매우 유연한 일반 텍스트 조작 도구로 사용될 수 있도록 설계되었으며, 그러한 맥락에서 Tabular를 사용하여 원하는 작업을 수행하는 것이 그리 어렵지 않다는 것입니다.

~/.vim/after/plugin/TabularizeRecord.vim다음 내용(충분히 주석이 달렸으면 좋겠습니다)으로 이름이 지정된 파일을 만듭니다 .

" Create a new tabular pipeline named 'record' that includes all adjacent
" lines containing a : in its default range, and manipulates those lines by
" passing them through the TabularizeIndentedRecord function
AddTabularPipeline! record /:/ TabularizeIndentedRecord(a:lines)

function! TabularizeIndentedRecord(lines)
  " A list containing each of the lines with leading spaces removed
  let text = map(copy(a:lines), 'substitute(v:val, "^ *", "", "")')
  " A list containing just the leading spaces for each line
  let spaces = map(copy(a:lines), 'substitute(v:val, "^ *\\zs.*", "", "")')
  " Tabularize only the text, not the leading spaces.  This pattern is more
  " complicated than just /:/ to handle lines with multiple colons.
  call tabular#TabularizeStrings(text, '[^:]*\zs:', 'l1')
  " Tack the spaces back on to the beginning of each line, and store the
  " resulting lines back in the a:lines list
  call map(a:lines, 'remove(spaces, 0) . remove(text, 0)')
endfunction

해당 파일이 존재하면 vim을 다시 시작하면 다음을 수행하여 원하는 들여쓰기를 얻을 수 있습니다.

:Tab record

내가 알 수 있는 한, 그 최종 결과는 정확히 당신이 찾고 있는 것입니다. 하지만 어떤 이유로든 작동하지 않거나 요구 사항을 잘못 이해한 경우 알려주십시오.

관련 정보