有多少種方式可以在vim 中插入行號

2021-06-09 16:15:58 字數 4870 閱讀 6336

2 最後

next: 

chap2,

up: 

top建議看一下vim官網的這篇文章。裡面一部分內容與這篇是重疊的。不過這篇是中文的xd。

這是第一行

這是第二行

這是第四行

在插入行號後將成為:

1 這是第一行

2 這是第二行

34 這是第四行

但有時我們需要對部分行編號。下面的例子是對第二行以後的所有非空行依次編號:

這是第一行

1 這是第二行

2 這是第四行

3 這是第五行

為了區別行號,我這裡就稱之為數字序列。

進入正題。

next: 

sec2,

up: 

top相信這是大多數人第乙個想到的解法了——使用line()函式產生行號用:s命令插入行號。

" 為所有行加上行號

" 使用合適的範圍或者正規表示式就可以限定作用的範圍。

:g/^/ s//\=line('.').' '/

優點是簡單易用。缺點是不夠靈活,只能用以顯示指定行的行號。

next: 

sec3,

previous: 

sec1,

up: 

topvim提供了一些可以列印行號的ex命令,如,"=", "p #" 和"#"。為了捕捉vim的命令輸出,我們用redir命令。

" 為前30行加上行號

:redir @a | 1,30# | redir end

:1,30d | put! a

邏輯上很容易理解:1,30#

顯示前30行及其行號。儲存到暫存器a中,刪掉前30行,再貼上暫存器的內容。

沒什麼明顯優點的一種方法。缺點同上。如果不是更改當前編輯區的內容而是直接儲存到新檔案的話,這種方法就比其他的方法方便。

next: 

sec4,

previous: 

sec2,

up: 

toprange()是個新的函式,用來產生包含數字序列的列表。當然也可以用來生成行號:

" 為前30行加上行號

:for i in range(31)

:call setline(i,i .' '. getline(i))

:endfor

對range(),setline()的用法見幫助文件。

range()函式相對前面的2個解法而言要靈活許多,除可用以表示行號,也可以用來編數字序列,相應地也要求一些程式設計基礎。

next: 

sec5,

previous: 

sec3,

up: 

top這是也是簡單靈活的一種解法。好吧,也許大家第乙個想到的解法不是使用line()函式。

" 為所有行加上行號

:let i=1

:g/^/ s//\=i . ' '/ |let i=i+1

注意:g後面的兩條命令(:s, :let)一定要寫在一起。這是比較通用的一種編號方式,可以應付大部分的編號問題。

next: 

sec6,

previous: 

sec4,

up: 

topvim提供了ctrl-a和ctrl-x來分別對游標下(或者游標右邊第乙個)數字進行增、減操作。按ctrl-a一次可加一,按ctrl-x則是減一。如果你用的是windows,那很有可能ctrl-a已被對映成全選了。輸入

:nunmap
使之恢復功能,當然你可以用:nnoremap重新對映到其他鍵。趕緊翻出文件吧:

:h ctrl-a

:h ctrl-x

:h unmap

:h o_v

先看一下,普通模式下的操作步驟:

第一、手工新增第一行序號和空格。

第二、輸入0"ayw

qq0"ap0^a"ayawjq
上面的命令將指令序列存進暫存器q。^a表示按ctrl-a組合鍵。

第四、28@q對接下來的28行新增行號。

上面新增空格是很重要的步驟(因為我們使用了yaw

複製數字和空格),這裡解釋一下第三步:

` qq『

開始錄製巨集,並儲存到暫存器q中

` 0『

設定游標的位置到行首

` "ap『

放上前面儲存的序號和空格

` 0^a『

回到行首並按ctrl-a加一

` "ayaw『

複製當前數字和空格到暫存器a

` jq『

移到下一行(這樣我們才能確保28@q是對下面的28行進行操作而不是對當前行操作28次),然後結束巨集。

通過與:g指令配合可以對指定行編號。下面的例子對所有以字母開頭的行進行編號。為了說明方便我們直接對暫存器賦值,效果與上面普通模式下的操作是一樣的。注意下面兩例操作中的^a的輸入方法與上面直接按組合鍵的方法有所不同,先按ctrl-v(不行的話試ctrl-q),再按ctrl-a:

" 先重置a暫存器。

" 再對所有以字母開頭的行編號

:let @a='0 '

" 去掉了j指令

:let @q='0"ap0^a"ayaw'

:g/^\a/ norm @q

如果你用的分隔符不是空格,可以對它進行手工標記:

" 這個例子使用冒號作為分隔符

:let @a=0

:let @q='0"apa:^[0^amm"ayv`m'

:g/^\a/ norm @q

