Mac ターミナルの基本的な使い方・操作方法(2)エディタ

macOS ターミナル上で動作するエディタ nano と vim の基本的な使い方や設定、コマンドなどについての覚書です。

作成日:2019年09月02日

関連ページ

テキストエディタ

macOS には標準でターミナル上で動作する以下のテキストエディタが用意されています。

nano

nano エディタは nano コマンドで起動します。

nano [オプション] [[+LINE,COLUMN] ファイルのパス]

ターミナルで nano の後にスペースを入れ、ファイル名(ファイルのパス)を入力することで、任意のファイルを開くことができます。

以下は新規ファイル nano_sample.txt を引数に指定して nano コマンドを実行した例です。

nano nano_sample.txt    return

以下のようなエディタが起動します。

nano エディタを起動したスクリーンショット

画面下部にはコマンドが表示されます。

例えば、終了(Exit)は ^X コマンド( control + x )を実行します。

ファイル名を指定せずに nano コマンドを実行すると、何も書かれていない空のバッファ(New Buffer)の画面が表示されます。文字を入力後、終了時に名前を付けて保存することができます。

+LINE,COLUMN オプションでカーソルの位置を指定して起動することができます。

以下は既存のファイル を開く際に、カーソルを2行目の3列目に配置する例です。

nano +2,3 sample.txt    return

オプションを指定して nano エディタを起動したスクリーンショット

バージョンは -V または --version で確認できます。

nano -V    return
 GNU nano version 2.0.6 (compiled 19:02:51, Feb 22 2019)
 Email: nano@nano-editor.org	Web: http://www.nano-editor.org/
 Compiled options: --disable-nls --enable-color --enable-extra --enable-multibuffer --enable-nanorc --enable-utf8

-? または -h でヘルプを表示できます。

nano -?    return
Usage: nano [OPTIONS] [[+LINE,COLUMN] FILE]...

Option		GNU long option		Meaning
 -h, -?		--help			Show this message
 +LINE,COLUMN				Start at line LINE, column COLUMN
 -A		--smarthome		Enable smart home key
 -B		--backup		Save backups of existing files
 -C <dir>	--backupdir=<dir>	Directory for saving unique backup files
 -D		--boldtext		Use bold instead of reverse video text
 -E		--tabstospaces		Convert typed tabs to spaces
 -F		--multibuffer		Enable multiple file buffers
 -H		--historylog		Log & read search/replace string history
 -I		--ignorercfiles		Don’t look at nanorc files
 -K		--rebindkeypad		Fix numeric keypad key confusion problem
 -L		--nonewlines		Don’t add newlines to the ends of files
 -N		--noconvert		Don’t convert files from DOS/Mac format
 -O		--morespace		Use one more line for editing
 -Q <str>	--quotestr=<str>	Quoting string
 -R		--restricted		Restricted mode
 -S		--smooth		Smooth scrolling
 -T <#cols>	--tabsize=<#cols>	Set width of a tab to #cols columns
 -U		--quickblank		Do quick statusbar blanking
 -V		--version		Print version information and exit
 -W		--wordbounds		Detect word boundaries more accurately
 -Y <str>	--syntax=<str>		Syntax definition to use for coloring
 -c		--const			Constantly show cursor position
 -d		--rebinddelete		Fix Backspace/Delete confusion problem
 -i		--autoindent		Automatically indent new lines
 -k		--cut			Cut from cursor to end of line
 -l		--nofollow		Don’t follow symbolic links, overwrite
 -m		--mouse			Enable the use of the mouse
 -o <dir>	--operatingdir=<dir>	Set operating directory
 -p		--preserve		Preserve XON (^Q) and XOFF (^S) keys
 -r <#cols>	--fill=<#cols>		Set wrapping point at column #cols
 -s <prog>	--speller=<prog>	Enable alternate speller
 -t		--tempfile		Auto save on exit, don’t prompt
 -v		--view			View mode (read-only)
 -w		--nowrap		Don’t wrap long lines
 -x		--nohelp		Don’t show the two help lines
 -z		--suspend		Enable suspension
 -a, -b, -e,				
 -f, -g, -j				(ignored, for Pico compatibility)

テキストの編集

一般的なエディタと同様、カーソルの位置にタイプした文字が挿入されます。

カーソルの移動には矢印キーが使えます。delete キーでカーソルの前の文字を削除することができます。

nano エディタで編集中のスクリーンショット

コマンド

以下のようなコマンド(キー操作)が使えます。

コマンド キー操作 内容
^ F control + f 次の文字に移動
^ B control + b 前の文字に移動
^ スペース control + スペース 1単語先へ移動
M- スペース esc を押して スペース 1単語前へ移動
^ P control + p 前の行にに移動
^ N control + n 次の行にに移動
^ A control + a 現在行の先頭に移動
^ E control + e 現在行の最後に移動
^ V control + v 次のページに移動
^ Y control + y 前のページに移動
M- \ esc を押して\ ファイルの先頭へ移動
M- / esc を押して/ ファイルの末尾へ移動
^ G control + g ヘルプを表示
^ X control + x 終了
^ O control + o 保存
^ K control + k カーソルのある行をカット
^ U control + u ^ K でカットした行をペースト
^ R control + r カーソル位置に別のファイルを挿入
^ W control + w 検索
^^ control + ^ マーク(選択範囲の指定)

「^ *」は control キーを押しながら * というキー(小文字)を押すという意味(コマンド)です。

「M- *」は esc キーを押してから * というキーを押すという意味(コマンド)です。

編集中にヘルプ画面を表示

編集中にヘルプ画面を表示するには、^G コマンド( control + g )を実行します。

以下はヘルプ画面の例です。キー操作の説明などが記載されています。

nano エディタで編集中に表示するヘルプ画面のスクリーンショット

