Usr_25

Nvim :help 頁面,使用 tree-sitter-vimdoc 解析器,從 原始碼 產生


VIM 使用者手冊 - Bram Moolenaar 著
編輯格式化文字
文字很少會一行只有一個句子。本章節將說明如何斷開句子,以使其符合頁面大小和其他格式設定。Vim 也提供了實用的功能,可用於編輯單行段落和表格。
25.1 斷行 25.2 對齊文字 25.3 縮排和 Tab 鍵 25.4 處理長行 25.5 編輯表格
下一章: usr_26.txt 重複操作 前一章: usr_24.txt 快速插入 目錄: usr_toc.txt

斷行

Vim 具有許多函數,可以簡化文字處理。預設情況下,編輯器不會執行自動斷行。換句話說,您必須自己按下 <Enter> 鍵。當您編寫程式碼並希望自行決定行的結尾位置時,這很有用。但是當您建立文件,並希望文字寬度最多為 70 個字元時,這就不是那麼方便了。如果您設定了 'textwidth' 選項,Vim 會自動插入斷行。例如,假設您想要一個只有 30 個字元的窄欄。您需要執行以下命令
:set textwidth=30
現在您開始輸入文字 (已加入尺規)
1 2 3 12345678901234567890123456789012345
我教程式設計一段時間
如果您接著輸入 "l",這會使該行長度超過 30 個字元的限制。當 Vim 偵測到此情況時,它會插入斷行,您會得到以下結果
1 2 3 12345678901234567890123456789012345
我教程式設計一段
時間
繼續輸入,您可以輸入段落的其餘部分
1 2 3 12345678901234567890123456789012345
我教程式設計一段
時間。有一次,我被
沃斯堡警察攔了下來,
因為我的作業太
難了。真事。
您不必輸入換行符;Vim 會自動插入它們。
注意: 'wrap' 選項會使 Vim 顯示帶有斷行的行,但這不會在檔案中插入斷行。

重新格式化

Vim 編輯器不是文字處理器。在文字處理器中,如果您刪除段落開頭的內容,則會重新調整斷行。但在 Vim 中則不會;因此,如果您從第一行刪除 "programming" 這個單字,您只會得到一個短行
1 2 3 12345678901234567890123456789012345
我教一段
時間。有一次,我被
沃斯堡警察攔了下來,
因為我的作業太
難了。真事。
這樣看起來不太好。要使段落恢復原狀,您可以使用 "gq" 運算子。讓我們首先在視覺選取範圍中使用它。從第一行開始,輸入
v4jgq
"v" 以啟動視覺模式,"4j" 以移動到段落末尾,然後輸入 "gq" 運算子。結果如下
1 2 3 12345678901234567890123456789012345
我教一段時間。有
一次,我被沃斯堡
警察攔了下來,因為
我的作業太難了。真
事。
注意:有一種方法可以針對特定類型的文字佈局進行自動格式化,請參閱 auto-format
由於 "gq" 是一個運算子,您可以使用三種方式之一來選取其作用的文字:使用視覺模式、使用移動和使用文字物件。上面的範例也可以使用 "gq4j" 來完成。這樣輸入的次數較少,但您必須知道行數。更實用的移動命令是 "}"。這會移動到段落的結尾。因此,"gq}" 會格式化從游標到目前段落結尾的文字。與 "gq" 一起使用的一個非常有用的文字物件是段落。嘗試以下操作
gqap
"ap" 代表「一個段落」。這會格式化一個段落的文字 (以空行分隔)。也包含游標之前的部分。如果您的段落以空行分隔,您可以輸入以下內容來格式化整個檔案
gggqG
"gg" 以移動到第一行,"gqG" 以格式化到最後一行。 警告:如果您的段落未正確分隔,它們將會被合併在一起。一個常見的錯誤是有一行包含空格或 Tab 鍵。那是一行空白行,但不是空行。
Vim 不僅能格式化純文字。有關如何變更此設定,請參閱 fo-table。請參閱 'joinspaces' 選項,以變更句號後使用的空格數。可以使用外部程式來進行格式化。如果您的文字無法使用 Vim 的內建命令正確格式化,這會很有用。請參閱 'formatprg' 選項。

25.2 對齊文字

