赤宿 = Red Inn

素人の試行錯誤と2Dローグライク制作 (GUI)

Top

 2Dゲームを作るブログです。素人のブログですので、内容の真偽にお気をつけください。

目次

 DevLog DevRef Env Self

過去に作ったゲーム

 ウディタローグライク:

  • 羊山ゴートの冒険 [2013/8]
     一作目。ウディタではゲームの流れを直接記述できたのが良かった。

  • ツギハギの行方 [2015/8]
     二作目。UIは良くなったが、ゲームと呼べない完成度。

現在

Vimの設定例(コーディング以外)

 コーディング周り以外の設定をメモ。Vimの所感は別記事にて。

 補完やエラー表示の設定は大変そうなので、プログラミングにはVSCodeを使っている。VimIDEにできると、ターミナルの1タブがIDEになるため、かなり便利そうではあるけれど……

基本的な設定

 NeoVim用の設定なので、実装によっては動かない部分があるかも。

必須

"" ファイル管理
set encoding=utf-8
set nobackup " バックアップファイルの生成を避ける、もしくは次行のように生成場所を変更する
" set backupdir=<path>

"" 操作
set hidden  " バッファを保存せずに切り替えることを許す

"" 表示
set showcmd " 入力中のコマンドを表示
set number  " 行番号を表示

"" 検索周り
set incsearch   " 入力中に随時検索(Enterを押さなければ、ESCや<C-[>で戻れる)
set ignorecase  " 大小文字を区別しない(smartcaseなら、大文字は小文字と区別する)
set hlsearch    " 検索対象をハイライト表示

任意

set mouse=nv    " マウス操作を許す(NeoVim用の設定かも?)
set scrolloff=3 " 画面の上下端から3行目にカーソルが来ればスクロール

" :h を :tab help に自動展開
cnoreabbrev <expr> h getcmdtype() == ":" && getcmdline() == 'h' ? 'tab help' : 'h'

let $BASH_ENV = ..  " シェル(Bash)の環境変数を設定(起動は遅くなる)

利便性

" 分割した.vimrcを読み込み
source <file>

ショートカット

 リーダはスペースキーにするのが機能的。

let mapleader = ' '

 実践Vimを読んだ方がいい。

.vimrc関連

 <Leader>ve(新規タブで)でedit、<Leader>vsでsource

 あくまで設定例

検索したらカーソルを中央に

 検索とzzをセットにする。

Yy$に修正

 CDと規則を統一したことになる。

 Yyyと被っているし。

