2011-07-13 53 views
19

簡單的文本編輯的Vim: http://vimgolf.com/challenges/4d1a34ccfa85f32065000004VimGolf挑戰「Vim簡單文本編輯」:#1解決方案如何工作?

我很難理解#1溶液(分數13)。

對不起,這篇文章沒有貼上解決方案,因爲我不知道這樣做是否合適。

+3

這個問題有一個問題:沒有人能夠看到#1的解決方案(除非他們在vimgolf註冊,像我一樣)。同時,你爲什麼不一步一步地嘗試 – sehe

回答

33

該解決方案集中在:g命令上。從幫助:

           :g :global E147 E148 
:[range]g[lobal]/{pattern}/[cmd] 
         Execute the Ex command [cmd] (default ":p") on the 
         lines within [range] where {pattern} matches. 

所以基本上,該解決方案執行有一個「V」, 這正是需要編輯的那些線路上的一些前的命令。您可能注意到早期的解決方案依賴於複製這些行,而不是真正改變它們。該解決方案特別顯示了一個有趣的現象:

3jYjVp3jYjVp3jYjVpZZ 
^ ^ ^

它是用宏觀減少:

[email protected] 

使用:g命令基本上做同樣的事情的解決方案。執行的第一個 命令是t.。從幫助:

              :t 
:t     Synonym for copy. 

:[range]co[py] {address}        :co :copy 
         Copy the lines given by [range] to below the line 
         given by {address}. 

給出的地址爲.,這意味着當前行:

Line numbers may be specified with:   :range E14 {address} 
     {number}   an absolute line number 
     .     the current line       :. 
     $     the last line in the file     :$ 
     %     equal to 1,$ (the entire file)    :% 
     't     position of mark t (lowercase)    :' 
     'T     position of mark T (uppercase); when the mark is in 
          another file it cannot be used in a range 
     /{pattern}[/]  the next line where {pattern} matches  :/ 
     ?{pattern}[?]  the previous line where {pattern} matches :? 
     \/     the next line where the previously used search 
          pattern matches 
     \?     the previous line where the previously used search 
          pattern matches 
     \&     the next line where the previously used substitute 
          pattern matches 

所以ex命令t.意味着「複製當前行到當前線下」。 然後,有一杆,它:

             :bar :\bar 
'|' can be used to separate commands, so you can give multiple commands in one 
line. If you want to use '|' in an argument, precede it with '\'. 

d命令,這顯然會刪除該行。它的範圍是 +,意思是「當前行+1」。您可以通過.+1,但簡稱爲+。 可以讀取這些信息圍繞幫助:range

The default line specifier for most commands is the cursor position, but the 
commands ":write" and ":global" have the whole file (1,$) as default. 

Each may be followed (several times) by '+' or '-' and an optional number. 
This number is added or subtracted from the preceding line number. If the 
number is omitted, 1 is used. 

就是這樣。

:g/V/t.|+d<CR>ZZ 

在每一個有一個「V」行,把它複製下來,並刪除下一行。寫 並退出。我沒有提到


一件事就是爲什麼:g命令執行三次,而不是6個或更多(線沿的過程中複製)。 :g命令開始將光標定位到第一行,並下降到$。但是如果這些命令改變當前行,則:g將從那裏繼續。所以:

:g/V/ 

當前行是4。現在:

t. 

這將光標移動到第5行。然後:

+d 

刪除第6行,將光標停留在5所以接下來:g比賽將在8行

+0

+1即使我看不懂問題也很好的解釋。 :) –

+0

謝謝@Xavier T.問題應該對每個人都可見,只需按照問題中提供的鏈接。 – sidyll

+0

你是對的,我可以看到開始/結束的狀態! –