VIM の基本操作

VIM の基本操作 Vim,
Vim 使い方,
Vi vim 違い,
Vim 保存,
Vi z,
vim チートシート,  Vim là một trong những trình biên soạn dòng lệnh mạnh và phổ biến nhất. Nó chỉ sẵn có trên nền của Linux và Unix, những sau đó nó cũng xuất hiện cả trên Windows.


VIMは軽くて早いソースを編集するソフトです.すべて操作がキーボードで入力できるため,マウス無きで,済むというメリットがあります.VIMの基本な使い方を簡単をご紹介します.

1.モードの切り替え
編集モードに切り替える: Esc
挿入モードに切り替える:  i, a
挿入モードに切り替え,かつ改行する : o
visual モード : v , shift+v,ctr+v
2.編集の基本ホットキー
Escを押し,編集モードに入る.
一文字消す : x
1行消す :            dd
複数nの行消す : ndd 例えば 10dd
a行からb行まで消す : a,bd例えば 50から60行まで消したい時 : 50,60d
一行消し,編集モードに入る. :cc ,shift+c
一行のコピー :yy
複数n 行コピー :  nyy 例えば 10yy
a行からb行までコピー : a,by例えば 50から60行までコピーしたい時 : 50,60y
下の方に貼り付け : p(小文字)
上の方に貼り付け :shift+p(大文字)
$ : 行末にいく.
0:行のスタート一に戻る.
w:一単語の頭文字にジャンプ
e :一単語の尾文字にジャンプ
b:一単語の前に戻る.
% :相手の括弧に移す
g : 1行目に戻る.
G : 最後の行にジャンプする.
gj :1行下に移す.
gk: 1行上移す.
n+G(あるいはn+gg) n目の行に移す.
. : コマンドを繰り返す.
>> 右にシフト
<< 左にシフト
n+>> : n行を右にシフト
3.vim の基本文法 
d :delete (消す)
w: word (単語)
y : yank (コピー)
c :change (切り替え)
i : inner(中身)
b :back (戻る)
例えば
d+w現在の単語を消す.
c+w 現在の単語を消し,挿入モードに入る.
d+i+{ : {}の 中の分を消す.
c +i +{ :{}の中の分を消し,かつ挿入モードに入る.
4.vim の設定
まず編集モードに戻る : esc
tabの幅設定:set tabstop=n (tabの幅)
行目を表示 :set number
シフト幅設定 :set shiftwidth=n
5. インストールpluginのインストール仕方
Dowload file.vim (from github or etc).
.vimのファイルをコピーし,~/.vim/pluginのフォルダに貼り付ける.

サーバーサイドのエンジニアの皆さんを始めとして、多くの方に利用されているviエディタ。
しかしながら、iESCと矢印キーしか押さずviを単なるテキストエディタとして利用している方が多いように感じます。

ちがう。viはそんなんじゃない。矢印キーには画鋲でも貼り付けておけ!!

というわけで、viの基本的な操作方法を示します。これでエンジニアの生産性が少しでも上がったら幸いです。以下を読んで、へぇ〜って思ったいただけた方は更にもう一歩すすんで、実際にviを起動して操作してみてください。「知る」だけじゃなく「身に付ける」ことが重要です!

移動操作

viの基本操作としては「移動」と「編集」を理解すると生産性が抜群に上がります。
ここではまず「移動」に関する操作を示します。以下はviのEXモード(ESCを押して編集モードから抜けた状態)で利用する操作になります。

h j k l

矢印キーの代替キーです。

  • h: 左へ移動
  • j: 下へ移動
  • k: 上へ移動
  • l: 右へ移動

キーボードの右手ホームポジションの周辺にありますので、いちいち移動のために矢印キーまで手をずらすことなく操作することができます。

このキーバインドはvi以外でも結構使われていたりします。例えば、Gmailではキーボードショートカットを有効にした場合にスレッド間をj,kで移動することができます。慣れておくと意外な場面で恩恵に預かれるかも。

w b e

単語単位の移動です。
ハイフンやカンマ、句読点などを単語の区切りとみなして移動してくれます。

  • w: 次の単語の先頭へ移動
  • b: 前の単語の先頭へ移動
  • e: 単語のお尻へ移動
 
  #   ↓カーソルがここにあるときに
    self.service_enable?('web_host') || self.service_enable?('web')
  # ↑  ↑ ↑`w`を押したときはここ
  # ↑  `e`を押したときはここ
  # `b`を押したときはここ 

W B E

単語単位の移動です。
小文字の同コマンドと違い、ハイフンやカンマ、句読点などを単語の区切りとみなしてくれません。空白を単語の区切りとみなして移動します。
なので、小文字のコマンドを入力していてちまちまとしか移動できないときなどは、思い切って大文字入力して大胆に移動しましょう。

  • W: 次の単語の先頭へ移動
  • B: 前の単語の先頭へ移動
  • E: 単語のお尻へ移動
 
  #   ↓カーソルがここにあるときに
    self.service_enable?('web_host') || self.service_enable?('web')
  # ↑                              ↑ ↑`W`を押したときはここ
  # ↑`B`を押したときはここ          ↑`E`を押したときはここ

0 $

行の先頭/末尾への移動です。

  • 0: カーソルがある行の先頭へ移動
  • $: カーソルがある行の末尾へ移動

ちなみに、0は数値の始まりを表すから行頭を意味していると思われます。$はなんだろう? 正規表現とかでも行末を表すのに$使いますよね。それと関連付けたら覚えやすいかも。

/文字列 ?文字列 n N

文字列検索です。これも移動の一種です。

/で指定した文字列を検索した場合: カーソルより後ろにある文字列を検索

  • n: カーソルより後の検索該当文字列の先頭へ移動
  • N: カーソルより前の検索該当文字列の先頭へ移動

?で指定した文字列を検索した場合: カーソルより前にある文字列を検索

  • n: カーソルより前の検索該当文字列の先頭へ移動
  • N: カーソルより後の検索該当文字列の先頭へ移動

このキーバインドはlesslvコマンドでも利用可能ですね。

m文字 `文字 '文字

mはマーク機能です。文章中に見えないマークを付けてあとからその位置を呼び出して移動することができます。
mの後ろの文字は大文字小文字アルファベットの52種類を指定することができます。(そんなにいっぱい管理しきれませんが..)

  • `文字は設定したマーク位置まで移動
  • '文字はマークした行の先頭への移動
 
  #             ↓この位置で「ma」を押す
        # Returns the plural form of the word in the string.
        #
        #   "post".pluralize             # => "posts"
        #   "octopus".pluralize          # => "octopi"
        #   "sheep".pluralize            # => "sheep"
        #   "words".pluralize            # => "words"
        #   "the blue mailman".pluralize # => "the blue mailmen"
        #   "CamelOctopus".pluralize     # => "CamelOctopi"
        def pluralize
          Inflector.pluralize(self)
        end
  #      ↑カーソルがこの位置にあるときに 「`a」を押すとさっきのマークした位置までジャンプ!
  #       「'a」を押すとマーク行の先頭までジャンプ!!

(バッククォートとシングルクォートがそれぞれどっちの意味だったかいつも分からなくなります.. どなたか良い覚え方/思い出し方を教えてください。)

数値+移動操作

上記で示した移動操作は数値と組み合わせることで同じ操作を複数回入力したのと同じ効果を得られます。

 
                      # ↓ここにカーソルがあるときに
select device_id from iphone_devices where customer_id=1;
                             # ↑`7l`を押すとここへ移動
 
        # Returns the plural form of the word in the string.
        #
        #   "post".pluralize             # => "posts"
        #   "octopus".pluralize          # => "octopi"
        #   "sheep".pluralize            # => "sheep"
        #   "words".pluralize            # => "words"
        #   "the blue mailman".pluralize # => "the blue mailmen"
        #   "CamelOctopus".pluralize     # => "CamelOctopi"
        def pluralize
          Inflector.pluralize(self)
        end
     #   ↑カーソルがこの位置にあるときに `10k`を押すと「# Returns 〜」の行まで移動

※2つ目の例はいちいち何行分か数えるくらいならマークを使ったほうが楽です。

編集操作

viの基本操作「移動」「編集」の後編、「編集」についてです。

i

Insertのiですね。カーソルがある位置に文字を入力するモードに遷移します。

a A

Appendのaですね。カーソルがある位置の後ろに文字を入力するモードに遷移します。

  • a: カーソルのある位置の1つ後ろから入力するモードに遷移する
  • A: カーソルのある行の末尾から入力するモードに遷移する

o O

行を挿入する操作です。(Open blank lineのoらしいですがピンときませんね)
たまに、iを押して行末まで矢印キーで移動してエンターを入力しているのを見かけますが、oで一発でできちゃいます。

  • o: カーソルのある行の次に行を追加して入力モードに遷移する
  • O: カーソルのある行の前に行を追加して入力モードに遷移する

c cc

Changeのcです。

  • c: 指定された移動分の文字列を削除した後に入力モードに遷移する (詳細は後述)
  • cc: カーソルのある行を丸々削除した後に入力モードに遷移する

r

Replaceのrです。カーソルがある位置の文字を、rに続けて入力した1文字で置き換えます。
この操作は入力モードには遷移せず、EXモードのままとなります。

s

Substituteのsです。カーソルがある位置の文字を削除して入力モードに遷移します。
rは置き換える文字が1文字でしたが、sは任意の文字列で置き換えることができる点と、入力モードに遷移する点が異なります。

3sのように数値と組み合わせると削除する文字数を変更できます。

x

カーソルがある位置の文字を削除します。削除した後は入力モードに遷移せず、EXモードのままとなります。
3xのように数値と組み合わせて任意の文字数を削除することも可能です。

d dd

Deleteのdです。

  • d: 指定された移動分の文字列を削除する (詳細は後述)
  • dd: カーソルのある行を丸々削除する

3ddのように数値と組み合わせて(ry

y yy

Yankのyです。コピペの『コピ』です。

  • y: 指定された移動分の文字列をクリップボードにコピーする (詳細は後述)
  • yy: カーソルのある行を丸々クリップボードにコピーする

3yyの(ry

p P

Pasteのpです。コピペの『ペ』です。
Yankして明示的にクリップボードにコピーしていた文字列は当然対象ですが、Deleteした文字列などもクリップボードに入っており、それらのうちいずれか最新のものをペーストします。

  • p: カーソルのある位置の後にペーストする
  • P: カーソルのある位置の前にペーストする

編集操作 + 移動操作

ここからが真骨頂です。編集操作と移動操作を組み合わせて実行します。

c + 移動操作

Change操作の対象を移動操作で指定します。以下は一例です。

  • cw: カーソルの位置から次の単語の先頭までを削除して入力するモードへ遷移する
  • c3w: カーソルの位置から3つ先の単語の先頭までを削除して入力するモードへ遷移する
  • c$: カーソルの位置から行末までを削除して入力するモードへ遷移する
  • c/文字列: カーソルの位置から、指定した文字列までの間を削除して入力モードへ遷移する

d + 移動操作

Delete操作の対象を移動操作で指定します。以下は一例です。

  • dw: カーソルの位置から次の単語の先頭までを削除する
  • d'文字: カーソルの位置からマークしておいた行までを削除する

例えば、関数定義をまるっと移動させたいときに、「関数が1,2,3,…,10行あるからd10jだね!」なんていうことはせず、mad'aでサクッとやっちゃいましょう。

y + 移動操作

Yank操作の対象を移動操作で指定します。以下は一例です。

  • yw: カーソルの位置から次の単語の先頭までをクリップボードにコピーする
  • y'a: カーソルの位置からマークしておいた行までをクリップボードにコピーする

その他

.

直前の編集操作の繰り返しです。

xrなどのEXモードから直接の編集操作や、iscwなどの入力モードに遷移してからESCでEXモードに戻ってくるまでの編集操作を再現してくれます。

例えば、下記のように「末尾にカンマつけ忘れた!!」といううっかりさんは、

  • A,を入力して末尾にカンマを挿入
  • ESCを押して入力モードを一旦終了
  • あとはj.j.j.j.と入力

とすることで「末尾にカンマを挿入」という編集操作を繰り返し実行することができます。

 
  CSV_COLUMNS = [   # ↓このへんにカーソルがあるときに`A,ESC`で末尾にカンマを挿入
    app.users.tag_import_columns.number
    app.users.tag_import_columns.target_column      # `j.`で下に移動しつつ繰り返し操作
    app.users.tag_import_columns.target_value       # `j.`で下に移動しつつ繰り返し操作
    app.users.tag_import_columns.tag                # `j.`で下に移動しつつ繰り返し操作
    app.users.tag_import_columns.memo               # `j.`で下に移動しつつ繰り返し操作
  ]

「あー、そういえばusersじゃなくてdevicesだった..」といううっかりさんは、

  • /usersを入力して最初のusersを検索
  • cwで単語削除しつつ入力モードに遷移し、devicesと入力して正しい文字列に編集
  • ESCを押して入力モードを一旦終了
  • あとはn.n.n.n.と入力

とすることで「usersをdevicesに変換」という編集操作を繰り返し実行することができます。

 
      # ↓このへんにカーソルがあるときに`/users`で単語検索
  CSV_COLUMNS = [
      # ↓この位置に移動するので`cw`してusersを削除し、devicesに編集
    app.users.tag_import_columns.number,
    app.users.tag_import_columns.target_column,    # `n.`で次のusersを検索しつつ繰り返し操作
    app.users.tag_import_columns.target_value,     # `n.`で次のusersを検索しつつ繰り返し操作
    app.users.tag_import_columns.tag,              # `n.`で次のusersを検索しつつ繰り返し操作
    app.users.tag_import_columns.memo,             # `n.`で次のusersを検索しつつ繰り返し操作
  ]

Có thể bạn quan tâm:

Giới thiệu Blog

Cuộc sống - cho đi là còn mãi- chia sẻ và yêu thương!

Chào các bạn- Mình là Ngô Hải Long - Ceo công ty Giải pháp số LBK- Chuyên seo web, quảng cáo Google , Facebook, Zalo và lập trình web wordpress, App (ứng dụng) IOS, Android. Các blog lập ra với mục đích chia sẻ kiến thức cuộc sống, thủ thuật máy tính, việc làm, tài liệu miễn phí. Trong quá trình đội ngũ biên soạn không tránh khỏi thiếu sót hoặc trùng lặp nội dung với các quý blog khác, thành thật xin lỗi nếu có sự cố đó xảy ra - Vậy bạn Vui lòng liên hệ giúp tới ngolonglbk@gmail.com nếu có bất cứ ý kiến, thắc mắc , yêu cầu xóa bài nào! Trân trọng cám ơn các bạn!

Chào mừng các bạn đến với  ngolongnd.net - Blog thư giãn và chia sẻ kiến thức, tài liệu miễn phí! 

Liên hệ quảng cáo- mua back link tại đây

(function($) { $(document).ready(function() { $('header .ux-search-submit').click(function() { console.log('Moew'); $('header form.search_google').submit(); }); }); })(jQuery);