ฉันจะเรียงลำดับข้อความหลายบล็อกตามบรรทัดแรกในแต่ละบล็อกใน Vim ได้อย่างไร


11

ฉันมีข้อความหลายบล็อกหรือพูดอีกอย่างคือฟังก์ชั่นหลายอย่างเช่นนี้:

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

ฉันต้องการเรียงลำดับฟังก์ชันตามตัวอักษรตามลายเซ็นฟังก์ชัน วิธีนี้สามารถทำได้ง่ายที่สุดใน Vim?


โปรดระบุสิ่งที่คุณหมายถึงโดยฟังก์ชั่นลายเซ็นโปรด ฟังก์ชั่นประเภทใดบ้าง นอกจากนี้บนแพลตฟอร์มที่คุณทำงานภายใต้ระบบปฏิบัติการการแจกจ่ายและหมายเลขเวอร์ชันจะมีประโยชน์อย่างมาก
mdpc

1
ทำไมต้องทำสิ่งนี้ใน VIM มียูทิลิตี้บิวด์อิน / ลินุกซ์ในตัวที่ยอดเยี่ยมที่สามารถปูด้วยกันได้อย่างง่ายดายสำหรับสิ่งต่าง ๆ เหล่านี้ .... awk อยู่ในใจ
mdpc

@mdpc: โดยลายเซ็นของฟังก์ชั่นที่ผมเพียง def ...แต่หมายถึงบรรทัดที่มี ฉันใช้งานบน Linux ดังนั้นยูทิลิตี้เหล่านี้จะใช้ได้สำหรับฉัน
Hubro

คำตอบ:


12

มันค่อนข้างง่าย (และฉันเชื่อว่าใกล้กับสิ่งที่ Jason มีอยู่ในใจ):

  1. เปลี่ยนฟังก์ชั่นทั้งหมดของคุณให้กลายเป็น liners หนึ่งโดยแทนที่บรรทัดใหม่ทั้งหมดด้วยอักขระแฟนซี:

    :g/def/,/end/s/\n/§
    
  2. จัดเรียงหนึ่งสมุทรเหล่านั้นด้วย:

    :%sort
    
  3. ขยายฟังก์ชั่นทั้งหมดของคุณกลับไปเป็นสถานะเริ่มต้น:

    :g/def/s/§/\r
    

1
ในทำนองเดียวกันหากบรรทัดว่างถือได้ว่าเป็นตัวคั่นที่ไม่ซ้ำกันก็สามารถทำได้ด้วย:g/./,/^$/-s/\n/§/gแล้ว:%sortและจากนั้นs/§/\r/g
ArtBIT

3

ฉันได้เขียนปลั๊กอิน AdvancedSmitterเพื่อลดความซับซ้อนสามขั้นตอนที่ระบุในคำตอบของ @ romainl เป็นคำสั่งเดียว:

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

รูปแบบที่นี่มีความซับซ้อนมากขึ้นเล็กน้อยรวมถึงการแยกบรรทัดว่าง


หมายเหตุ: คุณจะต้องใช้ Vim 7.4.218 ใหม่ในตอนนี้ ฉันจะให้การอัปเดตที่รองรับเวอร์ชัน Vim ที่เก่ากว่าด้วย
Ingo Karkat

2

วิธีที่ดีที่สุดที่ฉันสามารถคิดได้โดยไม่ต้องเขียนฟังก์ชั่นที่แยกวิเคราะห์คำจำกัดความคือการแทนที่ตัวคั่นบรรทัดที่ไม่ได้นำหน้าด้วยendตัวคั่นที่ไม่ซ้ำใคร (+ EOL +?) แล้ว:sortแทนตัวคั่นบรรทัดใหม่ มันอาจถูกบันทึกลงในแมโคร

ฟังก์ชั่นอาจจะดีกว่าในกรณีที่คุณต้องการใช้การเลือกภาพ


2

ลองใช้ปลั๊กอิน vissort สนับสนุนสิ่งอำนวยความสะดวกการเรียงบล็อก:

  • : '<'> BS nextblock endblock findtag tagpat tagsub
  • : [ช่วง] โทร BlockSort (บล็อกถัดไป, บล็อกปิดกั้น, findtag, tagpat, แท็ก)

หากมีข้อโต้แย้งใด ๆ หายไป BlockSort () จะทำการสอบถามคุณ รูปแบบ nextblock / endblock delimit บล็อกรูปแบบ findtag จะใช้ในการค้นหาบรรทัดที่มี "แท็ก" ซึ่งจะใช้สำหรับการเรียงลำดับ; tagpat และ tabsub ถูกใช้แทนเพื่อแยกแท็กการเรียงลำดับจากบรรทัดที่มีแท็ก

คุณอาจได้รับ vissort.vim จากhttp://www.drchip.org/astronaut/vim/index.html#VISSORT

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.