^[的輸入方法是依次按ctrl-v, 鍵。這個例子中使用了mm對最後乙個數字做記號,yv`m

確保複製時也包括了最後乙個數字本身。

巨集指令是vi最有力的工具之一,在vim中巨集則比以往更強大。巨集並非完成此工作最有效率的解法,但寫巨集的樂趣要比其他的指令碼來得多得多。這個解法經過修改一樣可以適用多種情況,缺點是在寫出乙個可行的巨集之前要經過多次地除錯。

next: 

sec7,

previous: 

sec5,

up: 

top除了內建的vim script以外,vim還提供了對四種指令碼語言的「支援」,perl、python、ruby和tcl(是五種sorry,還有mzscheme)。這裡的支援包括了可以直接在vim的命令視窗中使用其他語言的語句;在其他語言中可以操縱vim物件,使用vim命令。這裡給出perl和python實現的指令碼。

perl版本:

" 對前30行進行編號,預設範圍是所有行

" perldo命令中的$_表示當前行

:1,30perldo $_=++$i . ' ' . $_;

python版本:

" python中vim.current.buffer是個唯讀列表物件,

" 所以只能替換列表中項的值而無法替換列表本身。

:python 《因為這四種指令碼語言都是通用的程式語言,所以實際上可以完成任何形式的編號工作。缺點是這要求使用者的vim在編譯時包含了相應的選項,同時(主要是windows平台)還要另外裝相應的指令碼引擎。

next: 

chap2,

previous: 

sec6,

up: 

top有許多的外部命令也可以用來完成這項工作,這裡挑幾個有代表性的。

下面的命令給出的是windows下的版本(不過除findstr是xp自帶的外,其他都是linux下移過來的xd),將雙引號改為單引號就可以在linux下執行了。

1 :%!findstr /n "^"

2 :%!sed =|sed "n;s/\n/ /"

3 :%!diff --line-format=\%-dn\%l % -

4 :%!perl -pe "print ++$a . ' '" -

5 :%!python -c "import sys,fileinput as f;[sys.stdout.write(str(f.lineno())+a) for a in f.input()]"

6 ...

...n ....

這裡做些補充說明:

` findstr『

findstr是grep的ms實現,可以是windows xp上找到。這裡使用正則字元^來匹配所有行,使用n選項顯示行號。入選理由是這是我能想到的windows自帶的除wsh外惟一能過濾文字並新增行號的命令列工具。

` sed『

見 sed單行指令碼快速參考。入選理由這是vim的好搭檔。

` diff『

這裡使用了diff的選項

–line-format

%-dn表示行號,%l表示行的內容。vim會將%轉義成為當前檔案所以格式中的兩個%號要加上反斜槓轉義。入選理由是vim自己帶了這個工具。

` perl『

不用解釋了吧。入選理由是perl是最強大靈活的文字處理工具。

` python『

這個指令碼用了fileinput模組捕捉輸入,用sys模組進行輸出到stdout(在這裡就是vim的編輯區)。如果手中的vim是沒帶python的版本(所以不能用上面的:python命令)又出於某種未知原因想用python,可以試一下。

此外還有awk,cat,grep,nl,… 等不再贅述。

這種解法的優點在於簡單易用,缺點在於要有相應的外部程式。而靈活性則取決於所使用的工具。

previous: 

sec7,

up: 

top可以看到新增行號對vim來講是小菜一碟。

考慮到vim本身的指令碼引擎及到其他程式語言的支援,在vim實現某種功能在大部情況下是很容易的。vim只需要負責顯示邏輯,而文字處理的工作可以由外部的程式或指令碼來完成。如果你覺得某個文字處理的功能在vim中的實現要複雜得多時很多時,很可能還有其他的實現方式。

當然,肯定還有其他的方法可以實現在vim中新增行號的目的。

四對括號可以有多少種匹配排列方式 新解法

四對括號 那麼有4個 右括號 該題可演化為在黑色下劃線位置填左括號。容易得知 第1個位置 最多填4個,但不能為0個,第2個位置最多填3個,可以為0個,第3個位置最多填2個,第四個最多填1個。若有n對括號 由此得出結論,每個位置不得填超過n i 1個左括號,第乙個位置要求不能填0個。再加上乙個條件,所...

n對括號可以有多少種匹配排列方式 演算法面試題

問題 n對括號可以有多少種匹配排列方式?比如兩對括號可以有兩種 和 思路 問題可轉化為 在乙個string中包含兩個字元 和 他們出現的次數都為n,並且任何時候 出現的次數總是 出現的次數。解決方案 遞迴 標誌 l 左括號出現的次數,r 右括號出現的次數,n 括號對數,s 儲存符合要求的排列字串,n...

在Vim中插入當前檔名

1.使用 即ctrl r 步驟如下 在insert模式下,先按ctrl r,游標處變成雙引號 再按 即可直接插入當前檔名 含路徑 關 於,可輸入 help 檢視詳細說明。此處簡要說明一下,ctrl r可以插入0 9號暫存器 numbered register 內的內容,也可以插入特殊暫存器 name...