原文: https://wsdjeg.spacevim.org/how-to-sort-efficiently-in-vim/
Vim 分別提供了排序函數 sort()
、uniq()
和排序命令 :sort
。機遇這兩種方式,可以在 Vim 內對文本進行高效的排序。
下面分兩部分詳細說明下這兩種方式的使用方法。
排序命令
:sort
命令的用法格式如下:
:[range]sor[t][!] [b][f][i][n][o][r][u][x] [/{pattern}/]
[range]
值得是一個範圍,:sort
命令會基於這個範圍進行排序,當未制定範圍時,會對整個文檔進行排序。關於 [range]
的常用方法有下面幾種:
我們看到 sor[t]
最後一個字母 t
被方括號包圍,表示該字母可以省略,即更簡單地執行 :sor
命令。
在 :sort
命令緊接其後的感嘆號 !
表示是否進行反向排序,不帶感嘆號則是正向排序,帶上則反之。
在 :sort
命令緊接其後的第一個參數爲可選參數,包括 b
, f
, i
, n
, o
, r
, u
, x
。首先,需要了解選項 n
f
x
o
b
之間是互斥的,也就是說不可以同時使用這些選項,換句話說。前面的這個五個選項可以和 i
r
u
這三項組合使用。下面分別說下這些參數的意義:
- 帶
n
則排序基於每行的第一個十進制數 (在{pattern}
匹配之後或之內)。數值包含前導的 '-'。 - 帶
f
則排序基於每行的第一個浮點數。浮點值相當於在文本({pattern}
匹配的之後或之內) 上調用 str2float() 函數的結果。僅當 Vim 編譯時加入浮點數支持時該標誌位纔有效。 - 帶
x
則排序基於每行的第一個十六進制數 (在{pattern}
匹配之後或之內)。忽略該數值前的 "0x" 或 "0X"。但包含前導的 '-'。 - 帶
o
則排序基於每行的第一個八進制數 (在{pattern}
匹配之後或之內)。 - 帶
b
則排序基於每行的第一個二進制數 (在{pattern}
匹配之後或之內)。 - 帶
u
(u 代表 unique 唯一) 則只保留完全相同的行的第一行 (如果同時帶i
,忽略大小寫的區別)。沒有這個標誌位,完全相同的行的序列會按照它們原來的順序被保留下來。
注意: 行首和行尾的的空白差異會影響唯一性的判定。
排序函數
Vim 提供兩個排序相關的函數 sort()
和 uniq()
,sort()
這個函數的用法如下:
sort({list} [, {func} [, {dict}]])
給定一個 List 經過排序後,返回一個結果,同樣也是 List。sort()
這一函數第二個參數可以接受如下幾種情況:
-
1
或者i
: 表示忽略大小寫。 -
n
:按照數值排序,即使用strtod()
解析 List 內的元素,字符串、列表、字典和函數引用均視作 0。 -
f
:按照浮點數值來排序,要求給定的 List 每一個選項都是浮點數。 - 一個
Funcref
變量。這個變量表示的是一個函數,則調用該函數來比較項目,該函數會使用兩個項目作爲參數,根據返回值確定兩個項目關係。 0 表示相等,1 或者更高,表示第一個排在第二個之後,-1 或更小代表第一個排在第二個之前。