ヘルプ画面を終了するには ^X コマンド( control + x )を実行します。

終了

nano エディタを終了するには ^X コマンド( control + x )を実行します。

ファイルに変更がなければ、そのまま終了します。

ファイルが変更されていれば、保存するかどうかを確認します。y で保存、n で変更破棄(保存せず終了)、^C( control + c )でキャンセルすることができます。

終了時の画面のスクリーンショット

ファイルの保存

ファイルを保存(Write Out)するには ^Oコマンド( control + o )を実行します。

File Name to Write: に続いてファイルのパスが表示され、カーソルがファイル名の末尾に移動します。

return を押すとファイルは上書き保存されます。

別名で保存するには、ファイル名を変更して return を押します。

また、保存する際に改行コードを変換することができます。

デフォルトは LF ですが、M-D コマンド(esc を押してから d を押す)で Windows の CRLF に、M-M コマンドで古い Mac の CR に変換することができます。

ファイル保存時の画面のスクリーンショット

カットとペースト

^K コマンド( control + k )を実行すると、カーソルのある行をカットします。削除されたテキストはバッファに入れられます。

^U コマンド( control + u )を実行すると、カーソルの位置にカットされた(バッファに入れられた)テキストがペーストされます。

コピーをする場合は ^K コマンド実行後に、その位置で ^U コマンドを実行してカットした行を元に戻し、カーソルをコピーしたい位置に移動して再度 ^U コマンドを実行します。

マーク(範囲を指定)

範囲を指定するにはマーク機能を使います。

範囲の開始位置にカーソルを置き、^^ コマンド( control + ^ )を実行すると、[Mark Set] と表示されます。

^^ コマンド実行時の画面のスクリーンショット

この状態でカーソルを移動すると範囲が選択されます。

選択を解除するには再度 ^^ コマンドを実行すると、[Mark Unset] と表示され選択範囲が解除されます。

^^ コマンド実行時(範囲が選択された状態)の画面のスクリーンショット

選択された範囲を削除(カット)するには、^K コマンド( control + k )を実行します。

^K コマンドで削除(カット)されたテキストはバッファに入っています。

^U コマンド( control + u )を実行すると、カーソルの位置にバッファに入れられたテキストがペーストされます。

コピー

^K コマンドと ^U コマンドを組み合わせて実行してコピーすることができますが、Mac OS のコピーとペーストの機能が使えます。

エディタ上でマウスでドラッグして範囲を選択して command + c でコピーして、カーソル位置で command + v でペーストすることができます。

他のアプリケーションからのテキストのコピー&ペーストも可能です。


vim

vim(vi iMproved)は vi エディタの機能拡張版のエディタです。

前述の nano エディタや一般的な GUI のエディタとは異なり、vim にはノーマルモード(コマンドモード)やコマンドラインモード、インサートモード、ビジュアルモードなどのモードがあります。

intro - Vim日本語ドキュメント/モードの紹介

以下は代表的なモードの概要です。

ノーマルモード(コマンドモード)

文字入力以外の編集作業(文字の削除や置換など)を行うモードです。

vim を起動した直後はノーマルモードになっています。コマンドモードとも呼ばれます。

タイプしたキーがエディタに対するコマンドになります。

文字列の検索やファイルの保存、vim の終了などもノーマルモード(コマンドモード)で行います。

コマンドラインモード

ウィンドウの下部のステータスラインに1行のコマンドを入力するモードです。

ファイルの保存や文字列の検索、vim の終了などはコマンドラインモードで行います。

: で始まる Ex コマンドや / または ? で始まるパターン検索コマンドなどで使用します。

※ Ex コマンドやパターン検索コマンドは、実行した履歴が保存されるので、後から上下の矢印キーを使って呼び出すことができます。

例えば、Ex コマンドの場合なら、: をタイプした後に上下の矢印キーを使って過去に実行したコマンドを呼び出すことができます。: の後に目的のコマンドの先頭の文字を入力すれば、コマンドを絞り込むことができます。

インサートモード

文字の入力を行うモードです。

インサート(Insert )は挿入を意味するので挿入モードとも呼ばれます。

ノーマルモードからインサートモードに入るには、i コマンドを実行します(i を押します)。

キーをタイプすると、その文字がカーソルの位置に入力されます。

インサートモードを終了し、ノーマルモードへ移行するには esc を押します。

チュートリアル

vim にはチュートリアル(教本)が用意されています。

ターミナルで vimtutor と入力して return を押します。

vimtutor  return 

「Press ENTER or type command to continue」と表示されるので、return を押すと以下のようなチュートリアルが表示されます。

VIM 教 本 (チュートリアル)の画面のスクリーンショット

チュートリアルを閉じる(終了する)には、esc を押して :q または :q! と入力後、return を押します。

vim 日本語ドキュメント

以下のサイトに vim の日本語ドキュメント(マニュアルとリファレンス)が掲載れています。

使い方(ヘルプファイルの内容)などが日本語で説明されています。

Vim日本語ドキュメント:https://vim-jp.org/vimdoc-ja/

ヘルプの表示

ターミナルで vim と入力して return を押すと、vim が起動して以下のような画面が表示されます。

vim 起動時のスクリーンショット

:help と入力すると、入力された「:help」が画面左下に表示されるので、return を押すと以下のようなヘルプ画面が表示されます。

ヘルプ画面を閉じる(終了する)には、 :q と入力後、return を押します。

矢印キーを使ったり、h(左)、j(下)、k(上)、l(右)のキーを使ってカーソルを移動できます。また、マウスでスクロールすることもできます。

vim ヘルプ画面のスクリーンショット

ヘルプ画面にはマニュアルへのリンクが青緑色の文字で記載されています。

リンクを開くには、カーソルを移動してリンク文字で control + ] を押します。

リンクをダブルクリックして開けるようにするには、:set mouse=a と入力して return を押します。

