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行加上行號邏輯上很容易理解:1,30#:redir @a | 1,30# | redir end
:1,30d | put! a
顯示前30行及其行號。儲存到暫存器a中,刪掉前30行,再貼上暫存器的內容。
沒什麼明顯優點的一種方法。缺點同上。如果不是更改當前編輯區的內容而是直接儲存到新檔案的話,這種方法就比其他的方法方便。
next:
sec4,
previous:
sec2,
up:
toprange()是個新的函式,用來產生包含數字序列的列表。當然也可以用來生成行號:
" 為前30行加上行號對range(),setline()的用法見幫助文件。:for i in range(31)
:call setline(i,i .' '. getline(i))
:endfor
range()函式相對前面的2個解法而言要靈活許多,除可用以表示行號,也可以用來編數字序列,相應地也要求一些程式設計基礎。
next:
sec5,
previous:
sec3,
up:
top這是也是簡單靈活的一種解法。好吧,也許大家第乙個想到的解法不是使用line()函式。
" 為所有行加上行號注意:g後面的兩條命令(:s, :let)一定要寫在一起。這是比較通用的一種編號方式,可以應付大部分的編號問題。:let i=1
:g/^/ s//\=i . ' '/ |let i=i+1
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
" 這個例子使用冒號作為分隔符^[的輸入方法是依次按ctrl-v, 鍵。這個例子中使用了mm對最後乙個數字做記號,yv`m:let @a=0
:let @q='0"apa:^[0^amm"ayv`m'
:g/^\a/ norm @q
確保複製時也包括了最後乙個數字本身。
巨集指令是vi最有力的工具之一,在vim中巨集則比以往更強大。巨集並非完成此工作最有效率的解法,但寫巨集的樂趣要比其他的指令碼來得多得多。這個解法經過修改一樣可以適用多種情況,缺點是在寫出乙個可行的巨集之前要經過多次地除錯。
next:
sec7,
previous:
sec5,
up:
top除了內建的vim script以外,vim還提供了對四種指令碼語言的「支援」,perl、python、ruby和tcl(是五種sorry,還有mzscheme)。這裡的支援包括了可以直接在vim的命令視窗中使用其他語言的語句;在其他語言中可以操縱vim物件,使用vim命令。這裡給出perl和python實現的指令碼。
perl版本:
" 對前30行進行編號,預設範圍是所有行python版本:" perldo命令中的$_表示當前行
:1,30perldo $_=++$i . ' ' . $_;
" 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...