[,]を使った移動

 [t:tabprebマッピングするなど。バッファ移動も作る。

 ブラウザのVim風拡張でも以外と使える設定。

ウィンドウの移動

 <C-l>で画面のクリア、を残すため、<C-S-X><C-W-X>マッピングした(X = H, J, K, L)。

小技

ハイライトをトグル

 こちらの回答を参照

全てのバッファをタブ化する

 慣れない内は、通常のエディタ同様に、タブとバッファを一対一で対応させるのもありだと思う。

 多分:tab sballでできる。wikiには、起動時に自動的にタブ化する設定も載っている。

拡張/プラグイン

 見出しがGitHubへのリンクになっているところもある。

基本

プラグインマネジャ

 vim-plugが最速。

テーマ (color scheme) の変更法
...
" 1. カラースキームの拡張をas付きで入れておく
Plug 'brendonrapp/smyck-vim' , { 'as': 'smyck' }
...

" 2. color でテーマを設定する
color smyck

タブバー・ステータスラインの改善

 vim-airlineを入れる。設定には、*結構*頑張る必要があるかもしれない。

小技

URLをブラウザで開く(gB

 vim-open-url

visualizedな範囲の拡大/縮小(v,V

 vim-expand-region viwvvになるのは大きい。

:bdでウィンドウを閉じない

 vim-bufkill

ウィンドウのリサイズモード

 winresizer.vim

ZENモード

 goyo.vim 余白は一定以下にできないらしいのは残念。

 分割ウィンドウの最大化としても使用できる。本格的なウィンドウ最大化は、手間がかかりそう。

 TODO: この辺の記事を読んでみる……?

Boostrapより

 Vim Boostrapで入っているプラグインから抜粋。

表示

" 行末のスペースをハイライト
Plug 'bronson/vim-trailing-whitespace'
" インデントラインを表示
Plug 'Yggdroot/indentLine'
" 括弧などの自動閉じ
Plug 'Raimondi/delimitMate'
" エクスプローラとその擬似的パネル化(全タブページで表示を同期)
Plug 'scrooloose/nerdtree'
Plug 'jistr/vim-nerdtree-tabs'

マッピング

" クリップボードからペースト
noremap <leader>p "+gP
" バッファの消去
nnoremap <leader>c :bd<CR>

日本語入力の改善

surround.vim

 surround.vimで日本語の括弧を挿入する

jasegment.vim

 非常に助けられている: 『日本語文章でのWORD移動(W,E,B)を文節単位にするスクリプト

ftrで日本語文字指定

 句読点の指定に<C-j>および<C-l>を割り当てるのが秀逸。mappingを楽にする関数もGood。digraphの修正も載っていたと思う。特に、日本語の母音は入力を楽にしたらいいと思う。

Modern CLI Tools

 素人目線/n番煎じでCLIツールを列挙する。

シェル・Git・エディタは省略

(ほぼ)標準のツール

rename

 複数のファイル名を正規表現で置換する。実装によって、引数の取り方が異なる。

trash

 ファイルをゴミ箱へ送る。

基本ツールの置換

 予めRustをインストールしておく。見出しのツール名はリンク付き。

man -> tldr

 使用例が主な非公式のマニュアル。先に当たれば、素早く理解が得られる。

cat -> bat

 ソースコードも綺麗に読めるcat。出力が長いと、ページャが起動される。(常にターミナルへ流すには: man bat > --paging を参照)。

 表示が崩れる場合は設定を変える。

diff -> diff-so-fancy

 ファイルの区切りが分かりやすいdiff。特にgitで役立つ。

grep -> ripgrep (rg)

 再起検索、ERE、着色がデフォルトのgrep

find -> fd

 再起検索、ERE、着色がデフォルトのfind。オプションも綺麗になった。

ls, tree -> exa, exa -T

 着色がデフォルトのls。ツリー表示も可能。

コンテンツ周り

cmus

 音楽の再生ソフト。キー操作はVimに近い。チートシートもある。

  • :add <path> で曲を追加
  • :update-cache でアーティストの設定などを確実に反映

 アルバムやアーティストの設定は、僕の場合はiTunes経由。

blogsync

 はてなブログの更新用ツール。詳細は別記事にて。

youtube-dl

 様々な動画投稿サイトに対応している。音だけにしたり、サムネイル付きにもできる(いいのだろうか)。

narou

 主にKindleユーザ向け。

Windows環境のNotes

Windows10

 そこまで便利にできなかったが、多少扱いやすくする。

必須のソフト

 初期状態では耐えられない。

Explorer -> Clover

 Cloverはマルチタブのエクスプローラ(ブックマーク付き)。文字がぼやけるため、OSによる拡大表示はOFFに(高DPIモニタ)。

f:id:samba_4e:20190218003049p:plain

 ユーザ名はネタ。

note: 'Sets' (Windows 10)

 バグでリリースが遅れている機能。標準的なWindowsアプリが、近い間にマルチタブ&ダークテーマ対応になるらしい。

 Ctrl+Win+Tabでタブ移動……は、ジョークだったかな。

アプリのswitcher

 CapsLock + アルファベット でアプリの切り替え。適当なソフトが見つからなかったため、後述のAutoHotKeyで強引に。

Atom

 とにかくメモ帳を止めたい。Atomなら間違いない。

f:id:samba_4e:20190218003053p:plain

必須の設定

IMEのON/OFF(IME: input method editor)

 Mac同様に、IMEをOFFにする「半角キー」、IMEをONにする「全角キー」を作る。

 IMEのプロパティから設定できる。

 無変換キーを「半角キー」、変換キーを「全角キー」に変えた。今後のWindowsは公式にこの方式を採用し、半角/全角切り替えのキーを無くすとか。

頑張って入れたソフト

 二時間くらいかけるつもりで始めた方がいいかも。

AutoHotKey_L

 Windowsのキー操作を上書きできる。以下のようにマッピングした。

  • スクロールを上下反転(好みの問題)
  • CapsLockをアプリの切り替え専用キーに
  • Linux風タブ移動
    • Ctrl+{ -> Ctrl+Shift+Tab
    • Ctrl+} -> Ctrl+Tab
  • Windowsキーを拡張
    • Win+q -> アプリを終了(quit)
    • Win+h -> アプリを隠す(hide)
  • altキーを拡張
    • alt+hjkl -> 十字キー
    • alt+[ -> Esc
    • Emacs風キーバインディング
      • alt+a と alt+^ -> Home(行頭へ移動)
      • alt+e と alt+$ -> End(行末へ移動)
      • alt+d -> Delete(ShiftでBackspace)
      • alt+h -> Backspace (ShiftでDelete)

 ドキュメントを読めば設定できる。日本語版wikiもある。

bug.n

 Tiling WM (window manager) 。Cloverのマルチタブと相性が悪かったため、僕は使わないことにした。

 細部が合わなかったというのもある。アプリのタグ付けによる仮想デスクトップは便利だった。

チートシート

 がココにアップロードされている。

ブラウザ

Edge -> Firefox

 アカウントを作れば、他のマシンと設定を同期できる。

起動 > 前回のセッションを復元する

 アプリの終了時に開かれていたタブを開く。基本的過ぎて忘れがち。

プラグインFirefox

 Chrome-Firefox間のプラグインは、ほとんどが移植されている(ツリー型タブを除く)。

ツリー型タブ

 Firefox限定。ツリー型タブをサイドバーに置いた。上のタブバーは消す

 Chrome系OSの場合、ツリー型タブの拡張は、どれも独立したウィンドウとして動く。  VivaldiのWindowパネルは、スタック型だけれど好みに合わなかった。

Vimium-FF

 左手だけでブラウジングできる(QWERTYキーボード)。タブの復元など、増えたショートカットも地味に役立つ。

Stylus

 任意のサイトのテーマを差し替える(Googleを黒く)。

 某webサイトを縦書きに。タイル型ウィンドウマネジャとも相性が良くなる。

Google search link fix

 Google検索結果のリンクを生リンクに差し替える。リンクのコピーに便利。

 Chromeの場合は、『トラッキングを拒否』する設定がある。

CLIコマンドライン

 ファイルのリネームに必要だった。

cmder

 マルチタブ対応のターミナル。tmuxが要らない。

f:id:samba_4e:20190218003045p:plain

 僕はPowerShellを使えないため、bashを入れた↓

WSL (Windows Subsystem for Linux

 最近のWindowsでは気軽にLinuxシェルを使えるらしいので入れた。動きはかなり遅かったので、結局仮想環境の方が良いのかも。

最低限のエイリアスbash

 全く好みの問題。

$ cat <<EOS >> ~/.bashrc
> pss() { export PS1='$ ' ; }
> cd() { command pushd "$1" > /dev/null ; }
> alias pd='popd'
> cdh() { cd "/mnt/c/Users/(ユーザ名)/$1" ; }
> cdd() { cdh "Desktop/$1" ; }
> alias pc='pbcopy'
> EOS
$ source ~/.bashrc
CLI Tools

 お馴染みのツールのバイナリをダウンロードし、/usr/local/binに入れた。

 入っているソフトが足りないのか、パッケージマネジャ経由のインストールができなかった。入れるだけの地力も無い。hmm..

終わり

 bug.nを導入しなかったため、仮想デスクトップは標準のものを使っている。

 多少はマシになったけれど、やはりタイル型WMが欲しかった。

RLチュートリアルをやる 環境構築編

内容

 Roguelike Tutorial Revisedのlibtcod編をやっていく。目標は、Python3を高級に使えるようになることと、Gitの試用。

 今回は環境構築を行う。

環境

項目 使用物
言語 Python3
ライブラリ python-tcod
エディタ VSCode
キーマップ Vim

参考

 実は、RogueBasinにもPython3 + libtcodチュートリアルがある(Python2ではなく)。環境構築や、フォントのダウンロードを参考にできる。

環境構築

 意外と不親切なところがあったため書いた。参考のページを見れば十分だけれど、最も速い方法として置いておく。

言語 Python3

 簡単のため、グローバルに入れる。(仮想環境ではなく)

 操作はターミナル(コンソール)から。ダウンロードページから入れても良い(むしろ無難?)。

$ # ※Mac向け
$ # Homebrewが無ければインストール
$ brew --version || ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ # readlineを入れておく(REPLで十字キーなどが有効になる)
$ brew install readline
$ # Python3が無ければインストール(pip3も付いてくる)
$ python3 --version || brew install python3
エイリアス

 ターミナルからpython3と入力する手間を減らす。

$ # bashユーザ向け
$ echo 'alias py=python3' >> ~/.bashrc

 dotfiles(ドットから名前が始まる設定ファイル)は、どこか一箇所にまとめておいて、ホーム直下にはリンクを置くのが無難。GitHubなどにリモートリポジトリを置いておくと、さらに安心できる。

readline

 Macの場合、REPL十字キー操作が利かず、記号入力になるかもしれない。REPLの起動時に、readlineをimportする必要がある。

 詳しくはwebで!(検索して頑張る)

仮想環境の構築

 手間が大きそうで試していない。

 Python3.3~と一緒に入ってくるvenvを使うのが無難に見える。公式のチュートリアルにも載っている。

 最近はpipenvも良いらしい。

ライブラリ python-tcod

 pip経由で入れれば、パスが通る。

$ # python-tcodのインストール
$ pip3 install tcod

 これで、import tcodとできるようになったはず。

 libtcod, libtcodpy, tdl, python-tcodが存在し、区別には、この投稿が参考になる。
 
 python-tcodには、メモリリークが無い。tcod.console_delete()の定義に飛べば、明記されているのを確認できる。

フォント画像

 ここからダウンロードする。

 初見なら、arial10x10.pngを使うのが無難。他のフォントを使う場合は、設定が必要になる。

 フォントの設定を間違えても、特にエラーは出ない。マップを表示してからフォントを差し替えた方が、設定ミスが判別できて良いと思う。

mypy

 Python3で静的型チェックを行うソフト。

 ネイティブで静的型付けな言語を使った方が楽だった。

インストール
$ pip3 install mypy # ※mypy-langは古い
$ mypy main.py # 静的型チェックを実行

 .mypy_cache/ を .gitignore に追記した。

mypyの設定

 この項によると、typeshedに登録されていないライブラリには、型チェックが効かない。そこで、tcodの読み込み時のエラーを飛ばす。

# project/setup.cfg
[mypy]
python_version = 3.70
# 厳しめの設定
warn_return_any = True
warn_unused_configs = True
strict_optional = True
disallow_incomplete_defs = True
disallow_untyped_defs = True

[mypy-tcod.*]
ignore_missing_imports = True

 この項を参考に、*を使って、サブモジュールの読み込みに対するエラーも抑えた。

 なおmypyは、全ての変数にNoneを許さない(typing.Optionalを使えばNoneも可能)。strict_optional = False にすると、全ての型が Nullable (Noneable?) になる。

 object, int など、全ての型について None を許すかを設定する事になる。

VSCode

設定ファイル

 dotfiles同様に、一箇所に実態を置き、本来の場所にはリンクを置いてもいいかもしれない。

settings.jsonの設定例

 dataclassやtypingといった新しいライブラリは、pylintの相性が悪かった。linterはflake8に変更している。

{
    // ****************************
    // ********** Editor **********
    // ****************************
    "editor.formatOnSave": true,
    "editor.formatOnPaste": true,
    "extensions.autoUpdate": true,
    "files.trimTrailingWhitespace": true,
    "workbench.colorTheme": "Default High Contrast",
    "workbench.editor.enablePreview": false,
    "workbench.sideBar.location": "right",
    // ***************************
    // ********** Files **********
    // ***************************
    "files.trimTrailingWhitespace": true,
    "files.exclude": {
        "**/.git": true,
        "**/.idea": true,
        "**/.vscode": true,
        "**/__pycache__": true,
        "**/.mypy_cache": true,
    },
    // ****************************
    // ********** Python **********
    // ****************************
    "python.linting.enabled": true,
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.linting.mypyEnabled": true,
    // "python.linting.pydocstyleEnabled": true,
    // ***************************
    // ********** Shell **********
    // ***************************
    "terminal.integrated.shell.osx": "/usr/local/bin/fish",
    "terminal.integrated.shell.linux": "/usr/local/bin/fish",
}

 mypyのエラーがエディタ上で表示されていない気がする。なぜだろう。

 毎回ターミナルから走らせているが……

所感など

Python3

 チュートリアルドキュメント標準ライブラリを参考にする。

まとめ

 Pythonは、『綺麗&手軽&高級』な言語ではなかった。

 ネイティブに静的型付きの言語を使った方が良かったみたい。

  • 基本的な機能にも、幾つか落とし穴がある
  • 高級な機能を使うには、それなりにドキュメントを読む必要がある
  • 言語機能の拡張のための import が多い
  • 循環importに悩まされる

型表記 type annotation

 循環インポートの回避などでは、特殊でunstableな記法が必要になる。型表記をしなければ、補完は効かない(VSCode)。

 毎回typingモジュールをimportするのは手間だった。

property, enum, dataclass などのリッチな機能

 Python本体には無かった機能も、確かに動作する。ただし、importが手間。

静的型チェック

 mypyがやってくれる。ドキュメントは平易だが、詳しく読み込む必要がある。

 外部ライブラリの型チェックには弱い。また、検出してくれないエラーもあった。(詳しい仕様を理解すれば、納得できるかも)。

Shell, Vim, Git

 今回初めて使う3ツールの所感。

シェル

 シェルによって、基本的な作業場がターミナルに替わった。高級なCLIツールを駆使した、的確な操作が可能になった。シェルがあってこそのコンピュータ、と考えさせられる程。

Vim

 Vimは、テキスト編集のフレームワークだった。動作が速くなり、操作が強力になり、編集時の視点すらも変えられた。

 プラグインでかなり遊べた。(ただし、VimIDEにするよりは、VSCodeなどにVimプラグインを入れた方が速いと思う)。

Git

 Gitには、ソースコードの概念を変えられた。ソースの状態を『流れ』として複数保持し、自由な方向へ伸ばしたり、統合できるようになった。差分や履歴の表示も良かった。

Sync Hatena

 はてなブログも、ローカルファイルと同期する形にできた。CLIに慣れると、高級なツールを使用できて嬉しい。

記録と目的意識

 git commit、ブログの更新、どちらも制作の目標にできる。言わば、log-driven development?

 同期が簡単すぎて、日頃からオンライン感が強過ぎるのがやや問題。

blogsync

 blogsyncは、はてなブログへのpull, push, postができるCLIツール。GUIからはmarkdownをインポートする機能が無かったため、pullできるだけでもありがたい。

 複数のはてなブログを扱える。記事の削除や、URLの貼り直しはできないと思う。

詳しい使い方

「今」からファイルをpostして調べる。blogsync postには、--title--custom-pathというオプションがあるが、front matterからも設定できるのか試してみる。

---
Title: Sync Hatena
Category:
- Self
CustomPath: self_4
---

 これは、この記事を投稿するときの設定。CustomPathというのは、READMEには無いが、ソースを検索してみたら、明らかにyaml(で書かれたfront matter)からも抽出される項目だった。投稿してみる。

$ pwd
path/to/local/redinn.hatenablog.com
$ blogsync post redinn.hatenablog.com < entry/self_4.md

結果

 出力はこう。

      POST ---> https://blog.hatena.ne.jp/ユーザ名/redinn.hatenablog.com/atom/entry
       201 <--- https://blog.hatena.ne.jp/ユーザ名/redinn.hatenablog.com/atom/entry
     store /Users/ユーザ名/Dropbox/n/blogsync/redinn.hatenablog.com/entry/self_4.md

 entry/self_4.mdが上書きされて、front matterに、Data, URL, EditURLの三項目が追加された。CustomPathは、front matterの中に保持されたままだった。

 更新は、投稿よりも簡単に書ける。

$ blogsync push entry/self_4.md

改善の余地

post先の自動指定

  • a) front matterで投稿先を設定する機能があれば使う
    • あるのだろうか?
  • b) wrapperを作る
    • i) front matter から投稿先を読み取る
    • ii) 現ディレクトリ位置から投稿先を判断する
  • c) CLI操作を改善する
    • 簡単にブログのURLを入力できるようにする

 wrapperを作って、contextualな投稿ができれば十分かな。