vim ヘルプ画面のリンクのスクリーンショット

ヘルプファイルでは検索も可能で、例えば「copy について検索」するには「 :help copy 」と入力後、return を押します。

Vim日本語ドキュメント/ヘルプの引き方

リンク先や検索先から元へ戻るには control + t または control + o を押します。

以下のサイトにはヘルプファイルやリンク先のマニュアルなどの日本語訳が掲載されています。

help - Vim日本語ドキュメント

バージョン情報など --version

ターミナルで以下のように vim コマンドに --version を引数に指定して実行すると vim のバージョンなどの情報が表示されます。

vim --version    return
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Jun 19 2019 19:08:44)
Included patches: 1-503, 505-680, 682-1283, 1365
Compiled by root@apple.com
Normal version without GUI.  Features included (+) or not (-):
+acl             +file_in_path    -mouse_sgr       +tag_old_static
-arabic          +find_in_path    -mouse_sysmouse  -tag_any_white
+autocmd         +float           -mouse_urxvt     -tcl
-balloon_eval    +folding         +mouse_xterm     -termguicolors
-browse          -footer          +multi_byte      -terminal
+builtin_terms   +fork()          +multi_lang      +terminfo
+byte_offset     -gettext         -mzscheme        +termresponse
+channel         -hangul_input    +netbeans_intg   +textobjects
+cindent         +iconv           +num64           +timers
-clientserver    +insert_expand   +packages        +title
-clipboard       +job             +path_extra      -toolbar
+cmdline_compl   +jumplist        -perl            +user_commands
+cmdline_hist    -keymap          +persistent_undo +vertsplit
+cmdline_info    +lambda          +postscript      +virtualedit
+comments        -langmap         +printer         +visual
-conceal         +libcall         -profile         +visualextra
+cryptv          +linebreak       +python/dyn      +viminfo
+cscope          +lispindent      -python3         +vreplace
+cursorbind      +listcmds        +quickfix        +wildignore
+cursorshape     +localmap        +reltime         +wildmenu
+dialog_con      -lua             -rightleft       +windows
+diff            +menu            +ruby/dyn        +writebackup
+digraphs        +mksession       +scrollbind      -X11
-dnd             +modify_fname    +signs           -xfontset
-ebcdic          +mouse           +smartindent     -xim
-emacs_tags      -mouseshape      +startuptime     -xpm
+eval            -mouse_dec       +statusline      -xsmp
+ex_extra        -mouse_gpm       -sun_workshop    -xterm_clipboard
+extra_search    -mouse_jsbterm   +syntax          -xterm_save
-farsi           -mouse_netterm   +tag_binary      
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"  //ユーザの vimrc ファイルの場所
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H   -DMACOS_X_UNIX  -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1      
Linking: gcc   -L/usr/local/lib -o vim        -lm -lncurses  -liconv -framework Cocoa           

バージョン情報の他に、初期化の際に読み込まれる vimrc ファイルの保存先なども記載されています。

記載されている $VIM や $HOME、$VIMRUNTIME などの値は vim 上で確認することができます。

$VIM を確認するには、:echo $VIM と入力後、return を押します。

vim ヘルプ画面のリンクのスクリーンショット

以下は :echo の実行結果の例です。

コマンド 結果
:echo $VIM /usr/share/vim
:echo $HOME /Users/foo (ユーザ foo の場合)
:echo $VIMRUNTIME /usr/share/vim/vim80

vimrc ファイル

好みのオプションなどを vimrc というスタートアップファイルに記述しておくと、vim が起動するとき(初期化の際)に記述されたコマンドが実行されます。

Mac の場合、初期状態ではこのファイルは作成されていないので、ユーザのディレクトリ(~/)に .vimrc というファイル名で作成します。

vim を使ってユーザのディレクトリに .vimrc というファイルを作成するには、ターミナルで以下を実行します。

vim ~/.vimrc    return

.vimrc というファイルが作成されるので設定を記述して保存します(既に .vimrc が存在する場合はそのファイルが開きます)。

以下は .vimrc の設定(コマンド)の記述例です。コメントはダブルクォートを使います。

.vimrc
set tabstop=4  "タブ幅(インデント)をスペース4つ分にする "
set number  "行番号を表示する"
set mouse=a  "全てのモードでマウスの使用を可能にする"
syntax on  "シンタックスハイライト(色付)する

vimrc ファイルの見本(vimrc_example.vim)は /usr/share/vim/vim80/ にあります。

cat /usr/share/vim/vim80/vimrc_example.vim     return
" An example for a vimrc file. "
" "
" Maintainer:	Bram Moolenaar <Bram@vim.org>  "
" Last change:	2017 Sep 20 "
" "
" To use it, copy it to "
"     for Unix and OS/2:  ~/.vimrc "
"	      for Amiga:  s:.vimrc "
"  for MS-DOS and Win32:  $VIM\_vimrc "
"	    for OpenVMS:  sys$login:.vimrc "

" When started as "evim", evim.vim will already have done these settings. "
if v:progname =~? "evim"
  finish
endif

" Get the defaults that most users want. "
source $VIMRUNTIME/defaults.vim  //デフォルトの読み込み

if has("vms")
  set nobackup		" do not keep a backup file, use versions instead "
else
  set backup		" keep a backup file (restore to previous version) "
  if has('persistent_undo')
    set undofile	" keep an undo file (undo changes after closing) "
  endif
endif

if &t_Co > 2 || has("gui_running")
  " Switch on highlighting the last used search pattern. "
  set hlsearch
endif

" Only do this part when compiled with support for autocommands. "
if has("autocmd")

  " Put these in an autocmd group, so that we can delete them easily. "
  augroup vimrcEx
  au!

  " For all text files set 'textwidth' to 78 characters. "
  autocmd FileType text setlocal textwidth=78

  augroup END

