Làm cách nào để sắp xếp nhiều khối văn bản theo dòng đầu tiên trong mỗi khối trong Vim?


11

Tôi có nhiều khối văn bản, hay nói cách khác, nhiều chức năng như thế này:

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

Tôi muốn sắp xếp các chức năng theo thứ tự abc theo chữ ký hàm. Làm thế nào điều này có thể dễ dàng nhất được thực hiện trong Vim?


xác định những gì bạn có nghĩa là chữ ký chức năng xin vui lòng. Những loại chức năng này là gì? Ngoài ra, trên nền tảng nào bạn đang làm việc trong HĐH, phân phối và số phiên bản sẽ RẤT hữu ích.
mdpc

1
Tại sao điều này phải được thực hiện trong VIM? có những tiện ích unix / linux dựng sẵn tuyệt vời có thể dễ dàng gắn kết với nhau cho những thứ này .... awk xuất hiện trong tâm trí.
mdpc

@mdpc: Theo chữ ký hàm tôi chỉ có nghĩa là dòng chứa def .... Tôi đang dùng Linux, vì vậy bất kỳ tiện ích nào trong số đó sẽ hoạt động với tôi.
Hubro

Câu trả lời:


12

Nó tương đối đơn giản (và, tôi tin rằng, gần với những gì Jason có trong đầu):

  1. biến tất cả các chức năng của bạn thành một lớp lót bằng cách thay thế tất cả các dòng mới bằng một số ký tự lạ mắt:

    :g/def/,/end/s/\n/§
    
  2. sắp xếp những lớp lót đó với:

    :%sort
    
  3. mở rộng tất cả các chức năng của bạn trở lại trạng thái cá nhân ban đầu của chúng:

    :g/def/s/§/\r
    

1
Tương tự, nếu các dòng trống có thể được coi là dấu phân cách duy nhất, thì nó có thể được thực hiện với :g/./,/^$/-s/\n/§/g, và sau :%sortđós/§/\r/g
ArtBIT

3

Tôi đã viết plugin AdvancedSorters để đơn giản hóa ba bước riêng biệt được đưa ra trong câu trả lời của @ romainl thành một lệnh duy nhất:

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

Mẫu ở đây phức tạp hơn một chút để bao gồm đúng các dòng trống tách biệt.


Lưu ý: Hiện tại bạn sẽ cần một Vim 7.4.218 khá mới cho điều đó; Tôi sẽ cung cấp bản cập nhật cũng sớm hỗ trợ các phiên bản Vim cũ hơn.
Ingo Karkat

2

Cách tốt nhất tôi có thể nghĩ để làm điều này mà không cần viết một hàm phân tích các định nghĩa, sẽ là thay thế các dấu phân cách dòng không có trước endmột dấu phân cách duy nhất khác (+ EOL +?), Và sau đó :sort, thay thế các dấu phân cách dòng. Nó có thể được ghi lại thành một macro.

Một chức năng có thể tốt hơn mặc dù, trong trường hợp bạn muốn sử dụng lựa chọn trực quan.


2

Hãy thử plugin vissort. Nó hỗ trợ một cơ sở sắp xếp khối:

  • : '<'> BS nextblock endblock findtag tagpat tagsub
  • : [phạm vi] gọi BlockSort (nextblock, endblock, findtag, tagpat, tagsub)

Nếu bất kỳ đối số nào bị thiếu, BlockSort () sẽ truy vấn bạn cho chúng. Các mẫu nextblock / endblock phân định một khối, mẫu findtag được sử dụng để tìm một dòng chứa "thẻ" sẽ được sử dụng để sắp xếp; tagpat và tabub được sử dụng thay thế để trích xuất thẻ sắp xếp từ dòng chứa thẻ.

Bạn có thể nhận vissort.vim từ http://www.drchip.org/astronaut/vim/index.html#VISSORT

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.