要將某範圍的行置中,請使用以下命令
:{range}center [width]
{range} 是常用的命令列範圍。[width] 是用於置中的可選行寬。如果未指定 [width],則預設為 'textwidth' 的值。(如果 'textwidth' 為 0,則預設值為 80。)例如
:1,5center 40
會產生以下結果
我教一段時間。有
一次,我被沃斯堡
警察攔了下來,因為
我的作業太難了。真
事。

置右對齊

同樣地,":right" 命令會使文字靠右對齊
:1,5right 37
會產生此結果
我教一段時間。有
一次,我被沃斯堡
警察攔了下來,因為
我的作業太難了。真
事。

置左對齊

最後還有這個命令
:{range}left [margin]
但是,與 ":center" 和 ":right" 不同的是,":left" 的參數不是行的長度。而是左邊界。如果省略,文字將會放置在螢幕的左側(使用零邊界也會執行相同的操作)。如果為 5,則文字將會縮排 5 個空格。例如,使用這些命令
:1left 5
:2,5left
這會產生以下結果
我教一段時間。有
一次,我被沃斯堡
警察攔了下來,因為
我的作業太難了。真
事。

兩端對齊文字

Vim 沒有內建的文字兩端對齊方式。但是,有一個很棒的巨集套件可以執行此操作。要使用此套件,請執行以下命令
:packadd justify
或將此行放入您的 vimrc
packadd! justify
此 Vim 指令檔會定義一個新的視覺命令 "_j"。要兩端對齊文字區塊,請在視覺模式中反白顯示文字,然後執行 "_j"。請參閱檔案以取得更多說明。要前往該處,請在此名稱上執行 "gf":$VIMRUNTIME/pack/dist/opt/justify/plugin/justify.vim。
另一種方法是透過外部程式篩選文字。範例
:%!fmt

25.3 縮排和 Tab 鍵

縮排可用於使文字從其餘部分中脫穎而出。例如,本手冊中的範例文字會縮排八個空格或一個 Tab 鍵。您通常會在每行開頭輸入一個 Tab 鍵來輸入此內容。請參考此文字
第一行
第二行
這是透過輸入一個 Tab 鍵、一些文字、<Enter>、Tab 鍵和更多文字來輸入的。'autoindent' 選項會自動插入縮排
:set autoindent
當開始新的一行時,它會取得與上一行相同的縮排。在上面的範例中,不再需要 <Enter> 之後的 Tab 鍵。

增加縮排

要增加行中的縮排量,請使用 ">" 運算子。通常這會用作 ">>",這會將縮排新增至目前行。新增的縮排量由 'shiftwidth' 選項指定。預設值為 8。例如,要使 ">>" 插入相當於四個空格的縮排,請輸入以下內容
:set shiftwidth=4
當在範例文字的第二行上使用時,您會得到以下結果
第一行
第二行
"4>>" 會增加四行的縮排。

TABSTOP

如果您希望縮排為 4 的倍數,請將 'shiftwidth' 設定為 4。但是當按下 <Tab> 時,您仍然會得到相當於 8 個空格的縮排。要變更此設定,請設定 'softtabstop' 選項
:set softtabstop=4
這會使 <Tab> 鍵插入相當於 4 個空格的縮排。如果已經有四個空格,則會使用 <Tab> 字元 (在檔案中儲存七個字元)。(如果您一直想要空格而不是 Tab 字元,請設定 'expandtab' 選項。)
注意:您可以將 'tabstop' 選項設定為 4。但是,如果您下次編輯檔案時,將 'tabstop' 設定為預設值 8,它看起來會不正確。在其他程式中和列印時,縮排也會不正確。因此,建議您始終將 'tabstop' 維持在 8。這是各處的標準值。

變更 Tab 鍵

您編輯一個以 Tabstop 為 3 編寫的檔案。在 Vim 中,它看起來很醜,因為它使用正常的 Tabstop 值 8。您可以透過將 'tabstop' 設定為 3 來修正此問題。但是您必須在每次編輯此檔案時執行此操作。Vim 可以變更檔案中 Tabstop 的使用方式。首先,設定 'tabstop' 使縮排看起來正確,然後使用 ":retab" 命令
:set tabstop=3
:retab 8
":retab" 命令會將 'tabstop' 變更為 8,同時變更文字,使其看起來相同。它會為此將空格範圍變更為 Tab 鍵和空格。您現在可以寫入檔案。下次您編輯它時,縮排將會正確,而無需設定選項。 警告:在程式碼上使用 ":retab" 時,可能會變更字串常數內的空格。因此,最好習慣使用 "\t" 而不是實際的 Tab 鍵。

