Wednesday, April 20, 2016

Vimで、ファイル全体の各行の下に、一行ずつ空行を入れる

Vimで、ファイル全体の各行の下に、一行ずつ空行を入れたい。

 

というのも、「各種宣言文」や「アピール文」「法律条文」(案)などをワード形式でもらうことがあるのだが、

textutil -convert txt *.doc

などとやって、でき上がったテキストファイルを見ると、

行が詰まっていることが多く、とても見づらい。

 

そこで、そのテキストファイルを Vim で開き、一気に、各行(段落)の下に、一行ずつ空行を入れたいと思った。

 

しかし、その方法がなかなか分からなかった・・・。検索したところ、コマンドラインモードから以下の通りやれば、「一行ずつならできる」ことが分かりました。「でも、一遍にファイル全体にはできません」。

  • この行の上に、一行、空行を入れる。

call append(line('.')-1, '')

  • この行の下に、一行、空行を入れる。

call append(line('.'), '')

※ 参考にしたサイト

http://superuser.com/questions/147715/vim-insert-empty-line-above-current-line-not-open-i-e-without-entering-inser

 

多分、これでできたっぽい。「一遍にファイル全体に」一行ずつ空行を入れる!

g/$/call append(line('.')-1, '')

g/$/call append(line('.'), '')

 

 

 

########################################################################

【追記 2016年04月22日  09時01分】

v/\S/call append(line('.'), '')

 

Vim の正規表現では \S を使って「空行以外」つまり「文字が書かれた行」を表現できる。

 \S は「タブ文字」「スペース文字」以外を意味する。

 

そこで、、、

 

(1)

^\S\+$ とやれば、「空行以外」つまり「文字が書かれた行」が表現できるはず・・・、と思った。

v/^\S\+$/d というVimのグローバルコマンドの否定形で、「その行の中に、空白文字やタブ文字以外の普通の文字が書かれている行」以外を一遍に削除しようとした。

 → 結果はできず!

 

というのも、「その行の中に、普通の文字が書かれて」いても、同時に「その行の中に、空白文字やタブ文字」が書かれていると

^\S\+$ ではヒットしないのだ。

 

(2)

方針転換して、「空白文字」や「タブ文字」以外の「普通の文字」を Vim の正規表現で表現することを目指した

 

Vim 正規表現

文字・数字 \a [a-zA-Z] アルファベット文字
\A [^a-zA-Z] アルファベット以外の文字
\d [0-9] 数
\D [^0-9] 数字以外の文字
\w [0-9A-Za-z_] 英数字
\W [^0-9A-Za-z_] 英数字以外の文字
\s [[:blank:]] ホワイトスペース文字
\S [^[:blank:]] ホワイトスペース以外の文字

 

以下のように書くと、目指していた行が確実にヒットした。

^\A\+$

 

そこで、

%s/ / /g

v/^\A\+$/d

g/^\A\+$/call append(line('.'), '')

 と、やると、最初に目指していた結果が「だいたい」得られた。うれしい!

(※ ただし「半角スペース文字」だけで構成された行は残る)

一行目は、まず、ファイル全体で「全角スペース文字」を「半角スペース文字」に替えている。

 

まだまだ、研究の余地はあるが、今日はここまで!

No comments:

Post a Comment