全然ブログを更新しない thinca です。
さて、今年も Advent Calendar の季節がやってきました。あちこちで大量の知見が出回っていますね。
記事が増えるのはいいことなんですが、一方で私はこの流れにあるつらみも感じていました。
書くのがつらい
長編記事は書くのが大変です。いや、別に誰も長編記事を書いてくれ、とは言っていません。
しかし上がってくる記事はどれも力作。こんな流れの中、しょぼい記事は上げづらい、なんて感じたことはないでしょうか。
特に日本人は空気を読むように訓練されている節があるので、ハードルが高いと感じてしまう人もいそうな気がします。というか私は大作記事は大変なのでできれば書きたくないです…。
読むのがつらい
特にこの時期に大量の記事が出回ることになるので、楽しみな反面、読むのが大変です。
途中で挫折して読むのをやめてしまったカレンダー、ありませんか。
試験的な試み
そこで今回試しにやってみたのが、Vim Short Tips Advent Calendar です。
内容を、Twitter の 1 ツイートに収まるものに限定し、書く手間と読む手間を下げよう、という試みです。テーマが Vim なのは私が Vim 界隈で活動しているからですね。
内容も、高度なものである必要はありません。というか短いので高度なことは書けません。知ってるとちょっと便利な Tips がメインです。
実はこれ、11 月中にカレンダーがあちこちで立てられるなかぼんやり考えていたものなんですが、vim-jp コミュニティ内でコンセプトを説明して参加者を募ったのが 11/30 の 20 時頃。実際にカレンダーを立てたのはその1時間後の 21 時頃というギリギリでの開始でした。
にも関わらず、参加者はあっという間に集まり、最初数日分は即座に埋まり、その辺りを走っているうちに最後まで全てメンバーが埋まりました。コンセプトの狙い通り、参加のハードルを下げたのが功を奏したのだと思っています。
参加者や各 Tips を見てくれた人からも概ね好評だったように思います*1。こういうやり方もありだな、と感じました。
Tips 一覧
せっかくなので Tips 一覧を引用してみたいと思います。短いので全部並べてもサクッと読めますね。お気に入りの Tips を見付けたら、ぜひいいねや RT をしてあげてみてください。
1日目
2日目Vim で貼り付けは p ですが、]p を使うと、貼り付ける内容のインデントを貼り付け先のインデントに合わせて調整した上で貼り付けてくれます。貼り付けた後にインデントの再調整をしなくて済むので便利です。#vimtips_ac
— thinca (@thinca) 2019年11月30日
3日目gVimでGUIのタブが使われますが、 set guioptions-=e することで、テキストベースのタブになります。 #vimtips_ac
— Tsuyoshi CHO (@tsuyoshi_cho) 2019年12月1日
4日目皆さん、Vimを使っているならnormal modeのときはhjklを使うと思うので、矢印キーは使わないですよね!
— IK (@get_me_power) 2019年12月2日
そこで、矢印キーをgitに割り当てると便利そうです!
例えばgina.vimを使い、↑でGina status、→でGina diff、みたいに割り当てるとタイプ数を削減できて便利です!#vimtips_ac
5日目vim +/gorilla a.txt で a.txtからgorillaという文字を検索した状態でファイルを開く
— ゴリラ@自然に帰りたい (@gorilla0513) 2019年12月3日
vim +100 a.txt で a.txt の100行目にカーソルが移動した状態でファイルを開く#vimtips_ac
6日目エンジニアVimmerの方…
— monaqa (@mo_naqa) 2019年12月4日
foo(x, y|, bar(), baz())
みたいに混み入った関数内で「あー,カーソル(`|`)より右の引数全部いらんかったわ…」ってなりますよね…そんなときはvimrcに
nnoremap dm) vmzi)o`zod
と書くのです…dm)と打つだけでfoo関数の対応する括弧まで消せます…お試しあれ… #vimtips_ac
7日目Vimでインデントを変更するには << と >> を使います。部分的に変更するにはビジュアル選択で < と > を使います。ただし実行後にビジュアル選択が解除されます。選択したまま続けてインデントの変更を行いたい場合は以下を vimrc で設定します。
— mattn (@mattn_jp) 2019年12月5日
vnoremap < <gv
vnoremap > >gv#vimtips_ac
8日目@igrep さんに教えてもらったネタ
— てんなし (@tnnsh1) 2019年12月7日
: を押して Ex コマンドを入力中に <C-f> を押すのです
コマンドラインウィンドウが立ち上がり、入力中のコマンドをいつもの感覚で編集出来ます
正規表現を微妙に間違えて修正するときとかに便利
// これ知るまでカーソルキーで頑張って修正してた#vimtips_ac
9日目getline()
— 賀数義人(かかずよしと)mixi_auc (@yoshitia) 2019年12月7日
指定行の文字列を取得する関数。
:echo getline(1) ""ファイルの1行目を取得
:echo getline(".") ""カーソルの現在行を取得
:echo getline(".", line(".")+4) ""実際に打ってみて下さい。#vimtips_ac
10日目カーソルの下にある単語を簡単に別の単語に全て置換する方法(例: バッファにある `貴様!` を` 全て `そのまさかだ!!` にする)
— heavenshell (@heavenshell) 2019年12月8日
やり方: `貴様` の下にカーソルを移動し `*:%s//そのまさかだ!/g`#vimtips_ac
11日目Vimの便利なfold機能の紹介。
— Masaru Oinaga (@Scstechr) 2019年12月10日
1) Vで範囲を選択してzfで折畳、zoで展開 (基本)
2) zOで再帰的に展開、zj/zkで折畳の箇所を移動
3) zdで折畳削除、zDで再帰的に削除、zEで全部削除
4) [zで折畳の先頭、z]で折畳の末尾に移動#vimtips_ac
12日目:mksession file
— もぷり (@Mopp_jp) 2019年12月10日
を使うと
- 現在開いてるファイル
- 画面の分割状態
をファイルに保存することが出来ます
Vimを開き直して:source fileするとその状態を復元できます
複雑な画面分割をしてしまったときや、頻繁に使う画面構成やファイルがある人におすすめの機能です#vimtips_ac
13日目シンボリックリンクをいい感じに貼ることでvim/neovimで重複せずPluginを管理したり、同じ設定を利用できたりします。
— cappyzawa (@cappyzawa) 2019年12月11日
自分はneovimを中心に利用するので以下のよう設定しています。
ln -s $XDG_CONFIG_HOME/nvim/init.vim -> $HOME/.vimrc ln -s $XDG_CONFIG_HOME/nvim -> $HOME/.vim#vimtips_ac
14日目エラーハンドリング以外のtry/catch/finally例。
— wordi (@wordijp) 2019年12月13日
- コマンドの成功時メッセージ
try
:%:s/\s\+$//g " わざとeを付けない
echo 'trimmed'
catch
endtry
- エラー(or QuickFix or Location)リストで最初(or 最後)表示
while 1
try
:lnext 999
catch
break
endtry
endwhile#vimtips_ac
15日目Vimで置換するとき無意識に :%s/aa/xx/gcを使ってませんか?
— yutakatay(ゆたかてい) (@yutakatay) 2019年12月13日
実は別の方法もあります。それが cgn
使い方は簡単
1 置換したい文字を検索する(/, *)
2 cgn (文字が消えるが慌てない)
3 InsertModeになるので置換後の文字を入力
4 Esc
5 nで次へ
6 . で再度置換
7 あとはn.を繰り返すだけ!#vimtips_ac
16日目set pasteを使うと正しくペーストが可能になる。なので僕みたいなコピペエンジニアは常用したくなるが
— 0Δ@旦那ァ!@貧弱エンジニア (@0Delta) 2019年12月15日
「挿入モードとコマンドラインモードでのマッピングが無効になる」副作用がある。
つまり俺色に染めたキーバインドが全て使えなくなる。
pasteモードは常用してはいけない。#vimtips_ac #Vim
17日目#vimtips_ac
— たいぷらいたー (@no_clock) 2019年12月15日
function(a, b, c) と書いて括弧内で di( とすると括弧内の文字列がまるっと消える。 da( なら括弧も消える。 d を c にすれば挿入モード、 y にすればヤンク。 " とか { とかにも使える。テキストオブジェクト便利。
18日目e $MYVIMRC で vimrc を開いているみなさん。vimrc で $MYVIMRC を resolve しておくと、symlink しててもバッファ名から .git を探すプラグインなどが動いて便利です!#vimtips_ac
— hrsh (@hrsh7th) 2019年12月16日
19日目* でカーソル下の単語をハイライトするのが癖になってる僕みたいな人は、vimrcに↓を書いておくと余計なカーソル移動が無くなって幸せになれるぞ。 #vimtips_ac
— バクダンくん (@Bakudankun) 2019年12月17日
nnoremap <silent><expr> * v:count ? '*'
\ : ':sil exe "keepj norm! *" <Bar> call winrestview(' . string(winsaveview()) . ')<CR>'
20日目inoremap <silent> <ESC> <ESC>:set iminsert=0<CR>
— たまたまご (@tamago324_pad) 2019年12月18日
上記のように設定することで、ノーマールモードを抜けたとき、自動で IME がオフになります。#vimtips_ac
21日目改行消して次の行と連結したいときは <S-j>(J)を使うと便利。Join(連結)の "J"。formatoptions でさらに便利に。
— kg8m / Kagiyama (@Takutakku) 2019年12月19日
:set fo+=j → 不要なコメント開始文字削除
:set fo+=M → マルチバイト文字前後のスペース削除
set fo+=roq2l あたりも便利なので :h fo-table してみてほしい。#vimtips_ac
22日目Vimのdiff機能!vim -d <file1> <file2> でVimを通常どおり起動して、加えて引数で与えたファイル間の違いが表示されます!:diffg でカーソルがある箇所に差分が取り込まれるし、通常のVimとしての機能が使えるので、差分を見ながらファイルを編集するときに使っています! ☺️ #vimtips_ac
— あおい(aoi) (@_a0i) 2019年12月21日
23日目以下の EX コマンドのような検索パターンを必要とする場面で、パターンに何も入力しないで実行すると最後に使った検索パターン (:reg / で表示) が使用されます。
— m_nishi @ 英語勉強1日3時間つらみ (@mnishz0) 2019年12月22日
:substitute (置換)
:global (検索ヒットした各行にコマンド実行)
:vglobal (検索ヒットしなかった各行にコマンド実行)#vimtips_ac
24日目Normal mode で貼り付けは p ですが、 <C-r>" を使うと Insert mode でカーソル位置に貼り付けできます。これを使ってミニバッファ上で同じことができるので便利です。#vimtips_ac
— yhiraki (@coffexpr) 2019年12月22日
25日目#vimtips_ac
— tyru (@_tyru_) 2019年12月23日
開発中に不要なログファイルの内容を全削除して保存したらそれ以降ログが書き込まれなくなったことはないでしょうか?
ログファイルを開いた時だけ backupcopy=yes にすれば、書込速度を損なわず既存ファイルに直接書き込みます。
autocmd BufRead *.log setlocal backupcopy=yes
「xyz(123, "V|im")」というコードで|にカーソルがあったとすると、「di"」で「Vim」、「da"」で周囲のスペースを含んだ「 "Vim"」を切り取れます。ダブルクォートは入れたいけどスペースを含めたくない時は「d2i"」ででき、「"Vim"」と周囲のスペースを含まない形で切り取れます。#vimtips_ac
— rbtnn (@rbtnn) 2019年12月24日
おまけ
行にマークする時に mm って打つと 最速でmが設定される。
— furu8ma (@furu8ma) 2019年12月23日
その後どこいっても'm で戻ってこれる。
そんだけだけど、結構使う。#vimtips_ac
ビジュアルモードで JSON を選択して !jq<CR> とタイプすると選択範囲を整形できます。
— tyru (@_tyru_) 2019年12月24日
引数が複雑な場合は Vim のコマンドを定義しておくと上と同じ様に :SQLFmt<CR> で呼べて便利です。
(リンク先は SQL (sqlformat), HTML (tidy) を整形するコマンドの例)
https://t.co/anU3NqoXkm#vimtips_ac
*1:アンケートを取ったわけではないので私が感じた限りでは