25.4 處理長行

有時您會編輯比視窗中的欄數寬的檔案。發生這種情況時,Vim 會換行,以便所有內容都適合螢幕。如果您關閉 'wrap' 選項,則檔案中的每一行都會在螢幕上顯示為一行。然後,長行的結尾會從螢幕右側消失。當您將游標移動到無法看到的字元時,Vim 會捲動文字以顯示它。這就像在水平方向上移動文字上的視窗。預設情況下,Vim 不會在 GUI 中顯示水平捲軸。如果您要啟用一個,請使用以下命令
:set guioptions+=b
一個水平捲軸將會出現在 Vim 視窗的底部。
如果您沒有捲軸,或不想使用捲軸,請使用這些命令來捲動文字。游標將會保持在相同的位置,但必要時會將其移回可見的文字中。
zh 向右捲動 4zh 向右捲動四個字元 zH 向右捲動半個視窗寬度 ze 向右捲動以將游標放置在結尾 zl 向左捲動 4zl 向左捲動四個字元 zL 向左捲動半個視窗寬度 zs 向左捲動以將游標放置在開頭
讓我們嘗試用一行文字來顯示此內容。游標位於 "which" 的 "w" 上。行上方的「目前視窗」表示目前可見的文字。文字下方的「視窗」表示其左側命令之後可見的文字。
|<-- 目前視窗 -->|
一些長文字,其中一部分在視窗中可見
ze |<-- 視窗 -->| zH |<-- 視窗 -->| 4zh |<-- 視窗 -->| zh |<-- 視窗 -->| zl |<-- 視窗 -->| 4zl |<-- 視窗 -->| zL |<-- 視窗 -->| zs |<-- 視窗 -->|

關閉換行時的移動

'wrap' 關閉且文字已水平捲動時,您可以使用以下命令將游標移動到您可以看到的字元。因此會忽略視窗左側和右側的文字。這些命令永遠不會導致文字捲動
g0 移動到此行中的第一個可見字元 g^ 移動到此行中的第一個非空白可見字元 gm 移動到螢幕行的中間 gM 移動到此行中文字的中間 g$ 移動到此行中的最後一個可見字元
|<-- 視窗 -->|
一些長文字,其中一部分在一行中可見
g0 g^ gm gM g$

在單字處斷行 edit-no-break

當您準備將文字用於其他程式時,您可能需要建立沒有換行的段落。使用 'nowrap' 的缺點是您無法看到您正在處理的完整句子。當 'wrap' 開啟時,單字會被截斷,導致難以閱讀。編輯這類段落的一個好方法是設定 'linebreak' 選項。Vim 會在顯示行時將行斷在適當的位置。檔案中的文字保持不變。如果沒有 'linebreak' ,文字看起來會像這樣
+---------------------------------+
|letter generation program for a b|
|ank.  They wanted to send out a s|
|pecial, personalized letter to th|
|eir richest 1000 customers.  Unfo|
|rtunately for the programmer, he |
+---------------------------------+
之後
:set linebreak
它看起來像這樣
+---------------------------------+
|letter generation program for a  |
|bank.  They wanted to send out a |
|special, personalized letter to  |
|their richest 1000 customers.    |
|Unfortunately for the programmer,|
+---------------------------------+
相關選項: 'breakat' 指定可以插入斷行的字元。 'showbreak' 指定在斷行開始時顯示的字串。將 'textwidth' 設定為零,以避免段落被分割。

以可見行移動

