나는 종종 다음과 같은 상황에 직면합니다.
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
내가 아는 한, 최종 결과는 정확히 귀하가 원하는 것입니다. 하지만 어떤 이유로든 작동하지 않거나 요구 사항을 잘못 이해한 경우 알려 주시기 바랍니다.