else

  set autoindent		" always set autoindenting on "

endif " has("autocmd") "

" Add optional packages.
"
" The matchit plugin makes the % command work better, but it is not backwards "
" compatible. "
" The ! means the package won't be loaded right away but when plugins are "
" loaded during initialization. "
if has('syntax') && has('eval')
  packadd! matchit
endif

参考サイト:Vim日本語ドキュメント

基本的な使い方

起動と終了

起動

vim エディタはターミナルから vim コマンドで起動します。

vim ファイル名

一般的な書式としては以下のようになります。

vim [オプション] [ファイル名]

Vim日本語ドキュメント/ Vimの起動引数

macOS の場合、vi コマンドでも vim エディタが起動します(シンボリックリンクが張られているため)。

ls -l /usr/bin/vi    return
lrwxr-xr-x  1 root  wheel  3  5  4 18:12 /usr/bin/vi -> vim

通常は、編集するファイル名や新規作成するファイル名を引数に指定して vim コマンドを実行します。

以下はカレントディレクトリに my_sample.txt というファイルを新規作成する例です。

vim my_sample.txt    return

引数に指定したファイルが存在しない場合は新規にファイルが作成され、既に存在する場合は指定したファイルが開きます。

vim を起動した直後はノーマルモードになっています。

以下は上記コマンドを実行して新規ファイルを開いた起動画面の例です。

各行の左側のチルダ(~)は、何も入力されていない状態を示します。

vim エディタで新規にファイルを作成した際のスクリーンショット

終了

vim の終了はノーマルモードで行います。

ノーマルモードでコロン(:)をタイプすると、画面左下のステータスラインに : が表示されてカーソルが移動しコマンドを入力する状態(コマンドラインモード)になります。

終了のコマンドは q なので、: に続けて q をタイプして return を押すと終了します。

終了コマンドを入力した際のスクリーンショット

ファイルへの変更を破棄して強制的に終了するには :q! とタイプして return を押して終了します。

終了
コマンド 説明
:q 終了
:q! 変更を破棄して強制的に終了
:wq 変更を保存して終了
:e! 変更を破棄してファイルを再読み込み(終了しない)

ノーマルモードへ戻る

vim を起動した直後はノーマルモードになっていますが、知らないうちに(何らかのキーを押してしまう等)他のモードになっている場合があります。

どのモードにいる場合でも esc を押せばノーマルモードに戻ることがます。

場合によっては esc を二回押さなければならないときもあります。

ノーマルモードで esc を押すとビープ音が鳴るので、既にノーマルモードにいることがわかります。

カーソルの移動(モーション)

ノーマルモードでのカーソルの移動は矢印キーでも行えますが、以下が基本のカーソルの移動のコマンドです。キーの配置が右手のホームポジションに近いので、慣れると便利です。

ノーマルモードでのカーソルの移動(上下左右)
コマンド 説明
h 一文字分左に移動(矢印キー ◀ と同じ)
j 一文字分下に移動(矢印キー ▼ と同じ)
k 一文字分上に移動(矢印キー ▲ と同じ)
l 一文字分右に移動(矢印キー ▶ と同じ)

カウンタ

カーソルの移動のコマンドには、カウンタ(繰り返し回数)を指定することができます。

例えば、3文字左に移動するには 3h、4行下に移動するには 4j とタイプすることができます。

また、3w とすれば3単語分移動します。

その他の移動

カーソルの上下左右への移動以外にもコマンドを使って、単語ごとに移動したり、行頭や行末、指定した行、指定した文字などへ移動することができます。

ノーマルモードでのカーソル移動(2)
コマンド 説明
w 次の単語(word)の先頭に移動
W 次の単語(空白を区切りとした単語 WORD)の先頭に移動
e 単語の最後の文字へ移動
E (空白を区切りとした)単語の最後の文字へ移動
ge 直前の単語の最後の文字へ移動
gE 直前の(空白を区切りとした)単語の最後の文字へ移動
b 直前の単語の最初の文字へ移動
B 直前の(空白を区切りとした)単語の最初の文字へ移動
0(ゼロ) 行頭に移動
^ 行頭に移動
$ 行末に移動
f文字 現在行のカーソルの位置より後ろにある指定した文字に移動。; を押すと次の文字へ移動。
F文字 現在行のカーソルの位置より前にある指定した文字に移動。; を押すと次の文字へ移動。
gg 先頭行の行頭に移動
G 最後の行の行頭に移動
行番号G 行番号で指定した行の先頭へ移動
+ 一行下の先頭の文字へ移動
- 一行上の先頭の文字へ移動
H 画面上に見えている行の先頭(Home)に移動
M 画面上に見えている行の真ん中(Middle)に移動
L 画面上に見えている行の最後(Last)に移動
% 対応する括弧 ")", "]", "}" に移動

現在の場所を表示 CTRL-G

CTRL-G コマンド( control + g )を実行すると、画面下に編集中のファイル名、カーソルのある行番号、全体の行数、ファイル全体を通してのパーセント、カーソル桁位置が表示されます。

"/private/var/../T/tutoruvvWYd" [Modified] line 433 of 975 --44%-- col 1

行番号を表示

行番号を表示するには、number オプションを設定します。ノーマルモードで :set number とタイプして return を押します。

このオプションを毎回設定したい場合は、スタートアップファイル(vimrc)にこのコマンド(set number)を記述しておくことができます。

オプションをオフに戻す(行番号を非表示にする)には :set nonumber とタイプして return を押します。

スクロール

画面をスクロールするには以下のコマンドが使えます。

