2013-03-16 33 views
6

Có ai có plugin hoặc macro để thay thế kết hợp { niềng răng } với doend trong Vim? Tốt nhất biến một tuyên bố đơn dòng như sau:Thay thế {dấu ngoặc nhọn} phù hợp với/kết thúc bằng Vim (Ruby)

foo.each { |f| f.whatever } 

thành:

foo.each do |f| 
    f.whatever 
end 

tôi có thể làm cho một macro bản thân mình cho rằng một trường hợp, nhưng tôi muốn một cái gì đó mà cũng có thể xử lý đa chuyển đổi hiện line, có khả năng phức tạp khối, như:

foo.each { |f| 
    f.bars.each { |b| b.whatever } 
    hash = { a: 123, b: 456 } 
} 

thành:

foo.each do |f| 
    f.bars.each { |b| b.whatever } 
    hash = { a: 123, b: 456 } 
end 

Tôi đã xem vim-surroundrails.vim và chưa tìm thấy cách nào.

+0

không biết nhiều về ruby. nhưng tại sao ví dụ multiline của bạn (đầu ra) chỉ outter '{,}' được thay thế, bên trong 'f.bars.each {...' không? – Kent

+0

Thật tuyệt khi được hỗ trợ cả hai, nhưng thông thường tôi sẽ không muốn bất cứ điều gì nhưng một cấp được mở rộng tại một thời điểm. Kịch bản của tôi là tôi thích các khối nội dòng cho các câu lệnh đơn, nhưng thường thấy mình muốn thêm một hoặc hai câu lệnh khác, và tôi muốn mở rộng khối cho câu lệnh đó. Có, tôi biết tôi nên refactor nó tất cả ra thành một phương pháp. –

Trả lời

7

Có một plugin Vim được gọi là Vim Blockle thực hiện chức năng này.

Khi bạn cài đặt plugin bạn đặt con trỏ trên {}do hoặc end và nhấn <Leader>b để trao đổi các kiểu khối.

+0

Cảm ơn! Một chút kỳ quặc, nhưng điều này là khá nhiều những gì tôi đang tìm kiếm. –

+1

Vì vậy, tôi đã xem xét cài đặt Blockle và tình cờ gặp một đề xuất của tác giả Blockle để cài đặt 'splitjoin' thay vì: https://github.com/jgdavey/vim-blockle/issues/5 –

0

tôi cho rằng trong ví dụ nhiều dòng của bạn, kết quả sẽ là:

foo.each do |f| 
    f.bars.each do |b| b.whatever end 
    hash = { a: 123, b: 456 } 
end 

có nghĩa là, f.bars.each{...} nên được thay thế quá.

nếu nó là mục tiêu, hãy thử này: giải thích

gg/each\s*{<enter>qqf{%send<esc><c-o>sdo<esc>[email protected] 

ngắn:

gg    " move cursor to top 
/each\s*{<enter> " search pattern we want 
qq    " start recording macro to register q 
f{    " move to { 
%send<esc>  " move to closing {, and change it to "end", back to normal 
<c-o>sdo   " back to beginning { and change it into "do" 
<esc>nq   " back to normal, and go to next match, stop recording 

sau đó bạn có thể làm ví dụ [email protected] và kiểm tra kết quả.

+0

Đó không phải là những gì tôi theo đuổi. Xem nhận xét của tôi về câu hỏi. Tôi chỉ muốn làm điều đó cho phạm vi của dòng hiện tại. Tôi sẽ kiểm tra điều này và xem nếu tôi có thể làm việc với nó, mặc dù. –

Các vấn đề liên quan