Vim의 각 블록에서 첫 번째 줄을 기준으로 여러 텍스트 블록을 어떻게 정렬합니까?


11

여러 텍스트 블록, 즉 다음과 같은 여러 기능이 있습니다.

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

함수 서명에 따라 알파벳순으로 함수를 정렬하고 싶습니다. Vim에서 어떻게 가장 쉽게 할 수 있습니까?


함수 서명으로 의미하는 바를 정의하십시오. 어떤 유형의 기능입니까? 또한 OS에서 배포하는 플랫폼, 배포 및 버전 번호가 매우 유용합니다.
mdpc

1
왜 VIM에서이 작업을 수행해야합니까? 이러한 유형의 것들을 위해 쉽게 결합 할 수있는 뛰어난 내장 유닉스 / 리눅스 유틸리티가 있습니다 .... awk가 떠 오릅니다.
mdpc

@mdpc : 함수 서명으로 나는을 포함하는 줄을 의미합니다 def .... 저는 Linux를 사용하므로 이러한 유틸리티 중 하나가 저에게 효과적입니다.
Hubro

답변:


12

비교적 간단합니다 (제이슨이 생각한 것에 가깝습니다).

  1. 모든 개행을 멋진 캐릭터로 대체하여 모든 기능을 하나의 라이너로 바꾸십시오.

    :g/def/,/end/s/\n/§
    
  2. 그 라이너 하나를 정렬하십시오 :

    :%sort
    
  3. 모든 기능을 초기 개별 상태로 다시 확장하십시오.

    :g/def/s/§/\r
    

1
빈 라인이 독특한 분리로 간주 될 수 있다면 마찬가지로, 다음이 함께 할 수있는 :g/./,/^$/-s/\n/§/g다음 :%sort다음과s/§/\r/g
ArtBIT

3

@romainl의 답변에 주어진 세 가지 단계를 단일 명령으로 단순화하기 위해 AdvancedSorters 플러그인 을 작성했습니다 .

:SortRangesByRange /^def\>/,/^end\>\_s*\zs$/

여기서 패턴은 분리 된 빈 줄을 올바르게 포함하기 위해 약간 더 복잡합니다.


참고 : 현재 상당히 새로운 Vim 7.4.218이 필요합니다. 곧 구형 Vim 버전도 지원하는 업데이트를 제공 할 것입니다.
Ingo Karkat

2

정의를 구문 분석하는 함수를 작성하지 않고이 작업을 수행 할 수있는 가장 좋은 방법은 선행 구분 기호 end를 다른 고유 구분 기호 (+ EOL +?) :sort로 대체 한 다음 행 구분 기호를 다시 대체하는 것입니다. 아마도 매크로에 기록 될 수 있습니다.

시각적 선택을 사용하려는 경우 기능이 더 나을 수 있습니다.


2

vissort 플러그인을 사용해보십시오. 블록 정렬 기능을 지원합니다.

  • : '<'> BS 다음 블록 엔드 블록 찾기 태그 tagpat tagsub
  • : [범위] 통화 BlockSort (다음 블록, 엔드 블록, 찾기 태그, tagpat, tagsub)

누락 된 인수가 있으면 BlockSort ()가이를 쿼리합니다. nextblock / endblock 패턴은 블록을 구분하고, findtag 패턴은 정렬에 사용될 "tag"를 포함하는 라인을 찾는 데 사용됩니다. tagpat 및 tabsub는 태그가 포함 된 행에서 정렬 태그를 추출하는 대신 사용됩니다.

http://www.drchip.org/astronaut/vim/index.html#VISSORT 에서 vissort.vim을 얻을 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.