本当に既存記事のURLを変更できないのか?

 削除ができないようなので、多分不可能。

Vimの所感

 テキスト編集のフレームワークとして優秀だった。範囲操作と操作履歴が真髄だと思う。プラグインは、必須だけれどサポート程度。

 Vim(およびシェル)の魅力は、日常的なマシンとの付き合いを変えてくれることにあると思う。マウス無しでテキストを編集するなら、もうVim以外でやる気にならない。

Vimの色々

 細かくは書かないし、書いても伝わらないと思う。導入だけ。

Vimの種類

 本家Vim、Neovim、GUI実装のVimなどがある。EmacsVim風のキーバインディングを取り込んだ拡張(Spacemacs)もある。

 本家Vimは、動作ややが重い(特にカーソル)。僕はNeoVimを使っている。GVimはターミナルの1タブとして使用できず、どうしても独立したアプリになる。

Vimのキー操作

 編集にアクション性ができて楽しい。

 マ○オをジャンプさせるより楽しい。

モードが分かれている modal editor

 挿入モードiが分かれているため、編集(選択、削除、置換……)に豊富なキーを利用できる。シフトキーの代わりはvisualモード。

 modelessなCLIエディタEmacsは、対照的に修飾キーの使用が多いらしい。

動作 = 操作+範囲 action = operator + motion

 組み合わせで操作ができる。

 e.g. d$  行末まで消去(Dと同じ)
 e.g. cf。 文末まで置換(僕はcf<C-l>マッピングした)

 カーソル移動が単語ベースになるなど、基本的な操作も改善される。頭文字や正規表現との対応のおかげで、無理無く暗記できた。(uでundo、素晴らしい!)