ノーマルモードでのスクロール
コマンド 説明
CTRL-D ( control + d ) 画面を半分だけ下(Down)にスクロール
CTRL-U ( control + u ) 画面を半分だけ上(Up)にスクロール
CTRL-F ( control + f ) 1 画面分スクロール(Forward)
CTRL-B ( control + b ) 1 画面分逆方向にスクロール(Backward)
文字の削除

ノーマルモードで x コマンドなどを使って文字を削除することができます。

削除された文字や文字列はバッファに保存されます。関連項目:テキストの移動

以下は文字を削除するためのコマンドの例です。

ノーマルモードでの文字の削除
コマンド 説明
x カーソル位置の文字を削除
X カーソル位置の前の文字を削除
dh カーソルの左の文字を削除
dl カーソル位置の文字を削除
dw 単語の末尾までを削除
dd カーソル位置の行を削除
dj カーソル位置の行とその下の行を削除
dk カーソル位置の行とその上の行を削除
df文字 カーソルの位置から「文字」までを削除
D カーソル位置から行末までを削除(d$ と同じ)
J 改行文字を削除

関連:オペレータとモーション

取り消しとやり直し

間違ってテキストを削除してしまった場合など、u コマンドで直前の編集を取り消す(undo)ことができます。

また、余計に取り消し(undo)をしてしまった場合は、CTRL-R (redo) を押すことで、直前の u コマンドを取り消すことができます。つまり、やり直し → undo(取り消し)を undo(取り消し) します。

取り消し(undo)とやり直し(redo)
コマンド 説明
u 直前のコマンドを取り消す(undo)
U 行全体へのコマンドの取消し(行を元の状態に戻す)
CTRL-R( control + r ) 直前の u コマンドを取り消す(redo) → やり直す
文字の挿入(インサートモード)

文字を挿入するには、インサートモード(挿入モード)を使います。

vim を起動した直後はノーマルモードになっているので、i コマンドなどを使ってインサートモードへ移行する必要があります。

ノーマルモードで i とタイプすると i コマンドが実行されてインサートモードに入り、以下のように画面下に「-- INSERT --」と表示されます。

インサートモードのスクリーンショット

インサートモードでは、キーをタイプするとその文字がカーソルの位置に入力されます。

return で改行し、delete で入力した文字を削除することができます。

また、矢印キーでカーソルを移動して、delete でカーソルの前の文字を削除することもできます。

ノーマルモードに戻る

ノーマルモードに戻るには esc を押します。

取り消しや削除、ファイルの保存、終了などはノーマルモードに戻ってコマンドを実行します。

インサートモードへ移行するコマンド

以下はインサートモードへ移行するコマンドです。

どの位置に文字を入力するかにより、コマンドを使い分けることができます。

インサートモードへ移行するコマンド
コマンド 説明
i カーソルの位置に文字を入力
I 現在行の先頭に文字を入力(大文字の i)
a カーソルの右側に文字を入力
A 現在行の末尾に文字を入力
o 現在行の後に新たな行を挿入して文字を入力
O 現在行の前に新たな行を挿入して文字を入力
ファイルの保存

ノーマルモード以外の場合は、esc を押してノーマルモードにします。

ファイルの変更を保存(現在のバッファの内容を元のファイルに保存)するには、ex コマンドの :w (コマンド)を実行します。

ノーマルモードで : とタイプするとカーソルが画面下のコマンドラインに移動するので w をタイプして return を押します。

画面左下のステータスラインに保存の内容が表示されます。

ファイル保存時のスクリーンショット

ファイルを別名で保存するには、 :w ファイル名(パス) とタイプして return を押します。

別名でファイル保存する際のスクリーンショット

ファイルの変更を保存して vim を終了するには、 :wq とタイプして return を押します。

ファイルを保存するコマンド
コマンド 説明
:w バッファ(変更内容)をファイルに保存
:w ファイル名 指定したファイルにバッファ(変更内容)を保存(別名で保存)
:wq バッファ(変更内容)をファイルに保存して vim を終了
ZZ 変更を保存して vim を終了(:wq とほぼ同じ?)
検索

ノーマルモードでスラッシュ / をタイプすると、画面左下のステータスラインに / が表示されてカーソルが移動し検索文字を入力する状態になります。

文字列を検索するには / をタイプし、続けて検索する文字列を入力して return を押します。

逆方向に検索するには / の代わりに ? とタイプします。

検索の際のスクリーンショット

※ 特殊文字の .*[ ]^%/\?~$ を検索する場合はその文字の直前にバックスラッシュ \ を置く必要があります。

同じ文字列を続けて探す場合は n を押します。N を押すと反対方向に検索を繰り返します。

n または N コマンドにはカウンタを指定することができます。

例えば、/sample で検索して、3n とタイプすると3つ目の sample を探します。

/ にはカウンタを指定できません。

元の場所に戻るには、control + o を押します。更に戻るにはこれを繰り返します。

control + i を押すと、逆方向に移動します。

大文字・小文字を無視

デフォルトでは検索の際、大文字・小文字は区別されます。大文字と小文字を区別しないで検索するには、ignorecase オプションを設定します。

ノーマルモードで :set ignorecase とタイプして return を押すと、検索の際に大文字・小文字を無視します。

このオプションを毎回設定したい場合は、スタートアップファイル(vimrc)にこのコマンド(set ignorecase)を記述しておくことができます。

オプションをオフに戻す(大文字・小文字を区別する)には :set noignorecase とタイプして return を押します。

検索履歴

検索履歴は保存されるので、/ をタイプした後に上矢印(↑)または下矢印(↓)キーで検索の履歴を呼び出して、再度利用することができます。

また、/ をタイプした後に文字をタイプして矢印キーを使うことで検索文字を絞り込むことができます。

単語全体を一致させる

"xxxx" で始まる単語だけを探す場合は、/\<xxxx のように 検索文字の前に \< を付けて検索します。

"xxxx" で終わる単語だけを探す場合は、/xxxx\>のように 検索文字の後に \> を付けて検索します。

