問題
Saving the hashes(#)より。
January 2013 #40 Long-range line duplication (6:31) December 2012 #39 Profiling Vimscript performance (8:09) November 2012 #38 Writing a custom fold expression (12:07) #37 How to fold (8:49) August 2012 中略 #8 Working with tabs (3:17) #7 Working with windows (5:32) #6 Working with buffers (3:28) #5 Indentation commands (5:41) January 2010 #4 Tidying whitespace (4:33) #3 Whitespace preferences and filetypes (3:29) #2 Tabs and Spaces (6:22) #1 Show invisibles (2:52)上のファイルを下のように編集せよ。
#1 Show invisibles (2:52) #2 Tabs and Spaces (6:22) #3 Whitespace preferences and filetypes (3:29) #4 Tidying whitespace (4:33) #5 Indentation commands (5:41) #6 Working with buffers (3:28) #7 Working with windows (5:32) #8 Working with tabs (3:17) 中略 #38 Writing a custom fold expression (12:07) #39 Profiling Vimscript performance (8:09) #40 Long-range line duplication (6:31)
第一感
私が最初に考えた回答を以下に示す。:%s/ #/\r#/g<CR>:v/#/d<CR>:sor n<CR>ZZ
- :%s/ #/\r#/g<CR>
ハッシュを目印に改行する。 - :v/#/d<CR>
ハッシュを含まない行を削除する。
グローバルコマンド※を用いている。 - :sor n<CR>
数字順にソートする。 - ZZ
ファイルを保存して終了する。
これで29ストロークである。
※グローバルコマンド「:g」「:v」
グローバルコマンドの書式は、以下のようになっている。
:[range]g[lobal]/{pattern}/[cmd]
「:v」は「:g」とは逆で、該当する{pattern}を含まない行に対してコマンドを実行する。
解説
【パイプを使った回答】
:%s/ #/\r#/g|sor n|v/#/d<CR>ZZ
パイプを用いた短い回答が既に提出されていた。
この回答は27ストロークである。
2か所の「<CR>:」を「|」に打ち変えるだけで、計2ストローク減らせる。
疑問に思ったのが、コマンドの順番だ。
以下のようにコマンドの順番を変えたところ、意図した結果が得られなくなった。
:v/#/d|%s/ #/\r#/g|sor n<CR>ZZ
一時間ほどヘルプを読んだりggったりしたが、答えは分からなかった。(グローバルコマンドでパターンの含まれる行を削除したが、内部的にマーカーが行を削除したためにずれて、レンジに意図しない影響が出てしまったのか?
最初に「%」で全体を範囲指定しておいて、最後に「v/#/d」した方が、正常に動きそうという感覚はあるが、確証は持てない。)
この原因に関して考えのある方は、コメントにてご指摘いただきたい。
【別解:マクロを使った回答】
qqG?#<CR>XD{Vppq39@qdGZZ
「#」が必ず各行の先頭に来ること、数字が降順に出現していることに着眼すれば、マクロを使うという発想も出てくるハズ(自力では考え付かなかった、悔しい)。これは21ストロークである。
oG?#<CR>XD{Vpp<Esc>40@.dGZZ
「.」レジスタを使ったテクニックで、さらに1ストローク減らすことができる。これは20ストローク。
0 件のコメント:
コメントを投稿
コメント表示は承認制に設定しています