プログラミング
VimでASCIIアートを作成する
Making ASCII Art in Vim (alexyang.dev)
要約
この記事は、Vimのエディタ機能を使ってASCIIアートを作成する方法を解説しています。カーソルを自由自在に動かすための`virtualedit=all`設定、複数行にわたる挿入や矩形領域の操作、マクロの活用など、Vimならではのテクニックを紹介しています。著者は、VimがASCIIアート作成に必須ではないとしつつも、既存のVimユーザーがより効率的に作業するためのヒントを提供しています。
全文翻訳
Alex Yang 著 | 購読する VimでASCIIアートを作成する 2026-07-12 公開
私は、ベアボーンなVimを使ってASCIIアートを作成するのが好きです。Vimには、この作業に特に役立つ組み込み機能がいくつかあり、ここではそれらを説明します。
この記事は、以前にASCIIアートを作成したことがあり、他のツールを探している人のためのものです。もし、あなたがASCIIアートを作成したことがないなら、この記事を読むのはお勧めしません!素晴らしいASCIIアートを作成するために、これらの情報は一切必要ありません。代わりに、お気に入りのテキストエディタを開いて、文字を入力し始めてください。何を作るか分からない場合は、巨匠の作品を研究し、実物を観察してください。その後、もしまだ興味があれば、戻ってきてこの記事を読んでください。
Vimは万人に合うものではありません。私は単に、自分が知っているものを使っているだけです。もしあなたが同じ呪縛にかかっている、あるいはそうなりたいのであれば、読み進めてください!
まず基本的な操作(ファイルの開き方、モードの切り替え、保存と終了など)を理解していることをお勧めします。もしVim初心者であれば、vimtutorで基本を学ぶことができます!
これらの注意点をすべて述べ終えたところで、本題に入りましょう。
カーソルを行末を過ぎて移動させる
ASCIIアートを描く際、カーソルを開いたスペースに移動させたいことがよくあります。ほとんどのテキストエディタでは、バッファをスペースで埋めない限り、カーソルをそこに移動させることはできません。確かにVimもデフォルトではそのように動作します。しかし、次のように設定してください。
:set virtualedit=all
これで、カーソルの行末を過ぎて移動できるようになります。そこに挿入すると、Vimは自動的に左側に必要な空白を埋めてくれます。カーソルを移動するために文字が存在する必要はありませんが、行自体は存在する必要があります。詳細については、:help virtualedit を参照してください。
.--. .--. .--. .--.
|@ @ | |@ @ | |@ @ | |o o |
| | | | | | | | | |~~~ |
'^^^^' '^^^^' '^^^^' '^^^^'
この機能を使わずに、セッションの最初にバッファをスペースで埋めることも完全に可能です。ただ、Vimではそれが絶対的に必要ではないことを知っておいてください。もしそれがやりたいことであれば、Vimはそれでも助けになります。iとpコマンドの前に数字を付けることで、それをその回数だけ繰り返すことができます。例えば、スペース文字を42回挿入することができます。
42i<space><esc>
そして、現在の行をコピーして5回貼り付けます。
yy5p
いずれにしても、カーソルが指示した方向に予測可能に移動することが重要です。そうでなければ、このガイドの他のテクニックのいくつかは、それほどうまく機能しません。
複数行挿入
仮に、nyan cat があるとしましょう。
,----------.
| ` .` `. |
| `. ` `,^----^. \
| . `. |
| @ w @|
`v-v----"-v-v-"
nyan cat の後ろにいくつか波線を書きたいが、左側に十分なスペースがなく、nyan cat を右にずらしたいとします。どうすればよいでしょうか?
ここに一つの方法があります。
Ctrl+v でVisual blockモードに入り、nyan cat の後ろの列を選択します。次にShift+i を押し、いくつかの波線を入力します。入力中に、最初の行にのみ挿入されているように見えますが、それは予想通りです。Escapeキーを押した後に初めて、選択したすべての行に実際に挿入されたことがわかります!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
,----------.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| ` .` `. |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| `. ` `,^----^. \
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| . `. |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| @ w @|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
`v-v----"-v-v-"
この場合、実際に行ったのは次のとおりです。
<ctrl+v>jjjj32I~<esc>
これはかなり作り話の例であることは認めます。私は通常、このテクニックを、一度に複数の行に空白を挿入してボックスを広げたり、何かを右に移動させたりするために使います。
矩形領域の塗りつぶし/削除
この汚れたボックスがあるとしましょう。これをきれいにしたいとします。
+--------+
| ` ~ |
| * ` .` |
| . ^ . |
+--------+
ここに一つの方法があります。
Ctrl+v でVisual blockモードに入ります。ボックス内の領域を選択し、r を押し、次にスペースを押します。
+--------+
| |
| |
| |
+--------+
完了です!私はしばしば、このテクニックを使って、描画の別の部分を誤って邪魔することなく、セクションを消去します(例えば、やり直したい場合など)。もし r の代わりに d を押していたら、次のようになります。
+--------+
||
||
||
+--------+
これは望ましい場合もありますが、この場合はそうではありませんでした。
矩形領域のコピーと貼り付け
+----+
| +----+
| |
+----+
+----+
+-| |
+----+
Visual blockモードでは、コピーと貼り付けもできます。選択した領域をクリップボードにコピーするには、y を押します(これによりNormalモードに戻ります)。貼り付けるには、p または P を押します。
Normalモードでブロックを貼り付けると、それは「挿入」され、右側のすべてがさらに右に押しやられます。
.----.
| @ @ |
| .--. |
+---------+
.--` <> '--.
| | `--. <> .--'
+---------+
/ <> \
/ .--. \
`-' `-'
私は通常、何もシフトせずに、既存のものを「上書き」するように貼り付けたいです。そのためには、ブロックをコピーした後、カーソルを別の場所に移動させて、次を試します。
1vP
これにより、それまであったものが効果的に上書きされるはずです。
これを分解すると、1v は v の特別なバリアントで、最後のVisualモード操作の次元を持つ選択範囲を作成します。次に、P は2つのことを行います。選択されているものを削除し、次に貼り付けます。P は p よりも推奨されます。なぜなら、クリップボードを上書きしないため、必要に応じて貼り付けを繰り返すことができるからです。この違いの詳細については、:help v_P を参照してください。
.----.
| @ @ |
| \__/ |
+---------+
.--` <> '--.
| | `--. <> .--'
+---------+
/ <> \
/ .--. \
`-' `-'
マクロ
Vimでは、一連のキーストロークを記録して繰り返し再生することができます。これは、単一のコマンドしか繰り返せない . キーを押すよりも強力です。
マクロを使い始める簡単な方法は、挿入と移動を組み合わせることです。例を示しましょう。
この例では、斜めに繰り返したい7x3のタイルがあります。
,.-~.
+-----+
` _+" --> | 7x3 | o;.-
+-----+
次のようにタイル状になるはずです。
+-----+
| 1 |+-----+
+-----+ +-----+| 2 |+-----+ +-----+| 3 | ...
+-----+ +-----+ +-----+
マクロのことは一旦忘れて、Visual blockモードでタイルをコピーし、カーソルを移動させて貼り付け、カーソルを再び移動させて貼り付ける、という方法でこれを実行します。結果は次のようになります。
,.-~.
` _+"
,.-~.
o;.-` _+"
,.-~.
o;.-` _+"
o;.-
このシナリオでは、マクロなしでも十分に合理的に実行できますが、もし10回または100回貼り付けたい場合はどうでしょうか? その場合、マクロを試す価値があるかもしれません。
まず、タイルをクリップボードにコピーします。次に、貼り付けを開始したい位置にカーソルを置きます。次に、'w' レジスタ('w' は任意の選択です。好きなレジスタを選んでください)にマクロの記録を開始します。
qw
貼り付け、次に次の貼り付け場所に移動します。
1vP<esc>7lj
最後に、記録を停止します。
q
これで、繰り返し可能なマクロができました。再生するには、次のようにするだけです。
@w
そして、マクロになったので、n回実行できます。
n@w
,.-~.
` _+"
,.-~.
o;.-` _+"
,.-~.
o;.-` _+"
o;.-` _+"
,.-~.
o;.-` _+"
,.-~.
o;.-` _+"
,.-~.
o;.-` _+"
,.-~.
o;.-` _+"
,.-~.
o;.-` _+"
o;.-
正直に言うと、ASCIIアートを作成する際にマクロをそれほど使いません。パターンをそれほど何度も繰り返す必要があることは稀です。それに、マクロを間違ってプログラムしてしまうと、手作業でやった場合よりも時間を無駄にしてしまう可能性があります。
別の例を挙げます。
/
/\/\
\ /
/ \
/\/\
/ \
/\/\
/ \/ \
\/\/\/
\ \/\
/ \
\ /
\/
これには、2つのマクロを使って作業を少し楽にしました。
最初マクロは、/ を描画し、カーソルを上と右に移動させます。
r/kl
2番目のマクロは、カーソルを下、
を描画し、カーソルを右に移動させます。
jr\l
これらのマクロは、カーソルが常に線の最も右端に配置され、次のセグメントを描画する準備ができていることを保証します。
マクロの詳細については、:help q を参照してください。
マウスサポート
. :`.
: `.
: .:
:.'\` \`
マウスサポートとは、Vimウィンドウ内のどこでもクリックしてカーソルをそこに移動できることを意味します。絵を描くのに便利です!
おそらくこれはご存知でしょう。通常はデフォルトで有効になっています。もし無効になっている場合は、次のように有効にできます。
:set mouse=a
ターミナルでも動作します!
これは、1994年以来 Vim を使用していない場合、またはオリジナルの vi エディタから来た場合は驚くかもしれません。
空白文字を可視化する
ASCIIアートを作成する過程で、見失うことがあります。