"xxxx" という単語だけを探す場合は、/\<xxxx\> のように指定します。

例えば、"the" という単語だけを探す場合は、/\<the\> のように指定すれば、"they" とか "soothe" にはヒットしません。

文章中の単語の検索

文章中の単語の次(または前)に現れる場所を探したい場合は * または # コマンドを使えます。

探したい単語の上にカーソルを置いて * をタイプすると、カーソル位置の単語が検索文字列として使われ、その単語が次に現れる位置にカーソルが移動します。# をタイプすると逆方向に検索します。

* と # コマンドにもカウンタを指定することができ、例えば 3* はカーソル位置の単語が3回目に現われる場所を探します。

また、* 及び # コマンドは完全に一致する単語だけを探します。

単語の一部として検索する場合は g* または g# コマンドを使います。

検索結果のハイライト表示

検索結果をハイライト表示するには、hlsearch オプションを設定します。

ノーマルモードで :set hlsearch とタイプして return を押すと検索にヒットした全ての部分がハイライト表示されます。

このオプションを毎回設定したい場合は、スタートアップファイル(vimrc)にこのコマンド(set hlsearch)を記述しておくことができます。

オプションをオフに戻すには :set nohlsearch とタイプして return を押します。

※単にハイライト表示を止めるだけなら :nohlsearch とタイプして return を押します。この場合、次に検索コマ ンドを実行すると、再びハイライト表示されます。

インクリメンタルサーチ

インクリメンタルサーチのオプションを設定すると、検索したい文字を入力している間にヒットする文字列を探して画面に表示してくれます。

ハイライト表示と併用すると便利です。

インクリメンタルサーチのオプションを設定するには、ノーマルモードで :set incsearch とタイプして return を押します。

このオプションを毎回設定したい場合は、スタートアップファイル(vimrc)にこのコマンド(set incsearch)を記述しておくことができます。

オプションをオフに戻すには :set noincsearch とタイプして return を押します。

検索を循環させない

デフォルトでは wrapscan オプションはオンになっていて、ファイルの末尾まで進んだら先頭に戻って検索を続けます。

ファイルの末尾まで進んだら(後方検索の場合はファイルの先頭まで戻ったら)検索を停止するには、このオプションをオフにします。

ノーマルモードで :set nowrapscan とタイプして return を押すとこのオプションをオフにします。

このオプションを毎回設定したい場合は、スタートアップファイル(vimrc)にこのコマンド(set nowrapscan)を記述しておくことができます。

オプションをオンに戻すには :set wrapscan とタイプして return を押します。

正規表現

vim では検索パターンに正規表現が使えます。

正規表現で ^ は行頭を、$ は行末を意味します。

^this というパターンは行頭にある this にだけマッチし、it$ というパターンは行末にある it にだけマッチします。

また、ドット(.)はあらゆる文字にマッチします。

例えば、t..t は最初が t で始まり、2文字目と3文字目は何でも良くて、4文字目が t であるパターン、例えば text や test などにマッチします。

"/\d\{4,7} " とタイプすれば、4〜7桁の数値にマッチします。

使用できる正規表現や記述方法などについては「Vim日本語ドキュメント/検索コマンドと正規表現」に解説があります。

*vim の正規表現は一般的(?)な正規表現と比べると、様々なメタ文字をエスケープしなければなりませんが、正規表現の前に \v を付けることで標準に近い正規表現が使えます。

例えば、前述の4〜7桁の数値にマッチさせるには "/\v\d{4,7} " のように記述できます。

詳細は :help magic で確認することができます。

置換

ノーマルモードでカーソルの下の1文字を置き換えるには r をタイプして、置き換える文字をタイプます。

半角英数字の場合はうまくいきますが、日本語で変換する場合はうまくいかないようです。

その場合は、cl コマンド(カーソルの位置の文字1文字を変更)を使うと良いかもしれません。但し、c コマンドを使うとインサートモードになります。

置換モード

ノーマルモードで R とタイプすると置換モードに入り、ステータスラインに「-- REPLACE --」と表示されます。

置換モードのスクリーンショット

このモードでは文字を入力するとカーソル下の文字を置き換えます。このモードは esc を押すまで続きます。

delete で修正をしようとすると、元の文字が復元され、直前に打った文字を undo するような働きをします。

検索&置換

置換はノーマルモードで : をタイプしてコマンドモードに移行し、s/置換対象文字列/置換後文字列/ とタイプして return を押します。

以下が基本的な形式です。

:s/置換対象文字列/置換後文字列/

カーソルのある行の最初に見つかった old という文字列を new という文字列に置換するには以下をタイプして return を押します。

:s/old/new/

その行で見つかった全ての old という文字列を new という文字列に置換するには以下のように g を追加します。

:s/old/new/g

複数行から

複数行から見つかる文字を変更するには、 : の後に行の範囲をカンマで区切って指定します。

以下は現在開いているファイルの5行目から10行目で見つかった全ての old という文字列を new という文字列に置換する例です。

g を付けない場合は、行の中の最初に見つかったものだけが置換されます。

:5,10s/old/new/g

確認しながら変更

1つ1つ確認しながら変更するには c を付けます。

「replace with new (y/n/a/q/l/^E/^Y) 」と確認されるので、変更するには y を、変更しない場合は n をタイプします。a をタイプすると全て変更され、q をタイプすると変更せずに終了します。

:5,10s/old/new/gc

ファイル全体を対象

ファイル全体で見つかるものに対して変更するには、 : の後に % を指定します。

:%s/old/new/g

:%s/old/new/gc (確認をする場合)

事前検索で置換対象文字列を省略(検索&置換)

vim では置換する際に置換対象文字列を省略すると、最後に検索した置換対象文字列が使われます。

