前言

Vim 雖然有內建 :sort 指令,不過它只能以「行」為單位進行排序,光靠它並無法做到連帶整個區塊,例如:函數、成員方法、類別等進行排序。

解決方案 I (推薦)

使用現成外掛 obreitwi/vim-sort-folds

:set foldmethod=syntax
zm

Use -- VISUAL LINE -- to select the foldings need to be sorted.

<Leader>sf
zr

解決方案 II (手動)

搭配 :g 指令。先將區塊內容隱藏,剩下標頭一行即可利用 :sort 指令進行排序。最後再將隱藏的內容部分還原,即可實現對整個區塊連帶內容一起排序的效果。

指令

Before

void printB() {
  std::cout << "B";
}

void printA() {
  std::cout << "A";
}

操作

:g/^void print[AB]() {/,/^}/ s/$\n/\n
:'<,'>sort
:%s/^@/\r/g

◎注: ^@ = Ctrl+@

After

void printA() {
  std::cout << "A";
}

void printB() {
  std::cout << "B";
}