Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

vimを布教するならこんなふうに

$
0
0

advent calendar5日目にして途絶えそうだったので2週目

これは

自分が感じるvimのいいところ/好きなところをまとめて、こんなことができるよと初学者に伝えるためのもの
もちろん他にもあるけれど人に布教するならここかな!という部分を挙げる

TL;DR

コード埋め込みの部分がほぼ本編

こんな部分

前提条件

  • 謝罪
  • 環境
    • VIM - Vi IMproved 8.1 (2018 May 18, compiled Sep 18 2019 03:49:48)
  • 要求
    • タッチタイピング
      • 自分はvimを使いたくて習得した
  • 他のエディタの経験(記事を書いてる人の)
    • Atom
    • Sublime
    • VSCode

書かないこと

  • 入門のような基本操作の列挙
  • vimrcによる設定や拡張
  • 他エディタとの比較
  • 熱意
    • 本当は だってvim使ってるとかっこいいじゃん!!!とか書きたい

参考文献

この記事の執筆はもちろん、その他も含めた知識全般はこちらから

予備知識

説明の都合上、モードの概念が登場するので補足
これは研究室の後輩に向けて作成した過去資料なので資料中の厳密さや、悪ノリにはご容赦いただきたい
mode.png
mode_change.png

本編

いいところ/好きなところ

よく言われていること

キーボードで操作が完結する
カーソル移動はもちろん貼り付けやペーストなどの編集も可能で、OSのショートカットキーよりも楽である

e.g.
- 左h、下j、上k、右l
- Ctrl + CCMD + Cではなくyyyでコピー(ヤンク)

ここはこんな感じで短めに

操作の種類

一見似た操作が多く存在するが、適切な操作を選択できると結果的に同じ操作であっても単純に打鍵数が減る

  • NormalモードからInsertモードに入る操作(思いつくだけ)
    • i: カーソル位置からInsertモードに入る
    • a: カーソル位置の直後からInsertモードに入る
    • s: カーソル位置の文字を削除してInsertモードに入る
    • o: カーソル行の下に新たに行を挿入してその行でInsertモードに入る
    • I: カーソル行の先頭からInsertモードに入る
    • A: カーソル行の末尾からInsertモードに入る
    • S: カーソル行の文字を削除してInsertモードに入る
    • O: カーソル行に新たに行を挿入してその行でInsertモードに入る

A$aOkoがほぼ同じ操作となる。($は行末への移動)
また、リピートなどを考慮するとさらに大きな差となる(後述)

テキストオブジェクト

テキストオブジェクトは基本操作方法の一つです。
https://vim-jp.org/vimdoc-ja/usr_04.html#04.8

定義としては操作のことであるらしいが、テキスト中にて、”ある単位”でオブジェクトを認識してくれる機能だと考えても良いと思う

  • よく使うオブジェクトの単位
    • 単語: スペース区切りでは確実に認識される、日本語は綺麗に書かないと期待する認識はされない
    • タグ: html, xmlでの<tag>
      • vue.jsなどのタグを認識するためには拡張の必要がある可能性がある(拡張なしでは未検証)
    • 記号: ", ', (, [, {, <で囲まれている

これらに対してさらに

  • 操作
    • 削除
    • 編集
    • コピー
  • 範囲(タグor記号)
    • 内側のみ
    • 全体

などを指定して実行できる

e.g.

python
print("hello")# hの上で di" と入力すると
print("")# "の上で da( と入力すると
print
html
<divclass="myclass"><p>hello world</p></div><!-- wの上で dat と入力すると --><divclass="myclass"></div><!--  mの上で da< と入力すると --></div>

tordory(操作)
+
iora(範囲)
+
torwor"or'or(or[or{or<(対象)
といった感じで使うことが多い

単発繰り返し(マイクロマクロ)

1.単発繰り返し single-repeat
最後の変更を繰り返す。変更の回数は[count]で指定した回数で置き換えられる。'cpoptions' に 'y' フラグが含まれてる時には、ヤンクコマンドも繰り返す。コマンドラインコマンドは繰り返さない。
https://vim-jp.org/vimdoc-ja/repeat.html#single-repeat

つまり、.はテキストに対して最後に行った編集を繰り返すコマンドである
どこかでみかけたマイクロマクロという呼び方で呼んでいた
汎用性の高い?抽象的な?操作を心がけていると、このコマンドはより高い利益をもたらしてくれる

python
print("hello")# hの上で di" と入力すると
print("")# "の上で da( と入力すると
print### 1行目の任意の位置で I# <Esc> と入力すると
# print("hello")
# hの上で di" と入力すると
print("")# "の上で da( と入力すると
print### その2行下、4行下の行の任意の位置で . と入力すると
# print("hello")
# hの上で di" と入力すると
# print("")
# "の上で da( と入力すると
# print

このとき、0i# <Esc>を使うと.は最後に行ったi# <Esc>しか記憶しないため期待する動作にはならない(0は行頭への移動)

これは単純な例だが、.の存在を踏まえて編集操作を選択すればより大きな恩恵を享受できる(学びはじめの頃は楽しい)

複雑な繰り返し(マクロ)

3. 複雑な繰り返し complex-repeat
タイプした文字をレジスタ{0-9a-zA-Z"}にレコーディングする(大文字なら追記)。レジスタを実行中は 'q' コマンドは無効化される。マッピングや :normal の中でも機能しない。
https://vim-jp.org/vimdoc-ja/repeat.html#complex-repeat

すなわち、文字のキーに複雑な処理を記憶させることができるということ
自動的に最後の編集を記憶する.とは異なり、記憶させる宣言が必要である

個人的に、丁寧に確認しつつ記憶させないと期待しない編集をすることがあるので、利用するには腰が重い
これも正式名称ではないが、マクロと呼んでいる

html
<divclass="myclass"><p>hello world</p></div><!-- wの上で dat と入力すると --><divclass="myclass"></div><!--  mの上で da< と入力すると --></div>

1行目の任意の位置で qwI<!-- <Esc>A--><Esc>q と入力すると(今回はwに保存)

<!-- <div class="myclass"><p>hello world</p></div> --><!-- wの上で dat と入力すると --><divclass="myclass"></div><!--  mの上で da< と入力すると --></div>その2行下、4行下の任意の位置で @w と入力すると

<!-- <div class="myclass"><p>hello world</p></div> --><!-- wの上で dat と入力すると --><!-- <div class="myclass"></div> --><!--  mの上で da< と入力すると --><!-- </div> -->

コメントアウトの例ばかりだったが、思いつかなかっただけなので実際には適用例は多い(はず)

実践例

プログラムではないが、簡易的な日中の予定兼TODOリストをファイルで管理する例
これはn倍速なのでかなり早くなっているが、操作としても9:00と3くらいしか具体的な入力はしていないでのかなり楽だった
vim_demo.gif
gifじゃない元動画のリンク

  • ちなみにファイルで管理する理由
    • GUIがめんどくさい
      • vimでのコピーペーストはドラッグ&ドロップよりも楽だと感じる
    • 簡易さ

vim以外での"vim"

みんながつかっていることはいいことで、その恩恵としてvim操作を可能にする拡張が他の環境でも大抵存在している(開発してくれている方がいる)

  • chrome
  • jupyter notebook
  • bash/zsh
  • 他エディタ などなど

おわり

なんだかんだ基本操作の列挙してない???


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>