「j」和「k」指令會移動到下一行和上一行。在長行上使用時,這意味著一次移動多個螢幕行。要只移動一個螢幕行,請使用「gj」和「gk」指令。當行不換行時,它們的作用與「j」和「k」相同。當行換行時,它們會移動到顯示在下一行或上一行的字元。您可能會喜歡使用這些對應,將這些移動指令綁定到游標鍵
:map <Up> gk
:map <Down> gj
將段落轉換為一行 edit-paragraph-join
如果您想要將文字匯入 MS-Word 等程式,每個段落都應該是一行。如果您的段落目前以空行分隔,這就是如何將每個段落轉換為單行的方法
:g/./,/^$/join
這看起來很複雜。讓我們把它分解成幾個部分
:g/./ 一個 ":global" 指令,尋找所有包含至少一個字元的行。 ,/^$/ 一個範圍,從目前行(非空行)開始直到空行。 join ":join" 指令將該範圍的行連接成一行。
從此文字開始,包含在第 30 列斷開的八行
+----------------------------------+
|A letter generation program           |
|for a bank.  They wanted to           |
|send out a special,                   |
|personalized letter.                   |
|                                   |
|To their richest 1000                   |
|customers.  Unfortunately for           |
|the programmer,                   |
+----------------------------------+
您最終會得到兩行
+----------------------------------+
|A letter generation program for a |
|bank.        They wanted to send out a s|
|pecial, personalized letter.           |
|To their richest 1000 customers.  |
|Unfortunately for the programmer, |
+----------------------------------+
請注意,當分隔行是空白但非空時(當它包含空格和/或 Tab 時),這不起作用。此指令可與空白行一起使用
:g/\S/,/^\s*$/join
這仍然需要在檔案末尾有一個空白或空行,才能連接最後一個段落。

25.5 編輯表格

假設您正在編輯一個四欄的表格
nice table test 1 test 2 test 3
input A 0.534
input B 0.913
您需要在第三欄中輸入數字。您可以移動到第二行,使用「A」,輸入許多空格並輸入文字。對於這種編輯,有一個特殊的選項
set virtualedit=all
現在您可以將游標移動到沒有文字的位置。這稱為「虛擬空間」。這樣編輯表格會容易得多。通過搜尋最後一欄的標頭來移動游標
/test 3
現在按下「j」,您就到了可以輸入「input A」值的位置。輸入「0.693」會得到
nice table test 1 test 2 test 3
input A 0.534 0.693
input B 0.913
Vim 已自動為您填滿新文字前面的空白。現在,要在這一欄中輸入下一個欄位,請使用「Bj」。「B」會移回以空白分隔的單字開頭。「j」會移動到可以輸入下一個欄位的位置。
注意: 您可以將游標移動到顯示中的任何位置,也可以超出行的末尾。但是,Vim 不會在該位置插入空格,除非您在該位置插入字元。
複製欄
您想要新增一個欄,它應該是第三欄的副本,並放在「test 1」欄之前。請按以下七個步驟操作: 1. 將游標移動到此欄的左上角,例如,使用「/test 3」。 2. 按下 CTRL-V 以啟動區塊式視覺模式。 3. 使用「2j」將游標向下移動兩行。您現在處於「虛擬空間」:「test 3」欄的「input B」行。 4. 將游標向右移動,將整個欄納入選取範圍,以及您想要的欄之間空格。「9l」應該可以做到。 5. 使用「y」複製選取的矩形。 6. 將游標移動到「test 1」,新欄必須放在這裡。 7. 按下「P」。
結果應該是
nice table test 3 test 1 test 2 test 3
input A 0.693 0.534 0.693
input B 0.913
請注意,整個「test 1」欄向右移動了,包括「test 3」欄沒有文字的行。
使用以下命令返回非虛擬游標移動
:set virtualedit=

虛擬取代模式

使用 'virtualedit' 的缺點是它「感覺」不同。在移動游標時,您無法識別行尾以外的 Tab 或空格。可以使用另一種方法:虛擬取代模式。假設您在表格中有一行包含 Tab 和其他字元。在第一個 Tab 上使用「rx」
inp 0.693 0.534 0.693
| rx | V
inpx0.693 0.534 0.693
版面配置已搞砸。為了避免這種情況,請使用「gr」指令
inp 0.693 0.534 0.693
| grx | V
inpx 0.693 0.534 0.693
發生的是,「gr」指令確保新字元佔用正確的螢幕空間。插入額外的空格或 Tab 以填補間隙。因此,實際發生的是,Tab 被「x」取代,然後新增空白以使後面的文字保持在原位。在這種情況下,會插入一個 Tab。當您需要取代多個字元時,請使用「R」指令進入取代模式(請參閱 04.9)。這會搞亂版面配置並取代錯誤的字元
inp 0 0.534 0.693
| R0.786 | V
inp 0.78634 0.693
「gR」指令使用虛擬取代模式。這會保留版面配置
inp 0 0.534 0.693
| gR0.786 | V
inp 0.786 0.534 0.693
下一章:usr_26.txt 重複
版權:請參閱 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主頁
指令索引
快速參考