そのため、置換をする前に / や * などを使って置換したい文字列の検索を実行しておけば、以下のように置換対象文字列を省略して置換が行なえます。

:%s//置換後文字列/g (ファイル全体を対象にする場合)

正規表現

検索パターンには正規表現が使えます。

正規表現の先頭に \v を付けると標準に近い正規表現パターンが使えます。

例えば、括弧で括った文字列は置換の際に \1 などで参照できますが、vim の場合括弧はエスケープする必要があります。

そのため、例えば 123 を 123x に置換するには括弧をエスケープしますが、\v を付けると括弧をエスケープしなくて済みます。(この例ではあまり違いはありませんが。。。)

:%s/\(123\)/\1x/ 
  
//\v を付けると括弧のエスケープは不要になる
:%s/\v(123)/\1x/

区切り文字の変更

区切り文字の / を変更することができます。/ を含むパスなどを置換対象に指定する場合にエスケープする必要がなくなるので便利です。

以下は区切り文字を # に変更して /Users/foo を /Users/bar に置換する例です。

:%s#/Users/foo#/Users/bar#g
  
//または以下でも同じ
:%s#\v(/Users/)foo#\1bar#g
オペレータとモーション

多くのコマンドはオペレータとモーションで構成されています。

例えば、dw は「単語の末尾までを削除」するコマンドですが、これは削除コマンド(d)のオペレータ d とモーション(移動)の w を続けることで、現在の場所から、モーションコマンドで移動した場所(単語の末尾)までを削除します。

オペレータ モーション

$ コマンドは行末まで移動するので、d$ コマンドならカーソル位置から行末までが削除されます。

f文字 は現在行のカーソルの位置より後ろにある指定した文字に移動します。

dfx とすると、カーソルの位置から現在行の後ろにある「x」までを削除します。

また、モーションにはカウンタ(繰り返し回数)を指定することができます。

オペレータ [数値] モーション

3w コマンドはカーソルを単語3個分移動します。

このため、d3w は3個の単語を削除するコマンドになります。

オペレータとモーションを組み合わせる際は、最初にオペレータコマンドを入力し、次にモーションコマンドを入力します。

d2k は、カーソル位置の行とその上2行(計3行)が削除されます。

d3w と 3dw

d3w も 3dw も単語を3個削除するコマンドで同等です。

  • d3w:3つの単語の削除を 1 度だけ実行 → 単語を3個削除
  • 3dw:1つの単語の削除を 3 回実行 → 単語を3個削除

例えば、3d2w(2つの単語の削除を3回実行 → 6つの単語を削除)と指定することもできます。

変更

変更コマンドは、削除コマンドと同じように以下のような形式で指定できます。

c [数値] モーション

但し、削除コマンドとは異なり、実行するとインサートモードに入ります。そのため、続けて文字の挿入も行うことができます。

単語の一部、もしくは全体を変更するには、変更する位置にカーソルを移動して cw とタイプします。続いて変更する文字をタイプします。

インサートモードになっているので、必要に応じて esc を押してノーマルモードに戻ります。

例えば、2つの単語を変更するには、c2w とタイプします。

c は「変更」オペレータで、2w は「2単語移動」を意味し、2単語が削除され、挿入モードに入ります。そして文字をタイプすると結果として変更されます。

以下は変更のコマンドの例です。

コマンド 説明
cc カーソル位置の行を変更
c$ カーソル位置から行末までを変更
c^ カーソル位置から行頭までを変更
C カーソル位置から行末までを変更(c$)
s カーソル位置の1文字変更(cl)
S カーソル位置の行を変更(cc)
変更の繰り返し

.(ドット)コマンドを使うと、直前の変更コマンドを繰り返すことができます。

但し、u コマンド(undo)、CTRL-R (redo)、先頭が : のコマンドは繰り返せません。

文中に何度も出てくる単語 xxxx を yyyy に変更するには以下のようにします。

  • /xxxx とタイプし、return を押して文字列「xxxx」を検索
  • cwyyyy とタイプして cw で「xxxx」を「yyyy」に変更し、esc でノーマルモードに戻る
  • n とタイプして次の 「xxxx」を探す
  • . とタイプして直前の「yyyy」への変更を繰り返す
  • n とタイプして次の 「xxxx」を探す
  • . とタイプして直前の「yyyy」への変更を繰り返す
  • 以下繰り返し
テキストの移動

d コマンドや x コマンドなどで削除すると、そのテキストはバッファに保存されます。

p コマンドを使うと、そのテキストをペースト(vim ではプットと言う)することができます。

また、P コマンドは p と同じくペースト(プット)しますが、カーソルの前にプットします。

プットは何回でも繰り返すことができ、カウンタを使って 4p のように繰り返しを指定可能です。

2文字の入れ換え

打ち間違いをして2文字を入れ替えることがありますが、そのような場合は入れ替える最初の文字にカーソルを置き、xp とタイプします。

例えば、teh を the に修正するには、e にカーソルを置き、xp とタイプします。

x コマンドで e の文字を削除してバッファに入れ、p コマンドでカーソルの後にバッファの内容(e の文字)をプットします。

テキストのコピー(ヤンク)

y オペレータで文字列をバッファにコピーすることができます。

バッファにコピーした文字列は p コマンドでプット(ペースト)できます。

copy の c は既に変更コマンドのオペレータで使用されているため yank(ヤンク)の y がコピーのコマンドに使われています。

y オペレータも d や c オペレータ同様、以下のような形式で指定できます。

y [数値] モーション

例えば、1つの単語をコピーするには yw、2つの単語をコピー(ヤンク)するには y2w とします。

以下はコピーのコマンドの例です。

コマンド 説明
yw 単語の末尾までをコピー
yy カーソル位置の行をコピー
Y カーソル位置の行をコピー(yy)
y$ カーソル位置から行末までをコピー
y^ カーソル位置から行頭までをコピー
ビジュアルモード

