如何在 Vim 內進行高效的排序

原文: 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 或更小代表第一個排在第二個之前。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章