編集とプログラミングと私

こんにちは。こちらは「編集とライティングにまつわるアレコレ」アドベントカレンダーの2日目の記事です。

adventar.org

昨日は本企画の発案&主宰の id:mohri さんによる以下の記事でした。

mohritaroh.hateblo.jp

GitHub Desktop、なかなか良さそうですね。

こういったGUIツールは何となく使い方を覚えるまでが面倒。という先入観があって触ってなかったですが、思っていたより直感的に使えそうなので一度試してみようかな〜と思いました。

あと、GitHubありきではなくてローカルファイルの版管理ツールとして使ってみるという視点も新鮮でした。

私にとっての「編集」

さて、今回の大テーマは「編集とライティング」ということですが、ライティングはともかく「編集」というのはけっこう大ざっぱというか、幅の広い概念ですよね。

たとえばぼく自身が抱く印象としては、「編集」と言ったら「翻訳」に近いというか、左っかわのテーブルに置いてある「素材」を目の前で何やらこねくり返して、右っかわのテーブルに「仕上がり」としてポンと置いていく、変換していく、みたいな作業を思い浮かべます。

これは文字校正とか、文章全体の構成を組み換えるとか、あるいは文字起こしなんかも近いでしょうか。
(文字起こしは音から文字への変換なので)

しかし一方で、メディアの編集といったら企画とか営業みたいな側面もありえるでしょうし、取材なんていうのもけっこう独自のメソッドというか、世界観がありそうです。

ぼくの場合、対談や座談会をテキスト化するために現場に立ち会う、みたいなことは時々あるものの、やはりどちらかというと前者の翻訳的なこと、仕事場にこもってモノが仕上がるまで出てこない。みたいな作業が多くて、後者の、いわばゼロからイチを立ち上げていくような作業にはあまり馴染みがないので、ここでは馴染みのある前者の方を念頭に置いて書いていきます。

(ここまで前置きでした)

この記事のテーマは……

さて、今回のアドベントカレンダー、当初はこんなに速攻で埋まるとは思っていなくて、きっと一人で何個か書くだろうと勝手に思っていたので、だったら最初はVimの小ネタをサクッと書いて、あとは空き状況によって書けるものを書くか〜、とか思っていたのでしたが、あっという間に全席埋まりましたね。 😅

よって方針を変えまして、この記事ではVimを中心としつつもプログラミング全般みたいなことを視野に入れ、最終的には上の方で書いた、ぼくにとっての編集作業みたいなことをぼんやり醸していけたらいいかと思っております。

これに際して、じつは最初に「編集(やライティング)のアドベントカレンダー」と聞いて、んー、まあネタとしてはこの辺か? と思ったのがあるので、とりあえず見出しだけ列記してみますと、こんな感じで。

1. 便利なショートカットあれこれ
2. 便利なExcel関数あれこれ
3. 私のメール術
4. Vimでどんなことをしてるのか
5. シェル(bash)でどんなことをしてるのか
6. Perlでどんなことをしてるのか

まあ、これで6日は消費できるかな、とか思っていましたが、上記のとおりもうそんな席は残っていませんし、かといってこれを全部1本の記事に詰め込んでいたら書くのも読むのも大変なことになりますから、今回の記事ではその中から4番目のVimと6番目のPerlについて、要点をつまみつつ書いてみます。

ちなみに、そんな経緯でこの後は、しばらくプログラミングにまつわる話が続きますが、実際には上にもあるように「私なりのメールの書き方」とかもネタに入れていたぐらいなので、今後に続けて書かれる方におきましてはこういう技術ネタに縛られず、好きなことを書いてほしいと思っています。

(まだ前置きでした)

Vimでサクッと書き換える

さて、もう何度も書いてるのに今さらですが、こちらをお読みの皆様は「Vim(ビム)」ってご存じでしょうか?

いや、ぼくも他人に語れるほど知ってるわけではないですが、えーと入門的には、やはりドットインストールあたりが親切でしょうか。

https://dotinstall.com/lessons/basic_vim

ちなみにぼく自身がVimに触れはじめたのは、以下の記事の頃でした。2013年。

ここ数日のvim - 103

ようはテキストエディタでありまして、ぼくで言ったらVimの前にはCotEditorというのを使っていましたが、

coteditor.com

まあMacだったらテキストエディットというのもデフォルトでありますし、そういうメモ帳的なものですね。

ただ、このVimというのは単なるメモ帳にはまったくとどまらず、文字を打ち込む以上のことがあれこれできてしまいます。

具体的には、たとえば上に書いたこれ、今回のためのネタ帳ですが。(再掲)

1. 便利なショートカットあれこれ
2. 便利なExcel関数あれこれ
3. 私のメール術
4. Vimでどんなことをしてるのか
5. シェル(bash)でどんなことをしてるのか
6. Perlでどんなことをしてるのか

この行頭のナンバリングに続く「ドット」の部分を、「閉じ丸括弧」に変えたい! というときにどうするか。

まあ、このぐらいの行数だったら手動でポチポチ書き換えてもいいわけですが、これが100行も200行もあったらどうでしょうか。けっこうキビシイですね。

もちろん(というか)、上記のCotEditorをはじめ、エディタに付属している検索&置換機能を使う手もあるわけですが、とりあえずVimだったらこうします。

gyazo.com