履歴の単位が優れている

 一連の操作が一回分の操作履歴となるため、リピートやredo/undoが非常に強力。削除dではなく置換cを使って履歴数を減らすなど、小技でさらに整理が利く。

Q. でも、(学習コストが)お高いんでしょう?

 マッスルメモリを鍛えてください(誤用)。

 学習曲線は二次関数的なイメージです。加速度的な上達に入れば、夢中になれると思います。

Vimの活用

使用場面

 まずrcファイルの編集。markdownもいける。フットワークが軽いため、プログラミング言語のちょっとした記述にも向いている。

 CSVGUIエディタで編集したい。本格的にプログラミングをするには、補完などの設定が大変そう。

 日本語も、以外とVimで書ける。単語単位のカーソル移動はもちろん、文や段落単位のカット&ペーストが効いてくる。

Vim以外にも導入できる

 思わぬボーナス。

IDE / Editors

 プラグインで大体Vimにな流。

 主にコード向け、ディテールは不十分。たとえば、digraphや日本語の単語区切りには対応していない。

ブラウザ

 アドオンVimiumを入れた。ショートカットの拡張が、直感的に扱える。

 左手でスクロールしたり、キーボードからリンクを開ける。

Vimプラグイン

 最も簡単と聞いて、vim-plugで入れている。実際に楽。

 ただ、コンフィグなどの設定は、プラグイン毎に説明をよく読む必要がある。

