Awesome Vim Galore
Vim Galoreを扱う資料や関連プロジェクトをまとめたAwesomeリストです。
What is Vim?
Vimは、qedまで さかのぼる長い系譜を持つテキストエディターです。Bram Moolenaarが1991年に公開しました。
プロジェクトは vim.org にオンラインでホストされています。
Vimをインストールする:お気に入りのパッケージマネージャーを使用するか、vim.orgの download pageを訪ねてください。
ディスカッションやユーザーの質問は、
vim_use メーリングリストで行うか、
IRC (Freenode) の #vim チャンネルで行うのが最適です。
開発は GitHub で行われ、議論は vim_dev メーリングリストで行われる。
Why, oh WHY, do those #?@! nutheads use vi? を読みましょう。Vimに関する一般的な誤解が説明されています。
The Vim Philosophy
ヴィムはモーダル編集の哲学に従っています。これは、複数のモードを提供し、キーの意味がモードによって変化するということです。ファイルをナビゲートするのは_正常モード_、テキストを挿入するのは_挿入モード_、行を選択するのは_視覚モード_、コマンドにアクセスするのは_コマンドラインモード_などです。最初はこれに少し複雑に思えるかもしれませんが、大きな利点があります。つまり、ほとんどの場合、一度に複数のキーを押さえる必要がなく、キーを一つずつ連続して押すだけで済むのです。よくあるタスクほど頻繁に使われるほど、必要なキーの数が減ります。
モーダル編集とよく組み合わせられる概念に、オペレーターと動きがあります。
オペレーター は特定の操作を開始します。たとえば、テキストの変更、削除、または選択など。
その後、操作を適用したいテキストの範囲を_動き_を使って指定します。
カッコの中のすべての内容を変更するには、ci( (「内側のカッコを変更」と読みます) を使用します。テキストのすべての段落を削除するには、dap (「段落の周りを削除」と読みます) を使用します。
もし高度なVimユーザーが作業しているのを見ると、彼らがVimの言語をピアニストが楽器を扱うように扱っていることに気づきます。複雑な操作は、わずかなキーボード操作で行われます。それらはもうほとんど意識しなくて済みます。なぜなら muscle memory がすでにその役割を担っているからです。これにより cognitive load が減少し、実際のタスクに集中できるようになります。
First steps
ヴィムには、最も基本的なことについて学べるインタラクティブなチュートリアルが組み込まれています。シェルから開始できます。
$ vimtutorどう見てもつまらないように見えるので、やめてしまうのを避け、練習を進めましょう。以前使っていたエディタやIDEはおそらくすべてモーダルでなかったので、モードを切り替えることで作業を行うのは最初は不自然に感じますが、Vimを使うほどになると、それが muscle memoryになります。
VimはStevie、一個のviのクローンとして取り付けられ、2つの動作モードをサポートしている。
“compatible” と “nocompatible”。compatibleモードでVimを使用することは、すべてのオプションに対してviのデフォルト値を使用することを意味する。Vimを起動する際にまだユーザー用のvimrcファイルを作成していないか、あるいはvim -NでVimを起動していない場合、compatibleモードが自動的に適用される!compatibleモードでVimを使用しないでください。ただ、使わないでください。
次に:
- Create your own vimrc.
- Have some cheatsheets 初週の準備が整った
- Read through the basics 何が可能なのかを学ぶセクション
- Learn on demand! You never finish learning Vim. If you encounter any problems, just look for it on the internet. Your problem was solved already. Vim comes with great documentation and knowing how to navigate it is a must: Getting help offline.
- Have a look at the additional resources.
最後のアドバイス:すべての種類の過剰に宣伝された plugins を追加する前に、Vimが既に本質的にサポートしている機能だけを実装するものであることに気づくように、Vimを適切に使う方法を学んでください。
Minimal vimrc
ユーザーのvimrcは~/.vimrcに配置するか、より明確な分離のため~/.vim/vimrcに配置することができる。後者の方法により、全体の設定をバージョン管理に含め、たとえばGitHubにアップロードできるようになる。
インターネットのあらゆる場所に「minimal vimrcs」がたくさんあります。私のバージョンがそれほど最小限であるとは限りませんが、初心者にとって有用だと考えられる、適切な設定の良いセットを提供しています。
いずれにせよ、すべての記載された設定について調べて、自分で判断する必要があります。 :-)
こうして、ここにあります: minimal-vimrc
興味がある場合は、ここに my vimrc。
ヒント:ほとんどのプラグイン開発者は複数のプラグインを維持しており、GitHubに自分のvimrcを公開しています(通常は「vim-config」とか「dotfiles」というリポジトリに)。したがって、好きなプラグインを見つけたときは、その開発者のGitHubページを検索し、そのリポジトリを確認してください。
What kind of Vim am I running?
:version を見ることで、現在実行中の Vim バイナリがコンパイルされた方法について必要なすべての情報を得られます。
最初の行は、バイナリがコンパイルされた日付とバージョンを示しており、たとえば 7.4 です。
次の行の一つが Included patches: 1-1051 と記されています。これはパッチレベルです。したがって、あなたの正確な Vim バージョンは 7.4.1051 です。
別の行には、たとえばTiny version without GUIまたはHuge version with GUIと記されています。この情報から、VimにGUIサポートが含まれるかどうか、
たとえばシェルからgvimを起動したり、ターミナルエミュレーター内のVimから
:guiを実行したりできるかが分かります。ほかに重要なのはTinyとHugeです。
Vimはtiny、small、normal、big、hugeという機能セットを区別し、
それぞれ異なる機能の部分集合を有効にします。
:versionの出力の大部分は、機能リストそのものに消費されている。
+clipboardはクリップボード機能がコンパイルされたことを意味し、-clipboardはその機能がコンパイルされていないことを意味する。
Vimのいくつかの機能は、それらが動作するためにはコンパイルする必要があります。たとえば、:profが動作するには、機能が非常に多いVimが必要です。なぜなら、その機能セットが+profileの機能を可能にしているからです。
もしもそのような状況でなく、Vimをパッケージマネージャーからインストールした場合は、名前が vim-x、vim-x11、vim-gtk、vim-gnome またはそれらに類するパッケージをインストールしていることを確認してください。これらのパッケージは通常、大きな機能セットを提供しています。
プログラム的にバージョンや機能を確認することもできます
" Do something if running at least Vim 7.4.42 with +profile enabled.
if (v:version > 704 || v:version == 704 && has('patch42')) && has('profile')
" do stuff
endifヘルプ:
:h :version
:h feature-list
:h +feature-list
:h has-patchCheatsheets
- http://people.csail.mit.edu/vgod/vim/vim-cheat-sheet-en.png
- https://cdn.shopify.com/s/files/1/0165/4168/files/preview.png
- http://michael.peopleofhonoronly.com/vim/vim_cheat_sheet_for_programmers_screen.png
- http://www.rosipov.com/images/posts/vim-movement-commands-cheatsheet.png
もしくは、Vim内ですぐにチェックシートを開く: vim-cheat40.
Basics
Buffers, windows, tabs
Vimはテキストエディタです。テキストが表示されるたび、そのテキストはバッファの一部になります。各ファイルは独自のバッファに開かれます。プラグインはそれぞれのバッファに内容を表示しますなど。
バッファには多くの属性がある。たとえば、その中に含まれるテキストが変更可能かどうか、あるいはファイルと関連付けられており、保存時にディスクに同期させる必要があるかどうかといったものがある。
Windows はバッファへのビューポートです。複数のファイルを同時に表示するか、あるいは同じファイルの異なる場所を表示したい場合、ウィンドウを使用します。
そして、お願いします、お願いします、それらを splits と呼んでください。窓を二つに分けることはできますが、それだけではそれらを splits と呼ぶことはできません。
ウィンドウは縦にまたは横に分割でき、既存のウィンドウの高さや幅も変更できます。したがって、好みのウィンドウレイアウトを使用できます。
タブページ(あるいは単にタブ)は、ウィンドウのコレクションです。したがって、複数のウィンドウレイアウトを使用したい場合は、タブを使用してください。
簡潔に言えば、引数を指定せずにVimを起動すると、1つのタブページに1つのウィンドウが含まれ、そのウィンドウが1つのバッファを表示する。
ちなみに、バッファリストはグローバルであり、どのタブからもどのバッファにアクセスできます。
Active, loaded, listed, named buffers
Vimをこうして実行してください vim file1。ファイルの内容がバッファにロードされます。
現在、ロードされたバッファを持ちます。バッファの内容は、Vim内で保存するまでディスク(ファイルに書き戻す)まで同期されません。
バッファはウィンドウに表示されているため、それもアクティブバッファです。今後、別のファイルを :e file2 で読み込むと、 file1 は非表示バッファになり、 file2 がアクティブバッファになります。
両方のバッファもリストされているため、それらは:lsの出力にリストされる。プラグインバッファまたはヘルプバッファは通常、リストされていないとマークされる。なぜなら、それらはテキストエディタで通常編集するような普通のファイルではないからである。リストされているか、リストされていないかは、:ls!で表示できる。
名前なしバッファ、またプラグインでもよく使われるバッファは、ファイル名が関連付けられていないバッファです。たとえば :enew は名前なしのスクラッチバッファを作成します。いくつかのテキストを追加し、:w /tmp/foo を使ってディスクに書き出せば、名前付きバッファになります。
Argument list
global buffer listはVimの機能です。それ以前のviでは、ただ引数リストしか存在していなかったのです。これはVimでも利用可能です。
シェルコマンドラインにVimに渡されたすべてのファイル名は、引数リストに記憶される。複数の引数リストが存在する可能性がある:デフォルトではすべての引数がグローバルな引数リストに格納されるが、:arglocalを使用することで、ウィンドウに限定された新しい引数リストを作成できる。
現在の引数を :args でリスト表示します。引数リストからファイルを :next、:previous、:first、:last などで切り替えます。ファイルのリストを :argadd、:argdelete または :args で変更します。
ファイルを扱う際にバッファまたは引数リストを使用するかどうかは好みの問題です。私の印象は、ほとんどの人がバッファリストを exclusively 使っており、それ以外の方法は使わないということです。
それでも、引数リストには一つ、大きな用途があります: :argdo を使ってバッチ処理!簡単なリファクタリングの例:
:args **/*.[ch]
:argdo %s/foo/bar/ge | updateこのコマンドは、現在のディレクトリおよびその下にあるすべてのCソースファイルとヘッダーファイルにおけるすべての”foo”の出現を”bar”に置き換える。
ヘルプ: :h argument-list
Mappings
あなたは、:mapファミリーコマンドを使って、独自のマッピングを定義できます。このファミリーの各コマンドは、特定のモードセットに対してマッピングを定義します。技術的にはVimには12のモードが用意されており、そのうち6つはマッピング可能です。さらに、一部のコマンドは複数のモードに対して同時に動作します。
| Recursive | Non-recursive | Unmap | Modes |
|---|---|---|---|
:map | :noremap | :unmap | normal, visual, operator-pending |
:nmap | :nnoremap | :nunmap | normal |
:xmap | :xnoremap | :xunmap | visual |
:cmap | :cnoremap | :cunmap | command-line |
:omap | :onoremap | :ounmap | operator-pending |
:imap | :inoremap | :iunmap | insert |
たとえば、これは通常モードだけに適用されるマッピングを定義している。
:nmap <space> :echo "foo"<cr>:nunmap <space>]を使用して再度マップを解除してください。
幾つか、それほど一般的でないモード(またはそれらの組み合わせ)については、:h map-modesを参照してください。
ここまで、問題ない。初心者にとってかなり混乱を招く唯一の問題は、:nmapが_再帰_的であるということだ。つまり、右側の部分が他のマッピングを考慮するということだ。
だから、あなたは”Foo”をただ繰り返すマッピングを定義した
:nmap b :echo "Foo"<cr>でも、bのデフォルト動作(一つの単語分戻る)を別のキーにマッピングしたい場合がある
:nmap a baを押すとカーソルが1単語戻るはずですが、代わりにコマンドラインへ
「Foo」と表示されます。右辺のbが、すでに別の操作、つまり
:echo "Foo"<cr>へマッピングされているためです。
この問題を解決する正しい方法は、_非再帰_マッピングを使用することです:
:nnoremap a bルール:再帰を実際に必要とする場合を除き、常に非再帰的なマッピングを使用する。
マッピングを検索するには、右側の値を指定しないでください。たとえば :nmap はすべての通常のマッピングを表示し、:nmap <leader> はマップリーダーで始まるすべての通常のマッピングを表示します。
標準マッピングを無効にする場合は、それらを特別な <nop>
文字にマッピングしてください。たとえば、:noremap <left> <nop>。
ヘルプ:
:h key-notation :h mapping :h 05.3
Mapleader
マップリーダーは、カスタムマッピングと使用できるプレースホルダーに過ぎず、デフォルトでは \ に設定されています。
nnoremap <leader>h :helpgrep<space>このマッピングは \h によってトリガーされます。 <space>h を代わりに使用したい場合:
let mapleader = ' '
nnoremap <leader>h :helpgrep<space>さらに、<localleader> がある。これは <leader> のローカル対応であり、バッファに局所的なもの(たとえば、ファイルタイプごとのプラグイン)に適用されるマッピングに使用されるものとされている。また、デフォルトで \ となる。
Note: Set the mapleaders before mappings! All leader mappings that are in
effect already, won’t change just because the mapleader was changed. :nmap <leader> will show all normal mode leader mappings with the mapleader resolved
already, so use it to double-check your mappings.
:h mapleader と :h maplocalleader を参照してください。
Registers
レジスタはテキストを保存するためのスロットです。テキストをレジスタにコピーすることはヤンクと呼ばれ、レジスタからテキストを抽出することはペーストと呼ばれます。
Vim は以下のレジスタを提供します。
| Type | Character | Filled by? | Readonly? | Contains text from? |
|---|---|---|---|---|
| Unnamed | " | vim | [ ] | Last yank or deletion. (d, c, s, x, y) |
| Numbered | 0 to 9 | vim | [ ] | Register 0: Last yank. Register 1: Last deletion. Register 2: Second last deletion. And so on. Think of registers 1-9 as a read-only queue with 9 elements. |
| Small delete | - | vim | [ ] | Last deletion that was less than one line. |
| Named | a to z, A to Z | user | [ ] | If you yank to register a, you replace its text. If you yank to register A, you append to the text in register a. |
| Read-only | :, ., % | vim | [x] | :: Last command, .: Last inserted text, %: Current filename. |
| Alternate buffer | # | vim | [ ] | Most of the time the previously visited buffer of the current window. See :h alternate-file |
| Expression | = | user | [ ] | Evaluation of the VimL expression that was yanked. E.g. do this in insert mode: <c-r>=5+5<cr> and “10” will be inserted in the buffer. |
| Selection | +, * | vim | [ ] | * and + are the clipboard registers. |
| Drop | ~ | vim | [x] | From last drag’n’drop. |
| Black hole | _ | vim | [ ] | If you don’t want any other registers implicitly affected. E.g. "_dd deletes the current line without affecting registers ", 1, +, *. |
| Last search pattern | / | vim | [ ] | Last pattern used with /, ?, :global, etc. |
各読み取り専用でないレジスタはユーザーによって設定可能である。
:let @/ = 'register'その後 nは「register」の次に出現する場所にジャンプする。
レジスタが暗黙に埋められる場合に多くの例外が発生するため、必ず :h registers を読みましょう。
y と p/P で貼り付けますが、Vim は文字単位と行単位の視覚選択を区別しています。 :h linewise を参照してください。
例: 行ごと
yy(またはただ Y)で現在の行を引き抜き、カーソルを別の場所に移動させ、
p を使用して現在の行の下に貼り付け P でその上に貼り付けます。
例: 文字単位
0ywで最初の単語を引き抜き、別の場所に移動し、pで現在の行のカーソルの後ろに、Pでカーソルの前に貼り付けます。
例:レジスタの明示的な命名
"aY に現在の行を登録する a。別の行に移動する。"AY
現在の行を a に追加する。
私は、すべてのこれらのレジスタを少し試して、常にチェックしてください
:reg、そうすれば実際に何が起こっているかを見ることができます。
興味深い事実:Emacsでは「yanking」とは貼り付け(または_以前に削除したテキストの再挿入_)を意味し、コピーを意味しない。
Ranges
範囲はかなりわかりやすいですが、多くのVimmerはその 完全な可能性について知りません。
- Many commands take ranges.
- An address denotes a certain line.
- A range is either a single address or a pair of addresses separated by either
,or;. - Ranges tell commands which lines to act on.
- Most commands act only on the current line by default. Notable exceptions are
:writeand:globalwhich act on all lines.
範囲の使用はかなり直感的です。以下にいくつかの例を示します(:dを:deleteの短縮形として使用):
| Command | Lines acted on |
|---|---|
:d | Current line. |
:.d | Current line. |
:1d | First line. |
:$d | Last line. |
:1,$d | All lines. |
:%d | All lines (syntactic sugar for 1,$). |
:.,5d | Current line to line 5. |
:,5d | Also current line to line 5. |
:,+3d | Current line and the next 3 lines. |
:1,+3d | First line to current line + 3. |
:,-3d | Current line and the last 3 lines. (Vim will prompt you, since this is a reversed range.) |
:3,'xdelete | Lines 3 to the line marked by mark x. |
:/^foo/,$delete | From the next line that starts with “foo” to the end. |
:/^foo/+1,$delete | From the line after the line that starts with “foo” to the end. |
,の代わりに、;をセパレータとして使うことができます。違いは、from,toの場合、_to_は現在の行に対して相対的ですが、from;toを使う場合、_to_は_from_のアドレスに対して相対的になります!現在の行が5行にあると仮定すると、:1,+1dは1行から6行までを削除し、:1;+1dはただ1行と2行だけを削除します。
/アドレスの前に別のアドレスを付加できます。これにより、パターンを_スタック_できます。たとえば:
:/foo//bar//quux/dこれは、現在の行後にまず”foo”を含む行、その後に”bar”を含む行、その後に”quux”を含む行を含む最初の行を削除する。
vimは、場合によってはコマンドラインに範囲を自動的に前に追加します。たとえば、視覚的に1行を選択するには V を入力し、いくつかの行を選択して : をタイプすると、コマンドラインに範囲 '<,'> が表示されます。これは、次のコマンドが、以前選択した行を範囲として使用するということです。(これは、なぜか、たまに :vnoremap foo :<c-u>command といったマッピングを見かける原因です。ここでは <c-u> が範囲を削除するために使われており、vimは、範囲をサポートしていないコマンドに範囲を指定するとエラーを出すためです。)
別の例として、通常モードで !! を使用する場合がある。これにより、コマンドラインに :.! が入力される。そのあとに外部プログラムを続けて呼び出した場合、そのプログラムの出力が現在の行を置き換える。したがって、ls の出力を使って現在の段落を置き換えるには、:?^$?+1,/^$/-1!ls を使用すればよい。面白い!
ヘルプ:
:h cmdline-ranges
:h 10.3Marks
あなたはマークを使用して、ファイル内の位置、つまり行番号と列を記憶します。
| Marks | Set by.. | Usage |
|---|---|---|
a - z | User | Local to file, thus only valid within one file. Jumping to a lowercase mark, means jumping within the current file. |
A - Z | User | Global, thus valid between files. Also called file marks. Jumping to a file mark may switch to another buffer. |
0 - 9 | viminfo | 0 is the position when the viminfo file was written last. In practice this means when the last Vim process ended. 1 is the position of when the second last Vim process ended and so on. |
マークの前に '/g' または `/g` を配置して動きを形成する。
mmを使うと、現在位置をマーク「m」として記憶できます。ファイル内を移動した後、
'm(最初の非空白文字)または`m(正確な列)で戻れます。小文字のマークは、
viminfoファイルを適切に設定すればVim終了後も保持されます。:h viminfo-'を参照してください。
mMを使うと、現在位置をファイルマーク「M」として記憶できます。別のバッファーへ
切り替えた後、'Mまたは`Mで戻れます。
他の動きには:
| Motion | Jump to.. |
|---|---|
'[, `[ | First line or character of previously changed or yanked text. |
'], `] | Last line or character of previously changed or yanked text. |
'<, `< | Beginning line or character of last visual selection. |
'>, `> | Ending line or character of last visual selection. |
'', `` | Position before the latest jump. |
'", `" | Position when last exiting the current buffer. |
'^, `^ | Position where last insertion stopped. |
'., `. | Position where last change was made. |
'(, `( | Start of current sentence. |
'), `) | End of current sentence. |
'{, `{ | Start of current paragraph. |
'}, `} | End of current paragraph. |
マーカーは、また range にも使用できます。以前にこれを見たことがあるでしょうし、それが何を意味するか不思議に思ったかもしれません:視覚モードでいくつかのテキストを選択し、 : を実行すると、コマンドラインの前に :'<,'> が表示され、これは次のコマンドが視覚選択を表す範囲を得ることを意味します。
:marksにすべてのマーカーをリストしてください。:h mark-motionsに記載されたすべての内容を読みましょう。
Completion
Vimにはさまざまな挿入モードの補完があります。一致する項目が複数ある場合、ポップアップメニューが表示され、選択したい一致項目に移動できます。
典型的な補完の種類には、タグ、インポートされたモジュールやライブラリから導入された関数、ファイル名、辞書、あるいは現在のバッファ内の単語などがあります。
Vim は各種の補完に対してマッピングを提供しており、それらはすべて
<c-x>(挿入モードで使用してください)で始まります:
| Mapping | Kind | Help |
|---|---|---|
<c-x><c-l> | whole lines | :h i^x^l |
<c-x><c-n> | keywords from current file | :h i^x^n |
<c-x><c-k> | keywords from 'dictionary' option | :h i^x^k |
<c-x><c-t> | keywords from 'thesaurus' option | :h i^x^t |
<c-x><c-i> | keywords from current and included files | :h i^x^i |
<c-x><c-]> | tags | :h i^x^] |
<c-x><c-f> | file names | :h i^x^f |
<c-x><c-d> | definitions or macros | :h i^x^d |
<c-x><c-v> | Vim commands | :h i^x^v |
<c-x><c-u> | user defined (as specified in 'completefunc') | :h i^x^u |
<c-x><c-o> | omni completion (as specified in 'omnifunc') | :h i^x^o |
<c-x>s | spelling suggestions | :h i^Xs |
人々は、ユーザー定義補完とオミニ補完の違いについて混乱するかもしれません。しかし、技術的にはどちらも同じことをしています。どちらも、現在の位置を検査する関数を受取り、補完候補のリストを返します。ユーザー定義補完は、ユーザーが自分の目的のために定義します。(驚き!)これは何でも可能です。一方、オミニ補完はファイルタイプに特化した目的のために使われ、たとえば構造体のメンバやクラスメソッドの補完などに使われ、通常はファイルタイププラグインによって設定されます。
Vimでは'complete'オプションを設定して、複数種類の補完を同時に使うこともできます。
デフォルトでは多くの対象が含まれるため、好みに合わせて絞り込んでください。
補完は<c-n>(次)または<c-p>(前)で起動でき、これらはポップアップメニューの
項目選択にも使われます。詳しくは:h i^nと:h 'complete'を参照してください。
:h 'completeopt'でポップアップメニューの動作を設定できるようにしてください。デフォルトは非常に適切ですが、私はさらに”noselect”を追加したいと思っています。
ヘルプ:
:h ins-completion
:h popupmenu-keys
:h new-omni-completionMotions, operators, text objects
移動はカーソルを動かします。皆さん、h/j/k/lを知っています。あるいはwとb。さらに/も移動です。これらはすべて数を取るのです。2?the<cr>は「the」の最後から第二の出現場所にジャンプします。
:h navigation およびその下のすべての内容を参照してください。
オペレータはテキストの領域に作用する。たとえば、d、~、gU、>などがある。これらは通常モードまたは視覚モードで使用される。通常モードでは、オペレータが最初に来て、その後に移動命令が続く。たとえば、>j。視覚モードでは、オペレータは選択範囲に直接作用する。たとえば、Vjd。
動き同様に、操作命令もカウントを取ります。たとえば、2gUwは現在の文字列の残り部分および次の文字列を大文字にします。動きと操作命令がカウントを取りますので、2gU2wはまったく同じように動作し、gU2wが2回実行されます。
すべての利用可能な演算子については :h operator を参照してください。 :set tildeop を使用して ~ が演算子として動作するようにしてください。
テキストオブジェクトは、周囲の領域に作用し、一方にのみ作用する動きとは対照的である。実際には、オブジェクトに作用するもので、たとえば一連の文字、一文、かっこの中のすべての内容などがある。
テキストオブジェクトは、通常モードでカーソルを移動するために使用できません。なぜなら、最も熟練したカーソルでも、同時に二方向にジャンプすることはできませんからです。しかし、視覚モードでは機能します。その理由は、オブジェクトの一方側がすでに選択されているためで、カーソルはただもう一方側にジャンプするだけです。
テキストオブジェクトは、いずれにせよ i(_inner_を想定)または a(_around_を想定)から始まり、オブジェクトを表す文字が続く。 iはそのオブジェクト自身にのみ作用し、 aはオブジェクト plus その後の空白文字に作用する。 例: diwは現在の単語を削除し、 ci(はすべての括弧の中の内容を変更する。
テキストオブジェクトはカウントを取る。 ((( ))) とカーソルを最内側の括弧の内側またはその間にあると想定し、その後 d2a( は2つの内側の括弧を削除し、それらの間にあるすべての内容を削除する。
すべての利用可能なテキストオブジェクトについては、:h text-objectsを参照してください。
Autocmds
Vimにおいて、バッファが保存されたか、あるいはVimが起動した後に、所謂_autocmds_によってアクションをトリガーできます。
Vimは自動コマンドに大きく依存しています。信じられませんか? :auを確認してください。しかし、出力があなたを圧倒しないようにしてください。これらは現在有効なすべての自動コマンドです!
:h {event}にある内容を確認して、すべての利用可能なイベントについての概要を把握し、:h autocmd-events-abcを参照して詳細を確認してください。
ファイルタイプごとの設定の典型的な例はこうである。
autocmd FileType ruby setlocal shiftwidth=2 softtabstop=2 comments-=:#でも、バッファがRubyコードを含んでいることをどうやって知っているのだろうか? それは別の自動コマンドがその内容をRubyとして検知し、それに応じてファイルタイプを設定したためであり、その結果、再度 FileType イベントがトリガーされたのである。
vimrc に誰もが最初に追加するものは filetype on です。これは filetype.vim が起動時に読み込まれることを意味し、ほぼすべてのファイルタイプに対して自動コマンドを設定します。
もし勇気があるなら、見てみましょう: :e $VIMRUNTIME/filetype.vim。 “Ruby” と検索すると、Vim は Ruby ファイルを検出するためにファイルの拡張子 .rb を使っていることがわかります。
注意:同じイベントのアトゥーコマンドは、作成順に実行される。:auでは、正しい順序で表示している。
au BufNewFile,BufRead *.rb,*.rbw setf rubyこの場合、BufNewFileとBufReadイベントはVimのCソースにハードコードされており、
:eなどのコマンドでファイルを開くたびに発行されます。その後、filetype.vimに
定義された数百種類のファイルタイプがすべて検査されます。
簡潔に言えば、Vimはイベントと自動コマンドを積極的に活用しているが、それらのイベント駆動システムにカスタマイズを接続できるシンプルなインターフェースを提供している。
ヘルプ: :h autocommand
Changelist, jumplist
最後の100件の変更の位置はchangelistに保持されます。同じ行に複数の小さな変更が行われた場合、それらはまとめて処理されますが、位置は最後の変更の位置になります(行の途中に何かを追加した場合など)
ジャンプするたびに、ジャンプ前の位置はjumplistに記憶されます。jumplistには最大100項目まで含まれます。各ウィンドウにはそれぞれのjumplistがあります。ウィンドウを分割すると、jumplistがコピーされます。
ジャンプに該当するのは、', `, G, /, ?, n, N,
%, (, ), [[, ]], {, }, :s, :tag, L, M, H、および新しいファイルの
編集を開始するコマンドです。
| List | List all entries | Go to older position | Go to newer position |
|---|---|---|---|
| jumplist | :jumps | [count]<c-o> | [count]<c-i> |
| changelist | :changes | [count]g; | [count]g, |
すべての項目をリストアップするとき、現在の位置を示すマーカー >が使用されます。通常、それは1番目の位置の下にあります。
Vimを再起動しても両方のリストが保持されるようにするには、viminfoファイルと:h viminfo-'を使用する必要があります。
NOTE: 最新のジャンプ前の位置も mark として保持され、`` or '' にジャンプ可能である。
ヘルプ:
:h changelist
:h jumplistUndo tree
テキストステートの最新変更は記憶されます。undo を使用して変更を元に戻し、redo を使用して以前元に戻した変更を再適用できます。
重要な点は、最近の変更を保持しているデータ構造が queue ではなく tree! あなたの変更は木のノードであり、それぞれ(トップノードを除く)は親ノードを持ちます。各ノードは変更されたテキストと時間に関する情報を保持しています。枝(branch)とは、どのノードから始まりトップノードまで上に向かうノードの系列です。変更を元に戻した後に別のものを取り込むと、新しい枝が作られます。
ifoo<esc>
obar<esc>
obaz<esc>
u
oquux<esc>今、あなたは3行を持ち、アンダーオートリーフはこうなります。
foo(1)
/
bar(2)
/ \
baz(3) quux(4)アンダーオートリーツには4つの変更があります。数字はノードが作成された_時刻_を表しています。
今、この木を走査するには二つの方法があります。それらを_branch-wise_と_time-wise_と呼ぶことにしましょう。
undo(u)とredo(<c-r>)は分岐単位で動作し、現在の分岐を上下します。uで
テキスト状態はノード「bar」へ戻り、もう一度uを実行すると「foo」まで戻ります。
続いて<c-r>を実行すると「bar」へ、さらにもう一度<c-r>を実行すると「quux」へ進みます。
分岐単位のコマンドでは、もはや「baz」へ到達できません。
この対立に対して、g-とg+は時間的に作用する。したがって、g-は、uがするようにノード”bar”の状態に戻るのではなく、時系列上の前の状態、ノード”baz”に戻る。別のg-は状態をノード”bar”の状態に戻し、さらにそのように繰り返す。したがって、g-とg+はそれぞれ時間軸上で往復するだけである。
| Command / Mapping | Action |
|---|---|
[count]u, :undo [count] | Undo [count] changes. |
[count]<c-r>, :redo | Redo [count] changes. |
U | Undo all changes to the line of the latest change. |
[count]g-, :earlier [count]? | Go to older text state [count] times. The ”?” can be either “s”, “m”, “h”, “d”, or “f”. E.g. :earlier 2d goes to the text state from 2 days ago. :earlier 1f will go to the state of the latest file save. |
[count]g+, :later [count]? | Same as above, but other direction. |
アンダーモードのツリーはメモリ上に保持され、Vimが終了すると失われます。persistent undoを有効にする方法については Undo files を参照してください。
Undoツリーが混乱している場合は、 undotreeがそれを可視化するのに非常に良い仕事しています。
ヘルプ:
:h undo.txt
:h usr_32Quickfix and location lists
クイックフィックスリストは、ファイル位置を保持するデータ構造です。本質的には、クイックフィックスリストの各項目は、ファイルパス、行番号およびオプションの列番号、および説明文を含みます。
典型的な使用例は、コンパイラのエラーを組み立てたり、grepツールの実行結果を生成したりすることである。
Vimには、クイックフィックスリストを表示するための特別な種類のバッファがあります。それはクイックフィックスバッファです。クイックフィックスバッファ内の各行は、クイックフィックスリストの1つの項目を示しています。
通常、クイックフィックスリストを表示するために新しいウィンドウを開きます。そのウィンドウはクイックフィックスウィンドウです。そのとき、最後のウィンドウはクイックフィックスウィンドウと関連付けられます。
クイックフィックスバッファ <cr> で選択された項目を関連するウィンドウに開き、<c-w><cr> は新しいウィンドウに開く
quickfix listという名前は、Aztec C compilerの「quick fix」機能に由来します。
実際にリストには二種類があります:quickfixとlocation listです。これらはほぼ同じように動作しますが、以下の違いがあります:
- There is only one quickfix list. There can be multiple location lists; one per window.
- They use slightly different commands for navigation.
| Action | Quickfix | Location |
|---|---|---|
| open window | :copen | :lopen |
| close window | :cclose | :lclose |
| next entry | :cnext | :lnext |
| previous entry | :cprevious | :lprevious |
| first entry | :cfirst | :lfirst |
| last entry | :clast | :llast |
これらのコマンドが動作するには、クイックフィックスおよび位置ウィンドウを開ける必要はありません。
:h quickfixに詳しくはおよびコマンドの完全なリストについてはご確認ください。
簡潔のため、quickfix および location はそれぞれ qf および loc と略される。
例
現在のディレクトリ内を再帰的に探索し、特定のクエリに対してファイルを検索し、その結果をクイックフィックスリストに表示するには、私たちの昔からの友達 grep を使ってください。
:let &grepprg = 'grep -Rn $* .'
:grep! foo
<grep output - hit enter>
:copen仮にどのファイルにも”foo”という文字列が含まれていた場合、今すぐクイックフィックスウィンドウに表示されるべきです。
Macros
Vimは、入力された文字を register に_記録_する機能を提供します。これは、即座に特定のタスクを自動化するための素晴らしい方法です。(より複雑なタスクには、Vimスクリプトの使用が推奨されます。)
- Start recording by typing
qfollowed by the register, e.g.q. (The command-line will signify this via “recording @q”.) - Stop recording by hitting
qonce again. - Execute the macro via
[count]@q. - Repeat the last used macro via
[count]@@.
例 1:
線を挿入し、それを10回繰り返す
qq
iabc<cr><esc>
q
10@q(マクロを使わずに同じことが行えます: oabc<esc>10.)
例2:
すべての行の前に行番号を追加するには、最初の行から始め、その行に「1. 」を手動で追加します。カーソルの下に表示される <c-a> を使用して数値を増加させます。これは ^A として表示されます。
qq
0yf jP0^A
q
1000@qここでは、1000@qを使用する際、ファイルに1000行を超える内容がないことをただ望んでいます。しかし、再帰マクロを使用することもできます。これは、マクロが行に適用できなくなるまで実行されます。
qq
0yf jP0^A@q
q
@q(マクロを使わずに同じことが行えます: :%s/^/\=line('.') . '. ')
こうした例ではマクロを使わずに同じことを実現する方法も示していますが、これは主にシンプルな例にしか適用できません。より複雑な自動化にはマクロが絶対に必要です!
もごらえ: Quickly edit your macros
ヘルプ:
:h recording
:h 'lazyredraw'Colorschemes
カラーリングはVimをカスタマイズするための方法です。Vimは多くのコンポーネントから構成されており、それぞれのコンポーネントには、フォント、背景、強調表示など、いくつかの属性に対して異なる色を設定できます。設定方法は以下の通りです:
:highlight Normal ctermbg=1 guibg=redこれはエディタの背景を赤色に塗りつぶす。より詳細な情報は :h :highlight を参照してください。
したがって、カラーパレットは主に :highlight コマンドのコレクションです。
実際には、ほとんどのカラーパレットは本当に2つのカラーパレットです!上の例では、ctermbg と guibg を使って色を設定しています。前者の定義(cterm*)は、Vimがターミナルエミュレーター(たとえばxterm)で起動された場合にのみ使用されます。後者の定義(gui*)は、gvimやMacVimのようなグラフィカル環境で使用されます。
もしもあなたが終端のVimでカラーパレットを使用し、その色がスクリーンショットに表示されているものとはまったく異なる場合、そのカラーパレットはGUI用にしか色を定義していない可能性があります。逆に、グラフィカルなVim(たとえばgvimまたはMacVim)を使用していて色が不自然に見える場合、そのカラーパレットは終端用にしか色を定義していない可能性があります。
後者のケースは、NeovimまたはVim 7.4.1830以降で真の色を有効にすることで”解決”できる。これにより、終端VimはGUIの定義を使用するが、同時に終端エミュレータ自体およびその間にあるすべてのソフトウェア(例:tmux)が真の色を処理できるようにしなければならない。(This gistはこのテーマについて良い概要を提供している。)
ヘルプ:
:h 'termguicolors'- List of colorschemes
- Cosmetic changes to colorschemes
Folding
すべてのテキスト(またはソースコード)には、ある構造が存在する。構造があるということは、論理的に分離されたテキストの領域を持っているということである。折りたたみ機能により、そのような領域を1行に折りたたみ、短い説明を表示できる。このような領域に作用するコマンドは、folds と呼ばれるものがある。折りたたみはネストできる。
Vimは複数のfoldメソッドの種類を区別している。
| ‘foldmethod’ | Usage |
|---|---|
| diff | Used in diff windows to fold unchanged text. |
| expr | Uses 'foldexpr' to basically create a new fold method. |
| indent | Folds based on indentation. |
| manual | Create folds yourself via zf, zF, and :fold. |
| marker | Folds based on markers in the text (often in comments). |
| syntax | Folds based on syntax, e.g. folding if blocks. |
NOTE: 折りたたみは計算量が大きく、処理に時間がかかる可能性があります!もしタイプ時に小さな遅延などのパフォーマンスの低下を感じた場合は、FastFoldを確認してください。これはVimが必要ない場合に折りたたみの更新を行わないようにするためです。
ヘルプ:
:h usr_28
:h foldsSessions
view(:h :mkview)を保存した場合、ウィンドウの現在の状態(およびオプションやマッピング)が後で使用できるように保存されます(:h :loadview)。
セッションは、すべてのウィンドウのビューおよびグローバル設定を保存します。これは、現在のVimインスタンスのスナップショットを作成し、その内容をセッションファイルに保存することを意味します。ここに強調したいのは、セッションは現在の状態を保存しているということです。セッションを保存した後のすべての操作は、セッションファイルに含まれません。セッションを「更新」するには、再度その内容を書き出してください。
これは、projects を保存するのに最適であり、それらの間を切り替えるのが簡単です。
今すぐ試してください。いくつかのウィンドウとタブを開き、:mksession Foo.vimを実行します。ファイル名を省略するとSession.vimが使われます。ファイルは現在の作業ディレクトリへ保存されるため、:pwdで確認してください。Vimを再起動して:source Foo.vimを実行すると、バッファー一覧、ウィンドウ配置、マッピング、作業ディレクトリなどがセッション保存時の状態へ戻ります。さらに作業を進めたら、既存のセッションファイルを
:mksession! Foo.vimで上書きして更新してください。
セッションファイルは、実際にVimインスタンスの特定の状態を復元するために必要なVimコマンドの集合体であるため、それを確認してみてください: :vs Foo.vim.
セッションに保存するものについてVimに設定できるのは'sessionoptions'です。
スクリプトの目的でVimは、最後に読み込まれたまたは書かれたセッションの名前を内部変数 v:this_session に保持する。
ヘルプ:
:h Session
:h 'sessionoptions'
:h v:this_sessionLocality
上記で述べられた多くの概念も、local に対応するものがあります。
| Global | Local | Scope | Help |
|---|---|---|---|
:set | :setlocal | buffer or window | :h local-options |
:map | :map <buffer> | buffer | :h :map-local |
:autocmd | :autocmd * <buffer> | buffer | :h autocmd-buflocal |
:cd | :lcd | window | :h :lcd |
<leader> | <localleader> | buffer | :h maplocalleader |
Variables also have different scopes.
Usage
Getting help offline
Vimには、特別なレイアウトを持つ単一のテキストファイルとしての優れたドキュメンテーションが含まれています。Vimは、そのヘルプファイルの特定部分にアクセスするためにタグベースのシステムを使用しています。
まず、この内容を読んでください: :help :help。これにより、新しいウィンドウにファイル $VIMRUNTIME/doc/helphelp.txt が開き、そのファイル内の :help タグにジャンプします。
いくつかのシンプルなルール
- options are enclosed in single quotes, e.g.
:h 'textwidth' - VimL functions end in
(), e.g.:h reverse() - commands start with
:, e.g.:h :echo
<c-d>(これは ctrl+d)を使用すると、現在入力中のクエリに一致するすべてのタグを一覧表示できます。たとえば、:h tab<c-d>は、tabから'softtabstop'までsetting-guitablabelのすべてのタグの一覧を表示します。
すべてのVimL関数をリストにしたい?簡単です: :h ()<c-d>。ウィンドウに関連するすべてのVimL関数をリストにしたい? :h win*()<c-d>。
これはすぐに自然な行動になりますが、特に初めの段階では、探しているタグのどの部分も分からず、関与している可能性のあるキーワードをただ想像するしかありません。:helpgrepが助けになります!
:helpgrep backwardsこの操作は、すべてのドキュメントファイルに「backwards」が含まれているかを検索し、最初の一致にジャンプします。一致結果はクイックフィックスリストに集約されます。次/前の一貫をジャンプするには :cn/:cp を使用します。あるいは :copen を使ってクイックフィックスウィンドウを開き、項目に移動して <cr> を押すことでその一致にジャンプできます。詳細については :h quickfix を参照してください。
Getting help offline (alternative)
このリストは、最も積極的にVimを開発している開発者たちの一人である@chrisbraが作成し、vim_devに投稿されました。
ここにわずかな変更を加えて再投稿されています。
もしあなたが探しているものについてわかっているなら、ヘルプシステムを使って探すのが通常は簡単です。なぜなら、テーマは一定のスタイルガイドに従っているからです。
また、このヘルプは、あなたの特定のVimバージョンに属しているため、 古くなった項目や後に追加された項目が表示されないという利点があります。
したがって、ヘルプシステムとその言語を学ぶことが重要である。 以下にいくつかの例を示す(必ずしも完全ではなく、何かを忘れている可能性がある)。
-
Options are enclosed in single quotes. So you would use
:h 'list'to go to the help topic for the list option. If you only know, you are looking for a certain option, you can also do:h options.txtto open the help page which describes all option handling and then you can search using regular expressions e.g./width. Certain options have their own namespace, e.g.:h cpo-a,:h cpo-A,:h cpo-b, and so on. -
Normal mode commands are just that. Use
:h gtto go to the help page for the “gt” command. -
Regexp items always start with ”/”, so
:h /\+takes you to the help item for the ”+” quantifier in Vim regexes. If you need to know anything about regular expressions, start reading at:h pattern.txt. -
Key combinations. They usually start with a single letter indicating the mode for which they can be used. E.g.
:h i_CTRL-Xtakes you to the family of CTRL-X commands for insert mode which can be used to auto complete different things. Note that certain keys will always be written the same, e.g. Control will always be CTRL. Note, for normal mode commands, the “n” is left away, e.g.:h CTRL-A. In contrast,:h c_CTRL-Rwill describe what CTRL-R does when entering commands in the command line and:h v_Ctrl-Atalks about incrementing numbers in visual mode and:h g_CTRL-Atalks about the gcommand (thus you have to press “g” then ). Here the “g” stand for the normal command “g” which always expect a second key before doing something similar to the commands starting with “z”. -
Registers always start with “quote” so use
:h quoteto find out about the special ”:” register. -
Vim script (VimL) is available at
:h eval.txt. Certain aspects of the language are available at:h expr-Xwhere ‘X’ is a single letter, e.g.:h expr-!will take you to the topic describing the ’!’ (Not) operator for VimL. Also important, see:h function-listto find a short description of all functions available. -
Mappings are talked about in the help page
:h map.txt. Use:h mapmode-ito find out about the:imapcommand. Also use:map-topicto find out about certain subtopics particular for mappings (e.g.:h :map-localfor buffer-local mappings or:h map_barfor how the ’|’ is handled in mappings. -
Command definitions are talked about at
:h command-*, so use :h command-bar to find out about the ’!’ argument for custom commands. -
Window management commands always start with CTRL-W, so you find the corresponding help at
:h CTRL-W_*(e.g.:h CTRL-W_pfor switch to the previously accessed window). You can also access:h windows.txtand read your way through, if you are looking for window handling command. -
Ex commands always start with ”:”, so
:h :scovers the “:s” command. -
Use CTRL-D after typing a topic and let Vim try to complete to all available topics.
-
Use
:helpgrepto search in all help pages (usually also includes help pages by installed plugins). See:h :helpgrepfor how to use it. Once you have searched for a topic, all matches are available in the quickfix (or location) window which can be opened with:copenor:lopen. There you can also use/to further filter the matches. -
:h helphelpcontains some information on how to use the help. -
The user manual. This describes help topics for beginners in a rather friendly way. Start at
:h usr_toc.txtto find the table of content (as you might have guessed). Skimming over that help to find certain topics, .e.g you will find an entry “Digraphs” and “Entering special characters” in chapter 24 (so use:h usr_24.txtto go to that particular help page). -
Highlighting groups always start with
hl-*. E.g.:h hl-WarningMsgtalks about the “WarningMsg” highlighting group. -
Syntax highlighting is namespaced to “:syn-topic”, e.g.
:h :syn-concealtalks about the conceal argument for the :syn command. -
Quickfix commands usually start with “:c”, while location list commands usually start with “:l”.
-
:h BufWinLeavetalks about the BufWinLeave autocmd. Also,:h autocommands-eventstalks about all possible events. -
Startup arguments always start with ”-”, so
:h -ftakes you to the help of the “-f” command switch of Vim. -
Compiled extra features always start with ”+”, so
:h +concealtalks about the conceal support. -
Error codes can be looked up directly in the help.
:h E297takes you exactly to the description of the error message. Sometimes however, those error codes are not described, but rather are listed at the Vim command that usually causes this. E.g.:h hE128takes you directly to the:functioncommand. -
Documentation for included syntax files is usually available at
:h ft-*-syntax. E.g.:h ft-c-syntaxtalks about the C syntax file and the options it provides. Sometimes, additional sections for omni completion (:h ft-php-omni) or filetype plugins (:h ft-tex-plugin) are available.
また、ユーザードキュメントへのリンク(特定のコマンドについてユーザーの視点から説明し、詳細度が低い)が利用可能であれば、ヘルプページの上部に記載されます。したがって、:h pattern.txtではユーザーガイドのトピック:h 03.9および:h usr_27が述べられています。
Getting help online
解決できない問題があるか、または一般的なガイドが必要な場合は、
vim_use メールリストを参照してください。
もう一つ素晴らしいリソースは、
IRC を利用することです。#vim チャンネルは、
Freenode に非常に大きく、通常、役立つ人々が多数います。
Vimのバグを報告したい場合は、 vim_dev メーリングリストを使用してください。
Autocmds in practice
今すぐ、どんなイベントでもトリガーできます: :doautocmd BufRead。
User events
特にプラグインの場合、自作の”ユーザー”イベントを作成することは有用です。
function! Chibby()
" A lot of stuff is happening here.
" And at last..
doautocmd User ChibbyExit
endfunctionnow your pluginの利用者は、チビが実行を終えた際に何でも実行できます
autocmd User ChibbyExit call ChibbyCleanup()ちなみに、受け取る:autocmdがない場合、:doautocmdは「No matching autocommands」という
煩わしいメッセージを出力します。そのため、多くのプラグインは代わりにsilent doautocmd ...を使います。ただし、:autocmd内で単純に
echo "foo"を使えず、代わりにunsilent echo "foo"を使う必要があるという欠点があります。
それがなぜ、受信autocmdが実際に存在するかを確認し、それ以外ではイベントを発行しないほうが良いのか。
if exists('#User#ChibbyExit')
doautocmd User ChibbyExit
endifヘルプ: :h User
Nested autocmds
デフォルトでは、自動コマンドはネストされません!自動コマンドがコマンドを実行し、そのコマンドが通常は別のイベントをトリガーする場合、そのイベントは発生しません。
毎回Vimを起動するときに、自動的にvimrcを開くようにしたいとします
autocmd VimEnter * edit $MYVIMRCVimを今から開始すると、vimrcが開かれますが、最初に気づくのはハイライトが表示されない点です。通常はハイライトが表示されるはずですが。
問題は、あなたのネストされていないautocmd内の :edit が “BufRead” イベントをトリガーしないことであるため、ファイルタイプが “vim” に設定されず、$VIMRUNTIME/syntax/vim.vim が読み込まれないのです。詳しくは :au BufRead *.vim を参照してください。以下の方法を使用してください:
autocmd VimEnter * nested edit $MYVIMRCヘルプ: :h autocmd-nested
Clipboard
必須のfeaturesは+clipboardです。また、+xterm_clipboardは、GUIサポートのないVimでUnixシステム上の'clipboard'オプションを使う場合に必要です。
ヘルプ:
:h 'clipboard'
:h gui-clipboard
:h gui-selectionsもごらえ: Bracketed paste (or why do I have to set ‘paste’ all the time?)
Clipboard usage (Windows, macOS)
Windows には、 clipboard があり、macOS には、 pasteboard。
どちらも、ほとんどのユーザーが期待するように動作します。選択したテキストをコピーするには ctrl+c/cmd+c を使用し、別のアプリケーションに貼り付けるには ctrl+v/cmd+v を使用します。
コピーしたテキストは実際にクリップボードに転送されるため、別のアプリケーションに貼り付ける前にコピー元のアプリケーションを閉じても問題ありません。
このとき、クリップボードレジスタ * には選択された内容が入ります。Vimでは、 "*y と "*p を使用して、クリップボードから切り取りおよび貼り付けを行います。
もし、常に * レジスタを指定したいのでもないなら、この内容を
あなたの vimrc に追加してください。
set clipboard=unnamed通常、すべてのyank/delete/put操作は " レジスタを埋めます。現在、 * レジスタが同じ操作に使用されています。そのため、単に y と p が十分です。
Let me repeat: 上記のオプションを使用すると、すべてのyank/paste操作(同じVimウィンドウ内で実行された場合を含む)がクリップボードを変更します。これは必要かどうか、自分自身で判断してください。
もしも y をタイプするまでにやたらと怠いなら、以下の設定を使ってすべての視覚選択をクリップボードに送信できます。
set clipboard=unnamed,autoselect
set guioptions+=aヘルプ:
:h clipboard-unnamed
:h autoselect
:h 'go_a'Clipboard usage (Linux, BSD, …)
もしあなたのOSがXを使用しているなら、状況は少し異なる。XはX Window System Protocolを実装しており、1987年以降、その主要バージョンは11であるため、XはしばしばX11と呼ばれる。
以前、X10において、cut buffers が導入され、その仕組みはクリップボードのように動作し、コピーされたテキストが実際にXによって保持され、他のアプリケーションからアクセス可能であった。このメカニズムは現在のXにおいて依然として存在しているが、その使用は現在 deprecated されており、ほとんどのソフトウェアはもうこれを使わなくなっている。
現在、アプリケーション間でデータはselectionsによって転送される。 定義された3つの選択原子の中から、実際にはPRIMARYとCLIPBOARDの2つだけが使用されている。
選択はおよそこうなります:
Program A: <ctrl+c>
Program A: assert ownership of CLIPBOARD
Program B: <ctrl+v>
Program B: note that ownership of CLIPBOARD is hold by Program A
Program B: request data from Program A
Program A: respond to request and send data to Program B
Program B: receives data from Program A and inserts it into the window| Selection | When used? | How to paste? | How to access from Vim? |
|---|---|---|---|
| PRIMARY | Selecting text | middle-click, shift+insert | * register |
| CLIPBOARD | Selecting text and ctrl+c | ctrl+v | + register |
NOTE: 選択されたデータ(CLIPBOARDを含むものも含まず)は、Xサーバーに一切保持されません。したがって、アプリケーションが終了した際に、ctrl+cでコピーされたデータは失われます。
"*p を使用して PRIMARY 選択を貼り付け、"+y1G を使用して全体のファイルを CLIPBOARD 選択にコピーします。
もし、常にその2つのレジスタのいずれかにアクセスする場合、次を使用することを検討してください。
set clipboard^=unnamed " * register
" or
set clipboard^=unnamedplus " + register( ^= をデフォルト値の前に付加する。 :h :set^= )
これにより、すべてのyank/delete/put操作は*または+を、無名レジスター"の代わりに使います。その後は、選択したX selectionへアクセスするためにyまたはpを使えます。
ヘルプ:
:h clipboard-unnamed
:h clipboard-unnamedplusRestore cursor position when opening file
ファイルを開くと、カーソルは1行目、1列目に位置します。
幸運なことに、viminfoファイルは marks を記憶しています。 " マークには、あなたが中断したバッファ内の位置が含まれています。
autocmd BufReadPost *
\ if line("'\"") > 1 && line("'\"") <= line("$") |
\ execute "normal! g`\"" |
\ endif読む:マーク " に含まれる行番号が1行より大きく、ファイルの最後の行より大きくない場合、その行にジャンプする。
:h viminfo-'
:h `quote
:h g`Temporary files
Backup files
ファイルを保存する前に、Vimはバックアップファイルを作成する。ディスクへの書き込みが成功した場合、バックアップファイルは削除される。
:set backupでバックアップが継続されます。これは、バックアップファイルが、最新の保存直前までのオリジナルファイルと同じ内容を持つことを意味します。これは、あなたがそのような機能が役立つかどうかを判断する必要があります。
あなたは :set nobackup nowritebackup を使ってバックアップを完全に無効にできますが、今の時代にはそれが必要ないでしょう。 'writebackup' はセキュリティ機能で、保存が失敗した場合に元のファイルを失うのを防ぐようにしています。その後のバックアップファイルを保存するかどうかに関係なく、そのような場合に元のファイルを失うことを防ぎます。
Vimで大きなファイルを頻繁に編集する場合、and you probably
shouldn’t、そのファイルはバックアップから除外できます。
'backupskip'
ヴィムはバックアップを作成するための異なる方法を知っている:コピー_と_リネーム。
- Copying
- A full copy of the original file is created and used as backup.
- The original file gets emptied and then filled with the content of the Vim buffer.
- Renaming
- The original file is renamed to the backup file.
- The content of the Vim buffer gets written to a new file with the name of the original file.
すべての細かい詳細は :h 'backupcopy' を参照してください。
デモ:
:set backup backupskip= backupdir=. backupext=-backup
:e /tmp/foo
ifoo<esc>
:w
" original file gets created, no need for backup file
obar<esc>
:w
" backup file is created, original file gets updated$ diff -u /tmp/foo-backup /tmp/foo
--- /tmp/foo-backup 2017-04-22 15:05:13.000000000 +0200
+++ /tmp/foo 2017-04-22 15:05:25.000000000 +0200
@@ -1 +1,2 @@
foo
+bar:h バックアップ :h ワーク・ファイล
Swap files
ファイルを編集しているとき、保存されていない変更はスワップファイルに書き込まれます。
現在のスワップファイルの名前を :swapname で取得する。 :set noswapfile で無効にする。
スワップファイルは、200文字分すべて更新されるか、4秒間タイプがなかった場合に更新されます。編集を終了すると、これらのファイルは削除されます。これら数字は :h 'updatecount' と :h 'updatetime' で変更できます。
Vimが終了した場合(例:電源切-off)には、ファイルがディスクに書き出された最後の時点以降のすべての変更が失われますが、スワップファイルは削除されません。その後、ファイルを再度編集する場合、Vimはスワップファイルからファイルを回復する機会を提示します。
2人の人が同じファイルを編集しようとする場合、2番目の人はスワップファイルが既に存在していることを通知されます。これにより、ファイルの異なるバージョンを保存しようとする人の行動が防がれます。その動作を避けたい場合は、:h 'directory'を参照してください。
:h swap-file :h usr_11
Undo files
undo treeはメモリ上に保持され、Vimが終了すると失われます。
これを継続させるには、 :set undofileを設定してください。これにより、 ~/foo.cの取り消しファイルが ~/foo.c.un~に保存されます。
:h ‘undofile’\n :h undo-persistence
Viminfo files
バックアップ、スワップ、およびアンダーオーのファイルがすべてテキスト状態である場合、viminfoファイルはVimを終了した際に失われる他のすべての情報を保存するために使用されます。viminfoファイルはコマンドライン、検索、入力の履歴、レジスタ、マーカー、バッファリスト、グローバル変数など、すべてを保持します。
デフォルトでは、viminfoは ~/.viminfo に書き込まれる。
:h viminfo :h ‘viminfo’
Example configuration for temporary files
すべての一時ファイルを ~/.vim/files の下にある独自のディレクトリに配置してください。
" create directory if needed
if !isdirectory($HOME.'/.vim/files') && exists('*mkdir')
call mkdir($HOME.'/.vim/files')
endif
" backup files
set backup
set backupdir =$HOME/.vim/files/backup/
set backupext =-vimbackup
set backupskip =
" swap files
set directory =$HOME/.vim/files/swap//
set updatecount =100
" undo files
set undofile
set undodir =$HOME/.vim/files/undo/
" viminfo files
set viminfo ='100,n$HOME/.vim/files/info/viminfoEditing remote files
Vimには、リモートファイルの編集を可能にするnetrwプラグインが含まれています。実際に、それはscpを介してリモートファイルをローカルの一時ファイルに転送し、そのファイルを使ってバッファを開き、保存時に変更をリモートファイルに書き戻します。
ローカルの設定を使用したい場合、これは非常に便利です。SSHでサーバーに接続して、管理者が指定するものを使うのではなく、ローカルの設定を使用できるようにします。
:e scp://bram@awesome.site.com/.vimrc既に ~/.ssh/config を設定済みであれば、その設定が自動的に使用されます。
Host awesome
HostName awesome.site.com
Port 1234
User bram上記の~/.ssh/config内の内容を仮定すれば、これもまったく同様に機能する。
:e scp://awesome/.vimrc類似したことは ~/.netrc でも行えます、詳しくは :h netrw-netrc を参照してください。
:h netrw-ssh-hack と :h g:netrw_ssh_cmd をしっかり読みましょう。
別の可能性として、sshfsを使用する方法があります。 これは、FUSEを用いて、リモートファイルシステムをローカルファイルシステムにマウントする方法です。
Managing plugins
Pathogenは、プラグインを管理するための最初の一般的なツールであった。実際には、特定のディレクトリに配置されたすべての項目を含めるように runtimepath (:h 'rtp') を調整するだけである。そのプラグインリポジトリのリポジトリを自分でクローンする必要がある。
実際のプラグインマネージャーは、Vim内部からプラグインをインストールしたりアップデートしたりするためのコマンドを公開しています。
Block insert
これは、同時に複数連続した行に同じテキストを挿入する技術です。これについて詳しくは demoを参照してください。
<c-v> で視覚ブロックモードに切り替えます。その後、いくつかの行分下に移動します。
I または A を押して、テキストの入力を開始します。
最初は少し混乱するかもしれませんが、テキストは常に現在の行に入力され、現在の挿入を終えたら、その同じテキストが前の視覚選択範囲の他のすべての行に適用されます。
したがって、簡単な例は <c-v>3jItext<esc> である。
異なる長さの行がいくつかある場合に、それぞれの行の末尾に同じテキストを追加したいときは、こうします: <c-v>3j$Atext<esc>。
あるとき、現在の行の終わりの後ろにカーソルを置く必要があることがあります。デフォルトではその操作ができませんが、virtualeditオプションを設定することで可能です。
set virtualedit=allその後 $10l または 90| はラインの終了後も作業を続けます。
:h blockwise-examplesを参照してください。最初は複雑に見えますが、すぐに自然に身につきます。
もし本当に高級なものを求めたいなら、 multiple-cursorsをチェックしてみてください。
Running external programs and using filters
声明:Vimはスレッドが一つしかないため、前向きに外部プログラムを実行すると、それ以外のすべての操作がブロッキングされます。もちろん、Vimのプログラミングインターフェースの一つ、たとえばLuaを用いて、スレッドサポートを利用することはできますが、その期間中Vimプロセスは依然としてブロッキングされます。Neovimは、適切なジョブAPIを追加することでこれを解決しました。
(おそらくブラムはVimにもジョブコントロールを追加していると考えられている。非常に新しいバージョンをお持ちであれば、:helpgrep startjobを参照してください。)
:! を使用してジョブを開始します。現在の作業ディレクトリ内のファイルを一覧表示したい場合は、 :!ls を使用します。シェルで通常のようにパイプを渡すには、 | を使用します。たとえば、 :!ls -1 | sort | tail -n5 。
範囲が指定されていない場合、:!の出力はスクロール可能なウィンドウに表示されます。一方、範囲が指定された場合、これらの行はfiltered になります。これは、それらがフィルタプログラムのstdinにパイプされ、処理された後、フィルタのstdoutに置き換わることを意味します。たとえば、次の5行の先頭に数字をプレフィックスするには、次の方法を使用します。
:.,+4!nl -ba -w1 -s' '手動で範囲を指定するのは非常に負担なので、Vimはそのためにいくつかの補助機能を提供しています。範囲選択の通常の方法と同じように、視覚モードで行を選択した後、:を押すことができます。また、動きを引数として受け取るオペレーター!もあります。たとえば、!ip!sortは現在の段落の行を並び替えます。
フィルタリングに良い例として、Go programming
languageです。Goにはソースコードを適切にインデントするgofmtというフィルターがあります。そのためGo向けプラグインは:Fmtというヘルパーコマンドを提供することが多く、これは基本的に:%!gofmtを実行してファイル内の全行を整形します。
人々はしばしば :r !prog を使って、以下のプログの出力を現在の行の下に配置します。これはスクリプトの場合には問題ありませんが、即座に実行する際には、現在の行を置き換える !!ls を使うほうが、私はより簡単だと感じます。
:h filter :h :read!
Cscope
Cscopeはctagsよりも多くのことをできますが、C(およびC++およびJavaに限って)のみをサポートしています。
whereas a tags file only knows where a symbol was defined, a cscope database knows much more about your data:
- Where is this symbol defined?
- Where is this symbol used?
- What is this global symbol’s definition?
- Where did this variable get its value?
- Where is this function in the source files?
- What functions call this function?
- What functions are called by this function?
- Where does the message “out of space” come from?
- Where is this source file in the directory structure?
- What files include this header file?
1. Build the database
プロジェクトのルートにこれを行う
$ cscope -bqRこれは3つのファイルを作成します:cscope{,.in,.po}.outが現在の作業ディレクトリにあります。これらはあなたのデータベースと考えてください。
残念ながら cscope はデフォルトで *.[c|h|y|l] ファイルのみを分析します。Java プロジェクトで cscope を使う場合は、以下の手順を実行してください。
$ find . -name "*.java" > cscope.files
$ cscope -bq2. Add the database
新たに構築したデータベースに接続を開けます:
:cs add cscope.out接続が行われたことを確認してください:
:cs show(はい、複数の接続を追加できます。)
3. Query the database
:cs find <kind> <query>たとえば、:cs find d fooはfoo(...)が呼び出すすべての関数をリストする。
| Kind | Explanation |
|---|---|
| s | symbol: find all references to the token |
| g | global: find global definition(s) of the token |
| c | calls: find all calls to the function |
| t | text: find all instances of the text |
| e | egrep: egrep search for the word |
| f | file: open the filename |
| i | includes: find files that include the filename |
| d | depends: find functions called by this function |
私はいくつかの便利なマッピングを提案します。たとえば:
nnoremap <buffer> <leader>cs :cscope find s <c-r>=expand('<cword>')<cr><cr>
nnoremap <buffer> <leader>cg :cscope find g <c-r>=expand('<cword>')<cr><cr>
nnoremap <buffer> <leader>cc :cscope find c <c-r>=expand('<cword>')<cr><cr>
nnoremap <buffer> <leader>ct :cscope find t <c-r>=expand('<cword>')<cr><cr>
nnoremap <buffer> <leader>ce :cscope find e <c-r>=expand('<cword>')<cr><cr>
nnoremap <buffer> <leader>cf :cscope find f <c-r>=expand('<cfile>')<cr><cr>
nnoremap <buffer> <leader>ci :cscope find i ^<c-r>=expand('<cfile>')<cr>$<cr>
nnoremap <buffer> <leader>cd :cscope find d <c-r>=expand('<cword>')<cr><cr>したがって、 :tag(または <c-]>)がタグファイルから定義にジャンプしたとき、 :cstag は同じように動作するが、関連する cscope データベースも考慮する。オプション 'cscopetag' により、 :tag は自動的に :cstag のように動作する。すでにタグに関連するマッピングを設定している場合は、これ非常に便利である。
ヘルプ: :h cscope
MatchIt
VimはC言語で書かれており、多くの機能はC言語のような構文を前提としています。デフォルトでは、カーソルが{または#endifにある場合、%を使用して対応する}または#ifdefにジャンプできます。
Vimには、デフォルトで有効になっていないプラグイン「matchit.vim」が組み込まれています。これは、VimLなどのif/else/endif構文やHTMLタグについても、%をサイクルで通過させ、いくつかの新しいコマンドを導入します。
Installation for Vim 8
" vimrc
packadd! matchitInstallation for Vim 7 and older
" vimrc
runtime macros/matchit.vimマッチイットのドキュメンテーションが非常に詳しいため、以下の手順を一度だけ実行することを推奨します。
:!mkdir -p ~/.vim/doc
:!cp $VIMRUNTIME/macros/matchit.txt ~/.vim/doc
:helptags ~/.vim/docSmall intro
プラグインは現在使用可能になっています。サポートされているコマンドは :h matchit-intro を、サポートされている言語は :h matchit-languages を参照してください。
それならば、自分のマッチングペアを定義するのは簡単です:
autocmd FileType python let b:match_words = '\<if\>:\<elif\>:\<else\>'以降、任意のPythonファイルで%(前進)またはg%(後退)を使用して、これらの3行を順に繰り返し表示できます。
ヘルプ:
:h matchit-install
:h matchit
:h b:match_wordsTrue colors
ターミナルエミュレーターで真の色を使用するということは、RGB色に24ビットを使用できるということです。これにより、通常の256色から16777216(2^24)色になります。
前述の hereによれば、カラーチームは実際にターミナル(xterm)とGUI(gvim)それぞれに対して定義を持つことで2つのカラーチームになることができる。これは、ターミナルエミュレーターが真の色を理解する以前には意味があった。
:set termguicolors以降、Vimは真の色をサポートする终端エミュレータだけが理解できるエスケープシーケンスを送信開始します。色がおかしい場合、おそらくあなたの终端エミュレータが真の色をサポートしていないか、あるいは色のテーマにGUI用の色が定義されていない可能性があります。
多くの人が終端マルチプレクサを用いる
tmux これは基本的には終端エミュレータとVimの間に座る。Vimが発行する真の色エスケープシーケンスをtmuxが_フォワード_するには、ユーザーの
.tmux.conf に以下の内容を記述する必要がある
set-option -g default-terminal 'tmux-256color'
set-option -ga terminal-overrides ',xterm-256color:Tc'- The first line should be the same for most people and denotes the
$TERMto be used within tmux. - The second line adds the tmux-specific
Tc(true color) capability to the other terminfo entries ofxterm-256color. Obviously this assumes that the user is usingTERM=xterm-256coloroutside of tmux.
したがって、真の色を有効にするためのチェックリストは以下の通りです
- Read
:h 'termguicolors'. - Put
set termguicolorsin your vimrc. - Make sure your colorscheme has color definitions for GUIs. (It should contain
lines with
guifgandguibg.) - Make sure your terminal emulator of choice supports true colors.
- Using tmux? Configure it to add the
Tccapability.
ターミナルにおける色の参考として人気のあるもの: https://gist.github.com/XVilka/8346728
Tips
Go to other end of selected text
o と O を視覚的に選択した場合、カーソルはもう一方の端に移動します。ブロック選択で試して、その違いを確認してください。これにより、選択されたテキストのサイズを迅速に変更できます。
:h v_o
:h v_OSaner behavior of n and N
nとNの方向は、それぞれ前向きまたは後向きに検索した際に/または?が使用されたかどうかによって決まる。これは私にはかなり混乱している。
もし n が常に前向きに、 N が常に後向きに検索するようにするなら、以下の方法を使用してください。
nnoremap <expr> n 'Nn'[v:searchforward]
xnoremap <expr> n 'Nn'[v:searchforward]
onoremap <expr> n 'Nn'[v:searchforward]
nnoremap <expr> N 'nN'[v:searchforward]
xnoremap <expr> N 'nN'[v:searchforward]
onoremap <expr> N 'nN'[v:searchforward]Saner command-line history
もし君が私と似ているなら、君はそれぞれ<c-n>と<c-p>を使って次の項目と前の項目に移動していることだろう。デフォルトでは、これはコマンドラインでも機能し、履歴から以前のまたは最近のコマンドラインを呼び出すことができる。
ここまで、問題ない。しかし <up> と <down> はさらに賢い!それらは現在のコマンドラインの開始部分に一致するコマンドラインを記憶する。たとえば :echo <up> が :echo "Vim rocks!" に変更される。
もちろん、あなたが矢キーを押すようにはさせません。
cnoremap <expr> <c-n> wildmenumode() ? "\<c-n>" : "\<down>"
cnoremap <expr> <c-p> wildmenumode() ? "\<c-p>" : "\<up>"ここでは、コマンドラインの履歴とワイルドメニューを区別しています。詳しくは :h 'wildmenu' を参照してください。
私はこの行動を一日に何回も依存しています。
Saner CTRL-L
デフォルトでは、<c-l>は画面をクリアし、再描画する(:redraw!のように)。
以下のマッピングは、これと同じ動作を行うだけでなく、/、?などにより見つかったマッチをハイライトを解除し、
文法ハイライトの修正(vimが複雑なハイライトルールによりハイライトを失う場合がある)を行い、
diffモードでの文法ハイライトを強制的に更新する。
nnoremap <leader>l :nohlsearch<cr>:diffupdate<cr>:syntax sync fromstart<cr><c-l>Disable audible and visual bells
set noerrorbells
set novisualbell
set t_vb=Vim Wiki: Disable beepingを参照してください。
Quickly move current line
ときには、現在の行を上または下に移動するための簡単な方法が必要になります。
nnoremap [e :<c-u>execute 'move -1-'. v:count1<cr>
nnoremap ]e :<c-u>execute 'move +'. v:count1<cr>これらのマッピングもカウントを取りますので、2]eは現在の行を2行下に移動します。
Quickly add empty lines
nnoremap [<space> :<c-u>put! =repeat(nr2char(10), v:count1)<cr>'[
nnoremap ]<space> :<c-u>put =repeat(nr2char(10), v:count1)<cr>now 5[<space> は現在の行の上に5行の空白を挿入する。
Quickly edit your macros
これは本当の宝石です!マッピングはレジスタ(またはデフォルトで *)を取り、それをcmdlineウィンドウで開きます。編集が終了したら、 <cr> を押してください。
私はマクロを記録中にしたタイポを修正するためによくこれを使います。
nnoremap <leader>m :<c-u><c-r><c-r>='let @'. v:register .' = '. string(getreg(v:register))<cr><c-f><left>これをこう使います <leader>m または "q<leader>m。
<c-r><c-r> を使用して、<c-r> が正確に挿入されていることを確認してください。 :h c_^R^R を参照してください。
Quickly jump to header or source file
この技術は、多くのファイル形式に適用できる可能性があります。ソースまたはヘッダーファイルを離れる際に、file marks(参照 :h marks)を設定するため、 'C または 'H を使用して、最後にアクセスしたファイルに戻るのを迅速にできます(参照 :h 'A)。
autocmd BufLeave *.{c,cpp} mark C
autocmd BufLeave *.h mark HNOTE: その情報はviminfoファイルに保存されているため、:set viminfo?に:h viminfo-'が含まれていることを確認してください。
Quickly change font size in GUI
私はこれはtpopeの設定から取られたものだと思います
command! Bigger :let &guifont = substitute(&guifont, '\d\+$', '\=submatch(0)+1', '')
command! Smaller :let &guifont = substitute(&guifont, '\d\+$', '\=submatch(0)-1', '')Change cursor style dependent on mode
通常モードではブロックカーソル、挿入モードではi-beamカーソル、置換モードでは下線カーソルを使用したい。
if empty($TMUX)
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"
let &t_SR = "\<Esc>]50;CursorShape=2\x7"
else
let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
let &t_SR = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=2\x7\<Esc>\\"
endifこれは、挿入モードに入るか離れるときに、Vimに特定の文字列(escape sequence)を表示させるだけの指示です。その下にあるターミナル、またはVimとターミナルの間に位置するプログラム(tmux)は、これを処理および評価します。
しかし、一つの欠点があります: 終端エミュレータの実装方法は多く、同じ操作に対してすべてが同じシーケンスを使用しているわけではありません。上記に示したシーケンスは、あなたの実装と互換性を持たない可能性があります。あなたの実装が異なるカーソルスタイルをサポートしているかどうかも不明です。ドキュメントを確認してください。
上の例はiTerm2と動作します。
Don’t lose selection when shifting sidewards
1つ以上を選択した場合、 < と > を使用してその行を側方に移動できます。しかし、その直後に選択が失われます。
gvを使用して、最後の選択を再選択できます(詳しくは:h gvを参照してください))。そのため、次のように対処できます。
xnoremap < <gv
xnoremap > >gvnow you can use >>>>> on your visual selection without any problems.
注意:同様の結果は、.を使用して、最後の変更を繰り返すことで得られます。
Reload a file on saving
autocmdsを使用すると、ファイルを保存する際に何でもできます。たとえば、ドットファイルの場合にそのファイルをソースとして読み込み、あるいはソースコード内の文法エラーを確認するためにリントを実行できます。
autocmd BufWritePost $MYVIMRC source $MYVIMRC
autocmd BufWritePost ~/.Xdefaults call system('xrdb ~/.Xdefaults')Smarter cursorline
カーソルラインを愛していますが、現在のウィンドウだけに使うようにしたいです。挿入モードのときには使いたいとは思っていません。
autocmd InsertLeave,WinEnter * set cursorline
autocmd InsertEnter,WinLeave * set nocursorlineFaster keyword completion
キーワード補完 (<c-n>/<c-p>) は、'complete' オプションにリストされている内容を補完しようとします。デフォルトでは、タグ(これは不快である可能性がある)およびすべての含まれるファイルをスキャン(これは非常に遅い可能性がある)が含まれます。これらを必要としていない場合は、無効にします。
set complete-=i " disable scanning included files
set complete-=t " disable searching tagsCosmetic changes to colorschemes
常に、色のスケームがどれであろうと、濃いグレーのステータスラインを使用してください。
autocmd ColorScheme * highlight StatusLine ctermbg=darkgray cterm=NONE guibg=darkgray gui=NONEこれは、:colorscheme ...を使用するたびにトリガーされます。特定のカラーパレットに対してのみトリガーしたい場合:
autocmd ColorScheme desert highlight StatusLine ctermbg=darkgray cterm=NONE guibg=darkgray gui=NONEこれは :colorscheme desert に対してのみトリガーする。
Commands
役立つコマンドの例。詳しく知るには :h :<command name> を使ってください。たとえば :h :global。
:global and :vglobal
一致するすべての行に対してコマンドを実行する。たとえば、:global /regexp/ printは「regexp」を含むすべての行に対して:printを使用する。
興味深い事実:おそらく皆さんに、ケン・トーマスが書いた古くからのgrep、フィルタプログラムをご存知でしょう。grepは一体何をしますか?特定の正規表現に一致するすべての行を表示します!では、:global /regexp/ printの短い形を予想してみてください。正解です!それは:g/re/pです。ケン・トーマスはgrepを書く際に、viの:globalにインスピレーションを受けました。
名前に反して、:globalがデフォルトですべての行へ作用するだけで、範囲を指定することもできます。:deleteを、現在行から正規表現^$に一致する次の空行までのうち、「foo」を含むすべての行へ使う場合を考えます。
:,/^$/g/foo/dパターンに一致しないすべての行に対してコマンドを実行するには、
:global!またはその別名:vglobal(_inVerse_をイメージ)を使用してください。
:normal and :execute
これらのコマンドは通常、Vimスクリプトで使用されます。
:normalを使って、コマンドラインから通常モードのマッピングを実行できます。たとえば、
:normal! 4jはカーソルを4行下に移動させます(「j」に対するカスタムマッピングを使わずに、『!』の存在により)。
:normalにもrangeが渡されるため、:%norm! Iabcはすべての行の前に”abc”をプレフィックスする
:executeを使うことで、コマンドと表現を混在させることができます。Cのソースファイルを編集している場合、そのヘッダーファイルに移動したいとします。
:execute 'edit' fnamemodify(expand('%'), ':r') . '.h'両方のコマンドはよく一緒に使われます。カーソルを下に”n”行分動かしたいとします:
:let n = 4
:execute 'normal!' n . 'j':redir and execute()
多くのコマンドはメッセージを表示し、:redirはその出力をリダイレクトできます。ファイル、registersまたは変数にリダイレクトできます。
:redir => var
:reg
:redir END
:echo var
:" For fun let's also put it onto the current buffer.
:put =varVim 8 には、さらに短い方法があります。
:put =execute('reg')ヘルプ:
:h :redir
:h execute()Debugging
General tips
もし異常な動作を確認した場合は、以下の通りに再現してみてください。
vim -u NONE -Nこれはvimrcを読み込まない(したがってデフォルト設定)かつnocompatibleモードでVimを起動します(これによりVimのデフォルト設定がviのデフォルト設定に代わって使用されます)。(開始時に読み込む内容の他の組み合わせについては、:h --nopluginを参照してください。)
もし今でも再現できるなら、それはVim自体のバグである可能性が高い! vim_devのメールリストに報告してください。ほとんどの場合、この時点で問題が解決されず、さらに調査する必要があります。
プラグインは新しい、変更された、または不正な動作を導入することがあります。たとえば、保存時に問題が発生した場合、:verb au BufWritePostを確認して潜在的な原因をリストアップしてください。
プラグインマネージャーを使用している場合は、一時的にコメントアウトして、原因となるものを特定するまで。
問題はまだ解決されていませんか?プラグインではないなら、他の設定のせいです。したがって、おそらくオプションやアートコマンドなどです。
二分探索の時が来た。検索範囲を繰り返し2分割し、原因となる行を見つけるまで続ける。二分分割の性質上、多くのステップは必要ない。
実際には、こうなります。あなたのvimrcの中央に :finish コマンドを置きます。Vimはその以降のすべてをスキップします。それでも起きるなら、問題はアクティブな上半分にあります。 :finish をその上半分の中央に移動します。そうでなければ、問題は非アクティブな下半分にあります。 :finish をその下半分の中央に移動します。こうして繰り返します。
Verbosity
Vimが現在何をしているかを観察するための別の便利な方法は、verbosityレベルを上げることです。現在Vimは9つの異なるレベルをサポートしています。完全なリストは :h 'verbose' を参照してください。
:e /tmp/foo
:set verbose=2
:w
:set verbose=0これは、ソースされるすべてのファイルを表示する、たとえば、取り消しファイルまたは保存時に動作するさまざまなプラグインを含む。
もし単一のコマンドに対してのみverbosityを増やすだけなら、
:verboseもあります。これは他のどのコマンドの前にただ置かれるだけです。verbosityレベルは数値として受け取り、デフォルトは1です:
:verb set verbose
" verbose=1
:10verb set verbose
" verbose=10デフォルトのverbosityレベル1でよく使われ、オプションが最後に設定された場所を表示します
:verb set ai?
" Last set from ~/.vim/vimrc自然に、verbosityレベルが高くなるほど出力が過剰になります。しかし、気にせず、出力をファイルにリダイレクトすればよいです。
:set verbosefile=/tmp/foo | 15verbose echo "foo" | vsplit /tmp/foo開始時にもverbosityを有効にできる。-Vオプションでこれを行うことができる。デフォルトはverbosityレベル10である。例:vim -V5。
Profiling startup time
Vimの起動が遅い? 数値を分析の時です:
vim --startuptime /tmp/startup.log +q && vim /tmp/startup.log最初の列が最も重要である。なぜなら、その列は経過した絶対時間を見せるからである。もし2行の間に時間の大きなジャンプがあるならば、2行目のファイルは非常に大きなファイルであるか、または誤ったVimLコードを含むファイルであり、調査する価値がある。
Profiling at runtime
必須 feature: +profile
ヴィムは実行時におけるプロファイリングを内蔵しており、環境内の遅いコードを発見するための優れた手段です。
:profile コマンドは、プロフィールする内容を指定するための複数のサブコマンドを取る。
もしすべてをプロファイリングしたいなら、こうする。
:プロファイル開始 /tmp/profile.log
:プロファイルファイル *
:プロファイル関数 *
Vimはプロファイリング情報をメモリに保持し、終了時にのみログファイルに書き出します。(Neovimはこれに:profile dumpを使用して修正しています。)
/tmp/profile.log を見てください。プロファイリング中に実行されたすべてのコードが表示されます。各行について、実行回数とその際の所要時間も示されます。
ログの下端に移動してください。ここには2つの異なるセクション FUNCTIONS SORTED ON TOTAL TIME と FUNCTIONS SORTED ON SELF TIME があり、それらは金価値を持っています。一瞥のうちに、どの関数が最も時間がかかるかがわかります。
スタートアップ時に:profileを使用できます。
$ vim —cmd ‘prof start prof.log | prof file * | prof func *’ test.c :q $ tail -50 prof.log
Debugging Vim scripts
以前、コマンドラインデバッガーを使っていたことがあるなら、:debugはすぐに馴染みやすいでしょう。
任意の他のコマンドの前に :debug をプレフィックスに加えれば、デバッグモードに入ります。
すなわち、実行が最初に実行される行に停止し、その行が表示されます。
:h >cont および以下に、利用可能なデバッガーコマンドの6つを示し、gdbや類似のデバッガーや同様に、短縮形を使用することも可能です: c, q, n, s, i, および f.
それ以外については、任意のVimコマンドを使用できます。たとえば :echo myvar などです。これは、現在のコード位置のコンテキスト内で実行されます。
あなたは基本的に、ただ :debug 1 を使って、 REPL を得ます。
1行ずつすべてをステップ実行しなければならなくなるのは大変なので、もちろんブレークポイントも定義できます。 (ブレークポイントとは、その地点に到達したときに実行が停止するため、関心のないコードをスキップできるのです。) 詳細については :h :breakadd、:h :breakdel、および :h :breaklist をご参照ください。
ファイルを保存するたびに実行されるコードを知りたいとします
:au BufWritePost
" signify BufWritePost
" * call sy#start()
:breakadd func *start
:w
" Breakpoint in "sy#start" line 1
" Entering Debug mode. Type "cont" to continue.
" function sy#start
" line 1: if g:signify_locked
>s
" function sy#start
" line 3: endif
>
" function sy#start
" line 5: let sy_path = resolve(expand('%:p'))
>q
:breakdel *ご覧の通り、<cr>を使用すると、前のデバッガーコマンドが繰り返されます。この場合のsです。
:debugは、verboseのオプションと組み合わせて使用できます。
Debugging syntax files
構文ファイルは、誤ったおよび/または複雑な正規表現によって引き起こされる遅延の原因となることが多い。 +profile feature がコンパイルされている場合、Vimは非常に便利な :syntime コマンドを提供する。
:syntime on
" hit <c-l> a few times to redraw the window which causes the syntax rules to get applied again
:syntime off
:syntime report出力には重要なメトリクスが含まれています。たとえば、どのregexpが長時間かかるかを確認し、最適化すべきか、あるいはどのregexpが頻繁に使われているかを確認できますが、実際に一致することさえありません。
:h :syntimeを参照してください。
Miscellaneous
Additional resources
| Resource | Description |
|---|---|
| Seven habits of effective text editing | By Bram Moolenaar, the author of Vim. |
| Seven habits of effective text editing 2.0 (PDF) | See above. |
| IBM DeveloperWorks: Scripting the Vim editor | Five-part series on Vim scripting. |
| Learn Vimscript the Hard Way | Develop a Vim plugin from scratch. |
| Practical Vim (2nd Edition) | Hands down the best book about Vim. |
| Why, oh WHY, do those #?@! nutheads use vi? | Common misconceptions explained. |
| Your problem with Vim is that you don’t grok vi | Concise, informative and correct. A real gem. |
Screencasts
Vim distributions
Vimの配布版は、Vim向けのカスタム設定とプラグインのバンドルである。
より高度なユーザーは、編集器を設定する方法をすでに知っているため、ディストリビューションは主に初心者を対象としています。しかし、その点を考えてみると、学ばなければならない内容をさらに増やして易しくするというのは、非常に矛盾しているのです。
私は多くの人が、エディタをカスタマイズするのに数時間、数時間と時間を費やすことを望まないことを知っています(実際に、vimrcをしっかり使い始めると、その使い方を常にカスタマイズしていくことになります)。しかし、最終的にVimで効率的に作業できるようになるのは、ちゃんとそれを学ぶ時間を取るときです。
私に合わせて繰り返してください:『プログラマーは自分のツールを理解すべきである。』
とにかく、自分が何をやっているかわかっているなら、いくつかの分布を見てみることで、いくつかのインスピレーションを得られるかもしれません。
Standard plugins
多くの人が、Vimが標準でいくつかのプラグインを提供していることに驚きます。一部はデフォルトで読み込まれます(:e $VIMRUNTIME/plugin)而、一部は読み込まれません(:e $VIMRUNTIME/pack/dist/opt)。後者の読み込み方法については、:h pack-addを参照してください。
ただし、デフォルトで読み込まれるプラグインの多くは実際には使われません。必要に応じて
無効化してください。:scriptnamesでは読み込み済みと表示されますが、Vimが処理を
打ち切る前に先頭数行だけが読まれ、以降のコード(マッピング、コマンド、ロジック)は
処理されません。
| Plugin | Disable it using.. | Help |
|---|---|---|
| 2html | let g:loaded_2html_plugin = 1 | :h 2html |
| getscript | let g:loaded_getscriptPlugin = 1 | :h pi_getscript |
| gzip | let g:loaded_gzip = 1 | :h pi_gzip |
| logipat | let g:loaded_logipat = 1 | :h pi_logipat |
| matchparen | let g:loaded_matchparen = 1 | :h pi_paren |
| netrw | let g:loaded_netrwPlugin = 1 | :h pi_netrw |
| rrhelper | let g:loaded_rrhelper = 1 | :e $VIMRUNTIME/plugin/rrhelper.vim |
| spellfile | let g:loaded_spellfile_plugin = 1 | :h spellfile.vim |
| tar | let g:loaded_tarPlugin = 1 | :h pi_tar |
| vimball | let g:loaded_vimballPlugin = 1 | :h pi_vimball |
| zip | let g:loaded_zipPlugin = 1 | :h pi_zip |
Map CapsLock to Control
CapsLockはキーボード上での最も無意味なキーの一つですが、コントロールキーよりも簡単に達成できます。なぜなら、それはあなたの home rowにあるからです。CapsLockをコントロールにマッピングすることは、プログラムを多く行う場合に、あるいは少なくとも減少させるために、非常に良い方法です。RSI
注意:慣れたら、もう生きていけなくなります。
macOS:
System Preferences -> Keyboard -> Keyboard Tab -> Modifier Keys. “CapsLock” を “Control” に変更
Linux:
Xのキーを変更するには、あなたの~/.xmodmapにこれを入れてください。
ロックの解除 = キャップスロック キー記号 キャップスロック = コントロール_L コントロールの追加 = コントロール_L
以降、 $ xmodmap ~/.xmodmap を経由してソースを取得してください。
別の選択肢として、caps2escまたは xcapeを使用する場合がある。
Windows:
superuser.com: Map Caps-Lock to Control in Windows 8.1を参照してください。
Generating HTML from buffer
任意のバッファから2html standard
pluginの:TOhtmlを使用してHTMLを生成する。出力は印刷または簡単なウェブ公開に使用できる。
コマンドは、.htmlを付加した同じ名前の新しいバッファを作成する。色はVimで表示されるものと同じである。これらはcolorschemeに依存する。
プラグインは出力を調整するためのいくつかのオプションを知っている。たとえば、エンコーディングやフォントの設定など。
:h :TOhtmlを参照してください。
Easter eggs
| Command | Message |
|---|---|
:Ni! | Do you demand a shrubbery? |
:h 'sm' | NOTE: Use of the short form is rated PG. |
:h 42 | What is the meaning of life, the universe and everything? Douglas Adams, the only person who knew what this question really was about is now dead, unfortunately. So now you might wonder what the meaning of death is... |
:h UserGettingBored | When the user presses the same key 42 times. Just kidding! :-) |
:h bar | Ceci n'est pas une pipe. |
:h holy-grail | You found it, Arthur! |
:h map-modes | :nunmap can also be used outside of a monastery. |
:help! | E478: Don't panic! (Glitch? When used in a help buffer (buftype=help) this works like :h help.txt instead.) |
:smile | Try it out yourself. ;-) Added in 7.4.1005. |
:hi! | Greetings, Vim user! |
Why hjkl for navigation?
Bill Joyがvi、Vimの前身を作ったとき、それはADM-3Aで行われたもので、そのキーボードには追加のカーソルボタンがなく、あなたがすでに気づいた通り、hjklを使用していた。
キーボードの配置: click
これは、Unixシステムでホームディレクトリを表すために ~が使われる理由を示している。
Common problems
Editing small files is slow
パフォーマンスに大きな影響を与えることは、二つある。
- Complex regular expressions. Particular the Ruby syntax file caused people to have slowdowns in the past. (Also see Debugging syntax files.)
- Screen redraws. Some features force all lines to redraw.
| Typical culprit | Why? | Solution? |
|---|---|---|
:set cursorline | Causes all lines to redraw. | :set nocursorline |
:set cursorcolumn | Causes all lines to redraw. | :set nocursorcolumn |
:set relativenumber | Causes all lines to redraw. | :set norelativenumber |
:set foldmethod=syntax | If the syntax file is slow already, this makes it even worse. | :set foldmethod=manual, :set foldmethod=marker or FastFold |
:set synmaxcol=3000 | Due to internal representation, Vim has problems with long lines in general. Highlights columns till column 3000. | :set synmaxcol=200 |
| matchparen.vim | Loaded by default. Uses regular expressions to find the accompanying parenthesis. | Disable plugin: :h matchparen |
NOTE: 実際のパフォーマンスの低下を経験した場合に限り、これを行う必要があります。ほとんどの場合、上記の内容を使用することはまったく問題ありません。
Editing huge files is slow
大きなファイルの大きな問題は、Vimがファイル全体を一度に読み込むことである。これは、バッファが内部でどのように表現されているためである。 (Discussion on vim_dev@)
もしただ読むだけなら、tail hugefile | vim -は良い代替案です。
もし現在、文法や設定やプラグインを一切使わずに生活できるなら:
$ vim -u NONE -Nこれはナビゲーションをかなり速くするはずです。特に、構文ハイライトのために高価な正規表現を使用していないためです。また、書き出し時に長時間の遅延を避けるために、Vimがスワップファイルやviminfoファイルを使用しないように設定してください。
$ vim -n -u NONE -i NONE -N簡潔に言うと、本当に大きなファイルを書く予定なら、Vimを使うのを避けよう。:\
Bracketed paste (or why do I have to set ‘paste’ all the time?)
ブラケット付きペーストモードは、终端エミュレータが入力されたテキストとペーストされたテキストを区別できるようにする。
vimにコードを貼り付けたことがある?その後、すべてがおかしくなったことがありますか?
これは、cmd+v、shift-insert、middle-clickなどを使って貼り付けした場合にのみ起こります。
その理由は、そのときあなたはただテキストをターミナルエミュレーターに投げているからです。Vimは、あなたがテキストを貼り付けたことを知りません。Vimは、あなたが非常に速いタイピストであると誤解しています。
したがって、Vimは行をインデントしようと試みますが、失敗します。
明らかに、Vimのレジスタを使って貼り付けを行う場合、たとえば "+p であれば、これは問題ではありません。なぜならそのときVimは実際に貼り付けを行っていることを知っているからです。
これを回避するには、あなたは :set paste しなければなりませんので、そのまま貼り付けられます。 :h 'paste' と :h 'pastetoggle' を参照してください。
'paste' を何度も切り替えるのが面倒なら、これを使ってくれる素晴らしいプラグインをチェックしてください:
bracketed-paste。
同じ著者からの追加読書(プラグインに伴う): here.
Neovim: Neovimは、こうしたすべての操作をはるかにスムーズにし、ターミナルエミュレーターがそれをサポートしている場合、自動的にブレケットペーストモードを設定します。
Delays when using escape key in terminal
コマンドラインで生活しているなら、おそらくxterm、gnome-terminal、iTerm2などという所謂_terminal エミュレーターを使用しているでしょう。(実際のterminalとは対照的です。)
彼らの祖先たちと同じように、終端エミュレータは、カーソルの移動や文字色の変更など、さまざまな操作を制御するために、escape
sequences(または_コントロールシーケンス_)を使用する。これらは、エスケープ文字で始まるASCII文字の連続体(caret notationでは^[として表示される)である。このような文字列が到着したとき、終端エミュレータは、それに伴う操作をterminfoデータベースに検索する。
問題を明確にするために、まずマッピングタイムアウトについて説明します。それらは、マッピング間の曖昧性があるときに常に起こります:
:nnoremap ,a :echo 'foo'<cr>
:nnoremap ,ab :echo 'bar'<cr>両方のマッピングが予想通りに動作しますが、,aを入力するときには1秒の遅延が発生します。これはVimがユーザーが別のbを入力したかどうかを確認しているためです。
エスケープシーケンスも同様の問題を抱えている。
<esc>is used a lot for returning to normal mode or quitting an action.- Cursor keys are encoded using escape sequences.
- Vim expects Alt (also called Meta key) to send a proper 8-bit encoding with the high bit set, but many terminal emulators don’t support it (or don’t enable it by default) and send an escape sequence instead.
上の内容をこうしてテストできます: vim -u NONE -N に i<c-v><left> を入力し、
すると、 ^[ から始まるシーケンスが挿入され、これはエスケープ文字を表しています。
要するにVimは、入力された<esc>文字と正規のエスケープシーケンスを区別するのが
苦手です。
デフォルトでは、Vimは:set timeout timeoutlen=1000を使用しているため、マッピングの曖昧性およびキーコードの曖昧性に対して1秒の遅延を適用しています。これはマッピングに適した値ですが、キーコードのタイムアウトを個別に定義することで、この問題に対する最も一般的な解決策になります。
set timeout " for mappings
set timeoutlen=1000 " default value
set ttimeout " for key codes
set ttimeoutlen=10 " unnoticeable small value:h ttimeoutに示されている小さな表は、これらのオプションの関係性を示しています。
Vimとあなたのターミナルエミュレーターの間でtmuxを使用している場合は、これもあなたの ~/.tmux.confに追加してください。
set -sg escape-time 0Function search undo
- A search pattern in a command (
/,:substitute, …) changes the “last used search pattern”. (It’s saved in the/register; print it with:echo @/). - A simple text change can be redone with
.. (It’s saved in the.register; print it with:echo @.).
どちらのことが_ない_場合、関数から実行したときです!したがって、関数から選ばれた単語を強調したり、その関数が行ったテキストの変更を再実行したりすることは、簡単にできません。
ヘルプ: :h function-search-undo
Technical quirks
Newline used for NUL
ファイル内のNUL文字(\0)は、メモリ上では改行(\n)として保存され、
バッファーでは^@と表示されます。
man 7 ascii および :h NL-used-for-Nul を参照してください。
Terminology
Vim script? Vimscript? VimL?
Vim script, Vimscript, および VimL はすべて同じものを指しています:Vim用のスクリプト言語。 8.0.360 がすべての参照を VimL から Vim script に変更したにもかかわらず、現在は が公式な用語とみなされますが、 VimL はインターネットのあらゆる場所で広く使われています。
どの用語を使うにせよ、誰もがそれを理解するだろう。