はい。その変えたいところ(ドット)を直接さわるようにして、一列分フイッと変えてしまいました。

べりー、便利!

これがもし、検索&置換用のウィンドウにわざわざ入れていくと、こんな感じになると思うのですが。(Googleドキュメントを使ってみます)

gyazo.com

たしかに、これもわかりやすいんですが、でも「今ある状況」と「求める結果」との間にその置換用ウィンドウが挟まってしまって、ちょっと直感的ではありません。

しかし、Vimならば上のとおり、あたかも直接自分の手で対象をさわっているかのように、書き換えていくことができるのです!

(……)

大丈夫でしょうか。大丈夫ですね。

Vimで知りたい情報をカウントする

さらには、Vimを使えばもっと面倒な作業だって簡単にできてしまいます。

例として、こんな素材を持ち出してきましたが。

f:id:note103:20171201023132p:plain

これはぼくが今メインでやっている仕事の「commmons: schola(コモンズ・スコラ)」という、坂本龍一さんがかれこれ10年近く続けているライフワーク的音楽全集で使っている脚注のデータですが。

commmons scholaについて | commmons:schola(コモンズスコラ)-坂本龍一監修による音楽の百科事典- | commmons

このシリーズ、CDブックの形態ですでに第16巻まで刊行していまして、いま第17巻を絶賛制作中なのですが(ピークです)、それゆえ脚注も16巻分のデータが溜まっていまして、上記はそれをスプレッドシートで管理している画面の一部です。

で、その左端の方、A列に数字が並んでいますが、それが巻のナンバーで、B列にある見出し語句が第何巻に掲載されたか、ということをA列から読み取れるようになっています。*1

では、この全データ(2008行ありました)のうち、第6巻の脚注は何個あったんだろう? というときにどうするか。

まあ、そのスプレッドシートの機能をちょこちょこ使えばカウントできるかもしれないですが(知らないのですが)、Vimを使うなら、こうします。

1. まず内容をVimに全コピペして
2. コマンドラインモード(というのがあります)で以下を打ち込む

:%s/\v^6\t//gn

と、このように出てきます。(一番下の方を見ておいてください)

gyazo.com

はい。104個ありました。

Perlで知りたい情報をカウントする

しかしそうなると、6巻だけじゃなくて、他の巻の注釈個数も全部一気に知りたい、という欲も出てきます。

果たして、そういう場合にはどうすればいいでしょうか?

前述のとおり、このシリーズはすでに16巻出ていますから、同じことを地道に16巻分(厳密にはあと15回)繰り返すべきでしょうか?

もちろん、そうするのも自由ですが、思い出してください。我々にはPerlがあるのでした!

(……)

はい。結論から言いますと、じつはつい数日前に、実際にその情報を知りたくてそのためのコードを書いたからここでネタにしているのですが、そのときにはこういうものを書きました。

#!/usr/bin/env perl
use strict;
use warnings;

my @array = <DATA>;

my $num;
my %count;

for (@array) {
    chomp $_;
    if ($_ =~ /\A(\d+)\t/) {
        $num = $1;
        if ($num == 16) { $count{$num}++; }
        elsif ($num == 15) { $count{$num}++; }
        elsif ($num == 14) { $count{$num}++; }
        elsif ($num == 13) { $count{$num}++; }
        elsif ($num == 12) { $count{$num}++; }
        elsif ($num == 11) { $count{$num}++; }
        elsif ($num == 10) { $count{$num}++; }
        elsif ($num == 9) { $count{$num}++; }
        elsif ($num == 8) { $count{$num}++; }
        elsif ($num == 7) { $count{$num}++; }
        elsif ($num == 6) { $count{$num}++; }
        elsif ($num == 5) { $count{$num}++; }
        elsif ($num == 4) { $count{$num}++; }
        elsif ($num == 3) { $count{$num}++; }
        elsif ($num == 2) { $count{$num}++; }
        elsif ($num == 1) { $count{$num}++; }
    }
}

use DDP {deparse => 1};
p %count;

__DATA__

冗長!

……ともあれ、詳細は割愛しますが、この最後の「__DATA__」と書かれた下に件のリストをまた全コピペして、実行するとこんな風に出てきます。
(画面の下半分を見ておいてください)

gyazo.com

ヒュー! 一発で出てきましたね。
6巻もちゃんと104個になっています。

(8巻多すぎ……)

まとめ

いかがでしょうか?

本記事はVimPerlの入門を目的としたものではなく、いち編集者であるぼくが、普段どんなふうに自分なりの作業をしているのか、ということを紹介するものだったので、いろいろな細かい手順や前提を驚異的なまでに省略してしまいましたが、こうしてプログラミングを絡めると、日々の地味〜な作業も飛躍的に効率化され、なおかつ目覚ましいほどのクリエイティヴィティを味わえる! みたいなノリが少しでも伝わりましたら幸いです。

ちなみに、ぼくがVimにのめり込むきっかけになった話や、Perlをはじめとするプログラミング入門についてなどは以下にもちらちら書いていますので、ご興味のある方はぜひどうぞ。

ということで、本日の記事は以上です。

最後までお読み頂き、ありがとうございました!

明日のアドベントカレンダーのご担当は id:minesweeper96 さんです。
お楽しみに!!

adventar.org

*1:同じ語句でも巻によって内容が違うので、「エディ・コクラン」なんかは複数記載されています。