f:id:samba_4e:20190118200526p:plain
表示が崩れており、まだプラグインは設定中

 プラグインには、常駐型エクスプローラ、ZENモード、リッチなステータスラインなどがある。

全角記号に対するmatchpairsやテキストオブジェクト

 こちらの記事のリンク先を参考にする。

キーマッピングの設定例

 Vimユーザ向け。詳しくは別の記事でやる予定。

挿入モードでEmacs風操作

 <Delete> <Backspace> 0 ^ $ などにマッピングする。<C-o>への変換で、挿入モードからExコマンドも使えるのがポイント(挿入ノーマルモード)。ただし、<C-o>の前後で履歴が分かれる。

 insert mode中で意図的に履歴を切るには: <C-g>u

句読点へのf/t

 fやtで日本語文字にジャンプするのに、digraph<C-k>を利用できる(h digraph, h digraph-table)。句読点はf<C-k>._のようにアンダースコアが必要になり、入力が手間。

 <C-h><C-l>で句読点を指定できるようにすると、編集が非常に楽になる。また、母音のdigraphは修正しておくと便利。

xキーなどでレジスタに入れない

 無名レジスタ"_へのカットに差し替える。これは本にも載っていたかな。

Vimの本

 自分用のチートシートを用意して、一通り操作を覚えた。本も読んでみる。

実践Vim 思考のスピードで編集しよう!

 Vimの操作が改善される本。序章でリピートキー.;@を導入し、次章からvimゴルフが始まる

Vimテクニックバイブル ~作業効率をカイゼンする150の技

 主にVimの設定の変更に役立つ本。ネットで調べるよりも遥かに速そう。

 追記: 参考にしたのは3, 4項目だけだった。