ビジュアルモードを使うと範囲の選択が簡単に行なえ、選択された範囲がハイライトされます。

ビジュアルモードに移行するには、以下のようなコマンドがあります。

ビジュアルモードに移行するコマンド
コマンド 説明
v 文字単位の選択が可能なビジュアルモード
V 行字単位の選択が可能なビジュアルラインモード
control + v ブロック(矩形の範囲)の選択が可能なビジュアルブロックモード

文字単位の選択

選択を開始する文字にカーソルを移動して、v を押すと文字単位の選択が可能なビジュアルモードに移行します。

ビジュアルモードに移行すると左下のステータスラインに「-- VISUAL --」と表示されます。

カーソルを移動コマンドや矢印キーで移動させると、その範囲が選択されてハイライト表示されます。

選択された範囲に対して、削除やコピー、変換などのコマンドを実行することができます。コマンド実行後はノーマルモードに移行します。

選択範囲(始点)を変更する場合は、esc を押すとビジュアルモードが終了します。

以下は apple の a にカーソルを置いて v コマンドを実行してビジュアルモードに移行し、移動コマンド 2e(2つの単語の最後の文字へ移動)を実行した状態の例です。

文字単位のビジュアルモードのスクリーンショット

ビジュアルモードのコマンド

ビジュアルモードで使うコマンドの中にはノーマルモードで使う場合と異なる動作になるものがあります。

以下はノーマルモードで使う場合と異なる動作になるビジュアルモードのコマンドの例です。

ノーマルモードと動作の異なるコマンド(一部)
コマンド 説明
o ビジュアルブロックモードで選択範囲の反対側(始点)にカーソルを移動
O ビジュアルブロックモードで同じ行の反対側にカーソルを移動
u 選択範囲を全て小文字に変換
U 選択範囲を全て大文字に変換

行単位の選択

選択を開始する行にカーソルを移動して、V を押すと行単位の選択が可能なビジュアルラインモードに移行し、行全体が選択されます。

ビジュアルラインモードに移行するとステータスラインに「-- VISUAL LINE --」と表示されます。

左右に移動しても選択範囲は変更されません。

上下に移動すると、選択範囲が行単位で拡張されます。

行単位のビジュアルラインモードのスクリーンショット

ブロック(矩形の範囲)の選択

ブロック(矩形の範囲)を選択する場合は、control + v を押してビジュアルブロックモードに移行します。このモードは表を編集するような場合に便利です。

ビジュアルブロックモードに移行するとステータスラインに「-- VISUAL BLOCK --」と表示されます。

ビジュアルブロックモードでは矩形の範囲を選択可能で、4隅があり o を押すと始点と終点を斜めに動きます。

同じ行の反対側に移動するには O(大文字の o)を押します。

ブロック単位のビジュアルブロックモードのスクリーンショット

テキストオブジェクト

テキストオブジェクトはテキスト(文字列)をあるルールに基づいて1つのまとまりとして扱うための仕組みです。

オペレータと組み合わせ使うことで、範囲の指定が簡単になります。

例えば、単語の途中にカーソルがある場合、その単語を削除するにはカーソルを単語の先頭に移動して dw コマンドを実行する必要があります。

テキストオブジェクトを使って daw とすることで、カーソルが単語の途中にあってもその単語を削除することができます。

コマンドは「オペレータ モーション」の形式で指定できますが、「オペレータ テキストオブジェクト」の形式でも指定できます。

daw というコマンドは、d は削除オペレータで、aw は1つの単語(a word)を表すテキストオブジェクトです。

「オペレータ モーション」の形式では移動コマンドの前と後のカーソル位置がオペレータの範囲となっていますが、「オペレータ テキストオブジェクト」の形式ではオブジェクト全体を対象とするので、オブジェクトのどこにカーソルがあっても構いません。

例えば以下のようなテキストがある場合、「Hello」のどこかにカーソルがあって、dis とすると「Hello My Friend!」が削除されます。

Hello
My Friend! some more text.

dis は削除オペレータの d とテキストオブジェクトの is から構成されていて、is は「inner sentence」の意味です。

as (a sentence) というオブジェクトもあり、as は文の後の空白を含みますが、is は含みません。

文を削除するときに、前後の空白も同時に削除する場合は das を使います。

  • a (1つの): テキストオブジェクト全体を指定。後ろの空白を含む。
  • i (inner 内側の): テキストオブジェクト内部を指定。

以下はテキストオブジェクトを使った便利な例です。

[ ] 以外でも ( ) やクォートなど対になっている記号でも同様のことが可能です。

//[ ]で囲まれた中を削除
[a,b,c] // di[ とタイプすると中身が削除され以下のようになります
[] 

//[ ]ごと削除
[a,b,c] // da[ とタイプすると[ ]ごと削除されます

/引用符の中を削除
"a,b,c"// di" とタイプすると中身が削除され以下のようになります
""

Vim日本語ドキュメント/テキストオブジェクトオブジェクト単位で選択

外部コマンドの実行

外部コマンドを実行するには、:! の後に実行するコマンドをタイプします。

例えば、/ の一覧を表示する ls -l / を実行するには :!ls -l / とタイプします。

コマンドラインを補完するスクリーンショット

コマンドが実行され、画面下部に「Press ENTER or type command to continue」と表示されます。

実行されたコマンドを終了するには return を押します。

外部コマンドを実行する際のスクリーンショット

補完

control + dtab でコマンドラインを補完することができます。

コマンドラインで可能な補完の候補を表示するには control + d を押します。

例えば、h から始まるコマンドの候補を表示するには :h とタイプして control + d を押すと以下のように候補が表示されます。

外部コマンドを実行後のスクリーンショット

続いて tab を押すとコマンドが補完されます。