Vimで最も生産的なショートカットは何ですか?


1126

Vimについては、賛否両論あります。他のエディタよりもVimの方が(開発者として)速くなければならないようです。Vimを使用していくつかの基本的なことを行っていますが、Vimを使用すると生産性が最大で10倍低下します。

速度について話すときに注意する必要があるのは、次の2つだけです(速度については十分ではないかもしれませんが、注意してください)。

  1. キーボードを使用する最も速い方法は、左手と右手を交互に使用することです。
  2. マウスに触れないことは、できるだけ速くする2番目の方法です。手を動かして、マウスをつかんで動かして、キーボードに戻すには、何年もかかります(また、キーボードを見て、正しい場所に手を正しく戻したかどうかを確認する必要があります)。

Vimを使用すると生産性が大幅に低下する理由を示す2つの例を次に示します。

コピー/カット&ペースト。私はいつもそれをしています。すべての最新のエディターShift では、左手で押し、カーソルを右手で動かしてテキストを選択します。そして、Ctrl+ Cコピーは、あなたがカーソルと移動Ctrl+ Vペースト。

Vimではひどいです。

  • yy 1行をコピーする(行全体が必要になることはほとんどありません!)
  • [number xx]yyxx行をバッファにコピーします。しかし、必要なものを選択したかどうかは正確にはわかりません。元に戻すには[number xx]dd、頻繁に行う必要がありますu

もう一つの例?検索と置換。

  • PSPADCtrl+ fを押し、その後、あなたはあなたが検索したい内容を入力Enter
  • Vim:で/、検索するものを入力し、特殊文字の\前に特殊文字が置かれている場合は、を押します。Enter

そして、Vimのすべてはそのようなものです。正しい方法で処理する方法がわからないようです。

注意:私はすでにVimのチート シートを読みました :)

私の質問は:

Vimをどのように使用すれば、現代のエディターよりも生産性が向上しますか?


「キーボードを使用するには、左手と右手を交互に使用するのが最も速い方法です。」不思議なことに、私にはありません。片手で単語を入力できるときは、はるかに速くなります。
Ben Mordecai

回答:


2860

Vimの問題は、viを理解しないことです。

あなたは切断について言及しyy、行全体を切断することはほとんどありませんと不平を言います。実際、ソースコードを編集するプログラマーは、行全体、行の範囲、およびコードのブロックで作業することを望むことがよくあります。ただし、yyテキストを匿名コピーバッファーにヤンクする(またはviで呼び出される「登録」)ための多くの方法の1つにすぎません。

viの「禅」とは、言語を話しているということです。イニシャルyは動詞です。ステートメントyyはの同義語ですy_yそれは、このような一般的な操作であることから、それが簡単に入力できるようにすることまで倍増しています。

これは、dd P(現在の行を削除してコピーを所定の場所に貼り付け、副作用としてコピーを匿名レジスタに残す)としても表現できます。yそしてd「動詞」自分として任意の動きを取る「対象。」したがってyW、「ここ(カーソル)から現在/次の(大きな)単語の終わりまでy'aヤンク」であり、「ここから、 ' a ' という名前のマークを含む行までヤンクします。」

基本的な上、下、左、右のカーソルの動きだけを理解している場合、viは「ノートパッド」のコピーよりも生産性が高くありません。(それでも、構文の強調表示と、約45KB程度の大きなファイルを処理する機能はありますが、ここで私と一緒に作業してください)。

viには26の「マーク」と26の「レジスタ」があります。mコマンドを使用して、任意のカーソル位置にマークが設定されます。各マークは、1つの小文字で指定されます。したがってma、 ' a 'マークを現在の場所にmz設定し、 ' z 'マークを設定します。'(一重引用符)コマンドを使用して、マークを含む行に移動できます。したがって'a、 ' a 'マークを含む行の先頭に移動します。`(逆引用符)コマンドを使用して、マークの正確な位置に移動できます。したがって`z、 ' z 'マークの正確な位置に直接移動します。

これらは「動き」なので、他の「ステートメント」の主題としても使用できます。

したがって、テキストの任意の選択を切り取る1つの方法は、マークをドロップすることです(通常、「a」を「最初の」マークとして、「z」を次のマークとして、「b」を別のマークとして、「e」をさらにもう1つ(viを使用してから15年間で、4つ以上のマークをインタラクティブに使用したことを覚えていない。マークとレジスターがマクロによってどのように使用されるかについて、独自の規則を作成し、インタラクティブなコンテキストを妨げないようにする)。次に、目的のテキストの反対側に移動します。どちらから始めてもかまいません。その後、単純d`aにカットまたはy`aコピーに使用できます。したがって、プロセス全体で5つのキーストロークのオーバーヘッドがあります(「挿入」で開始した場合は6つ) 」モードとする必要がEscコマンドモードを出力します)。切り取りまたはコピーしたら、コピーの貼り付けは1回のキーストロークですp

これはテキストをカットまたはコピーするための1つの方法であると私は言います。しかし、それは多くの1つにすぎません。多くの場合、カーソルを移動してマークをドロップしなくても、テキストの範囲をより簡潔に説明できます。たとえば、私が使用することができ、テキストの段落にいる場合{}、それぞれの段落の最初か最後まで動き。したがって、テキストの段落を移動するには、{ d}(3つのキーストローク)を使用してテキストを切り取ります。(私がすでに段落の最初または最後の行にいる場合は、単にd}またはをd{それぞれ使用できます。

「段落」の概念は、通常は直感的に合理的なものにデフォルト設定されます。したがって、散文だけでなくコードでも機能します。

関心のあるテキストの一方の端またはもう一方の端をマークするパターン(正規表現)をよく知っています。前方または後方の検索は、viの動きです。したがって、これらは「ステートメント」の「サブジェクト」としても使用できます。したがってd/foo、現在の行から文字列「foo」を含む次の行に切り取り、現在の行からy?bar「bar」を含む最新の(前の)行にコピーするために使用できます。行全体が不要な場合でも、検索動作を(独自のステートメントとして)使用し、マークをドロップして`x、前述のコマンドを使用できます。

「動詞」と「主語」に加えて、viは「オブジェクト」も持っています(文法的には)。これまでは、匿名レジスタの使用についてのみ説明してきました。ただし、「オブジェクト」参照の前に(二重引用符修飾子)を付けることにより、26個の「名前付き」レジスタのいずれかを使用できます"。したがって、使用する場合"add、現在の行を ' a 'レジスタにカットし、使用する場合"by/foo、ここから「foo」を含む次の行のテキストのコピーを ' b 'レジスタにヤンクします。レジスタから貼り付けるには、貼り付けの前に同じ修飾子シーケンスを付けるだけです:"ap' a 'レジスタのコピーを貼り付けます"bP' b 'から現在の行の前までのコピーを貼り付けます。

この「接頭辞」の概念は、文法上の「形容詞」と「副詞」の類似物をテキスト操作の「言語」に追加します。ほとんどのコマンド(動詞)と動き(動詞またはオブジェクト、コンテキストによって異なります)も数値の接頭辞を取ることができます。3J「次の3行を結合する」をd5}意味し、「現在の行から5番目の段落の終わりまでここから削除する」を意味します。

これはすべて中間レベルのviです。それはVim固有のものではなく、習得する準備ができていれば、viにははるかに高度なトリックがあります。これらの中間概念のみを習得した場合、テキスト操作言語は十分に簡潔で表現力があり、エディターの「ネイティブ」言語を使用してほとんどのことを簡単に実行できるため、マクロを記述する必要はほとんどありません。


より高度なトリックのサンプル:

多数の:コマンドがあり、特に:% s/foo/bar/gグローバル置換テクニックがあります。(それは高度ではありませんが、他の:コマンドは可能です)。:コマンドの全セットは、歴史的にed(ラインエディタ)および後にex(拡張ラインエディタ)ユーティリティとしてviの以前の化身に継承されました。実際、viexへのビジュアルインターフェースであるため、このように呼ばれています。

:コマンドは通常、テキスト行に対して機能します。 edexは、端末画面が一般的ではなく、多くの端末が「テレタイプ」(TTY)デバイスであった時代に書かれました。したがって、非常に簡潔なインターフェースを介してコマンドを使用して、テキストの印刷されたコピーから作業するのが一般的でした(一般的な接続速度は110ボー、またはおよそ11秒あたり11文字で、これは高速タイピストよりも遅く、遅延は一般的でした)マルチユーザーのインタラクティブセッション。さらに、紙を節約する動機がしばしばありました)。

そのため、ほとんどの:コマンドの構文には、アドレスまたはアドレス範囲(行番号)とそれに続くコマンドが含まれています。当然一方がリテラル行番号を使用することができます。:127,215 s/foo/barまた、などのいくつかの略語を使用することができる一方127との間及び215の各ライン上の「BAR」に「FOO」の最初の発生を変更する.か、$それぞれ現在の行と最後の行のため。また、相対接頭辞+を使用して-、現在の行の後または前のオフセットをそれぞれ参照することもできます。したがって:.,$j、「現在の行から最後の行まで、すべてを1つの行に結合する」という意味です。 (すべての行):%と同義:1,$です。

:... gそして:... vコマンドは、彼らが信じられないほど強力であるとして、いくつかの説明を負担します。 :... gパターン(正規表現)に一致するすべての行に後続のコマンドを「グローバルに」適用する接頭辞ですが:... v、指定されたパターン(「conVerse」の「v」)に一致しないすべての行にそのようなコマンドを適用します。他のexコマンドと同様に、これらはアドレス指定/範囲参照によってプレフィックスを付けることができます。したがって:.,+21g/foo/d、「現在の行から次の21行までの文字列 "foo"を含む行をすべて削除:.,$v/bar/dする」、「ここからファイルの終わりまで、文字列 "bar"を含まない行を削除する」を意味します。

興味深いのは、一般的なUnixコマンドのgrepが実際にこのexコマンドから発想を得た(そして、ドキュメント化された方法にちなんで名前が付けられている)ことです。元のコマンド:g/re/p(grepが)彼らは「グローバル」「正規表現」(再)「を含む行を」印刷する方法を文書化の方法でした。ときEDEXを使用して、:pコマンドは、誰もが学習し、任意のファイルを編集する際に、多くの場合、最初の1が使用した最初の一つでした。現在のコンテンツを印刷する方法でした(通常、一度に1ページだけを使用:.,+25pするなど)。

なお、:% g/.../dまたは(その逆/ CONVERSEの対応::% v/.../d最も一般的な使用パターンであるしかし他のいくつかあります。ex価値が覚えているコマンド:

を使用mして、線を移動したり、線jを結合したりできます。たとえば、リストがあり、それらを削除せずに一致するものすべて(または逆に一部のパターンに一致しないもの)を分離する場合は、次のようなものを使用できます:% g/foo/m$。...そしてすべての "foo"行は次の場所に移動されます。ファイルの終わり。(ファイルの最後をスクラッチスペースとして使用することに関する他のヒントに注意してください)。これにより、残りのリストから抽出されている間、すべての「foo」行の相対順序が保持されます。(これは次のようなことと同じです:(1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/dファイルを独自の末尾にコピーし、末尾をでフィルタリングしてgrep、ヘッドからすべてのものを削除します)。

行を結合するには、通常、前の行に結合する必要のあるすべての行のパターンを見つけることができます(たとえば、箇条書きリストで "^ *"ではなく "^"で始まるすべての行)。その場合、私は次のように使用します:% g/^ /-1j(一致するすべての行について、1行上に移動してそれらを結合します)。(ところで、箇条書きの行を検索して次の行に結合しようとする箇条書きリストは、いくつかの理由で機能しません... 1つの行を別の行に結合することができ、すべての行にすべての行を結合することはできません。その継続、それはマッチでペアでのみ機能します)。

言うまでもないことですが、古いs(フレンド)コマンドgv(global / converse-global)コマンドで使用できます。通常、これを行う必要はありません。ただし、他のパターンに一致する行のみを置換したい場合を考えてください。多くの場合、キャプチャで複雑なパターンを使用し、後方参照を使用して、変更したくない行の部分を保持できます。ただし、多くの場合、一致を置換から分離する方が簡単です。:% g/foo/s/bar/zzz/g「foo」を含むすべての行で、すべての「bar」を「zzz」に置き換えます。(何かのようなもの:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g同じ行で "foo"によってPRECEDEDされた "bar"のインスタンスの場合にのみ機能します。それはすでに十分に手に負えず、 "bar"が "foo"に先行するすべてのケースをキャッチするためにさらにマングルする必要があります)

重要なのは、コマンドセットには、、、および行だけpsはありません。dex

:アドレスはまた、マークを参照することができます。したがって、あなたは使用することができます。:'a,'bg/foo/jその次の行に文字列fooのを含む任意の行を結合するために、それは「の間の線の間にある場合」と「B」マーク。(はい、前述のコマンド例はすべて、このような種類のアドレス指定式をプレフィックスとして付けることにより、ファイルの行のサブセットに制限できます)。ex

これはかなりあいまいです(このようなものを過去15年間で数回しか使用していません)。しかし、私は時間をかけて正しい呪文を考えていればおそらくもっと効率的にできたであろうことを反復的かつ対話的にしばしば行ってきたことを自由に認めます。

別の非常に便利なviまたはexコマンドは:r、別のファイルの内容を読み込むことです。したがって:r foo、現在の行に「foo」という名前のファイルの内容を挿入します。

より強力なのは:r!コマンドです。コマンドの結果を読み取ります。これは、viセッションを一時停止し、コマンドを実行し、その出力を一時ファイルにリダイレクトし、viセッションを再開し、tempからコンテンツを読み込むのと同じです。ファイル。

さらに強力なのは(bang)コマンド!:... !ex bang)コマンドです。これらは外部コマンドを実行し、結果を現在のテキストに読み込みます。ただし、コマンドを使用して、選択したテキストをフィルター処理します。これにより、ファイル内のすべての行を並べ替えることができます1G!Gsort(これGviの「goto」コマンドです。デフォルトではファイルの最後の行に移動しますが、先頭に1などの行番号を付けることができます)。これはexバリアントと同等:1,$!sortです。ライター!は、Unixのfmtまたはfoldユーティリティを使用して、テキストの選択を再構成または「ワードラップ」します。非常に一般的なマクロは{!}fmt(現在の段落を再フォーマットします)。プログラマーは、インデントやその他のコード再フォーマットツールを使用して、コードを実行したり、コードの一部だけを実行したりすることがあります。

:r!および!コマンドを使用すると、外部ユーティリティまたはフィルターをエディターの拡張機能として扱うことができます。データベースからデータをプルするスクリプト、またはWebサイトからデータをプルするwgetまたはlynxコマンド、またはリモートシステムからデータをプルするsshコマンドでこれらを時々使用しました。

別の便利なexコマンドは:so(の略:source)です。これは、ファイルの内容を一連のコマンドとして読み取ります。viを通常の方法で開始すると、暗黙的に:sourceオン~/.exinitrcファイルが実行されます(そして、Vimは通常これを~/.vimrcで実行しますが、当然のことながら十分です)。これを使用すると、新しいマクロ、略語、およびエディター設定のセットを単に調達することで、その場でエディタープロファイルを変更できます。卑劣な場合は、これをオンデマンドでファイルに適用するex編集コマンドのシーケンスを格納するためのトリックとして使用することもできます。

たとえば、wcを介してファイルを実行する7行のファイル(36文字)があり、そのワードカウントデータを含むファイルの上部にCスタイルのコメントを挿入します。次のようなコマンドを使用して、その「マクロ」をファイルに適用できます。vim +'so mymacro.ex' ./mytarget

(通常+viおよびVimのコマンドラインオプションは、特定の行番号で編集セッションを開始するために使用されます。ただし、「ソース」コマンドなどの+有効なexコマンド/式をここでは、簡単な例として、次のようなスクリプトをvi +'/foo/d|wq!' ~/.ssh/known_hosts実行しています:サーバーのセットを再イメージングしているときに、SSHの既知のホストファイルからエントリを非対話的に削除します)。

通常、Perl、AWK、sed(実際には、edコマンドに触発されたgrepユーティリティのようなもの)を使用して、このような「マクロ」を書く方がはるかに簡単です。

@コマンドは、おそらく最もはっきりしないのviコマンド。高度なシステム管理コースを10年近く教えることもあるので、これを使ったことがある人はほとんどいません。 @レジスタの内容をviまたはexコマンドであるかのように実行します。
例:私がよく使用するの:r!locate ...は、システム上のファイルを見つけて、その名前をドキュメントに読み込むためです。そこから不要なヒットを削除し、関心のあるファイルへの完全なパスのみを残します。Tabパスの各コンポーネントを手間をかけずに(または、タブ補完のサポートのないマシンでスタックしている場合)そのviのコピーで)私はちょうど使用します:

  1. 0i:r(現在の行を有効な:rコマンドにするには)、
  2. "cdd (「c」レジスタへの行を削除するため)および
  3. @c そのコマンドを実行します。

それはたったの10回のキーストロークです(そして、式"cdd @cは事実上私にとって指マクロなので、一般的な6文字の単語と同じくらい迅速に入力できます)。


地味な考え

私はviのパワーのほんの一部にすぎませんでした。ここで説明したことは、vimが命名された「改善」の一部でさえありません!ここで説明したことはすべて、20年または30年前のviの古いコピーで機能するはずです。

今まで以上にviのパワーを使った人がいます。


440
聖なる猿をコード化する、それが一つの詳細な答えです。すばらしいのは、おそらくvimで約10回のキーストロークで書き込んだことです。
EightyOne Unite

48
@Wahnfieden - GROKは、私が意味を正確に何である:en.wikipedia.org/wiki/Grokは(それは---でも、OEDに明らかに我々は標準的な用語集を持ってanglophones最も近いです)。エディタを「グロッ」とは、コマンドを流暢に使用している...まるで自然言語であるかのように自分自身を見つけることです。
ジム・デニス

22
うわー、非常によく書かれた答え!私はこれ以上同意できませんでしたが、@コマンドをq
頻繁に

63
本当に恐ろしい質問を完全に償う優れた答え。私はこの質問に賛成票を投じますが、通常は反対票を投じるので、この答えを見つけやすくなります。(そして私はEmacsの人です!しかし、この方法で、viパワーユーザーがviについて何を楽しもうとするかについての良い説明を求めている新しい人々をどこかに指摘することができます。
ブランドンロードス

8
あなたはウェブサイトを作ってこのチュートリアルをそこに置くことができますか?それで、ここでstackoverflowに埋められません。私はこれよりもviのより良い紹介をまだ読んでいません。
マルコ

504

あなたはテキストの選択とコピーについて話しているのですが、Vim Visual Modeを見てみるべきだと思います

ビジュアルモードでは、Vimコマンドを使用してテキストを選択できます。その後、選択したもので何でもできます。

次の一般的なシナリオを検討してください。

次に一致する括弧を選択する必要があります。

あなたはできる:

  • v% カーソルが開始/終了括弧の上にある場合
  • vib カーソルが括弧ブロック内にある場合

引用符で囲まれたテキストを選択します。

  • 二重引用符は「vi」
  • 単一引用符の場合はvi '

中かっこブロックを選択したい場合(Cスタイルの言語では非常に一般的):

  • viB
  • vi{

ファイル全体を選択します。

  • ggVG

ビジュアルブロック選択は、別の本当に便利な機能である、それはあなたがテキストの矩形領域を選択することができます、あなただけのプレスに持っているCtrl- V削除、それを起動し、あなたがしたいテキストブロックを選択して、このようなヤンクなどの操作のいずれかのタイプを実行するために、貼り付け、編集など。列指向のテキストを編集するのは素晴らしいことです。


2
すべてのエディターはこのようなものを持っています、それはvimに固有ではありません。
finnw 2009

22
はい、しかしそれはポスターの特定の不満でした。ビジュアルモードは、Vimが直接テキストを選択して操作するための最良の方法です。そして、vimのバッファートラバーサルメソッドは優れているため、vimでのテキスト選択はかなり楽しいものです。
銃は

9
ブロックを選択するためにCtrl-Vに言及することも価値があると思います-つまり、テキストの任意の長方形です。あなたがそれを必要とするとき、それは命の恩人です。
Hamish Downer 2010年

6
@viksit:Camtasiaを使用していますが、代替手段はたくさんあります。codinghorror.com
CMS

3
また、視覚的な選択があり、それを調整したい場合oは、反対側に移動します。したがって、選択範囲の最初と最後の両方を好きなだけ移動できます。
ネイサンロング

207

生産性のヒント:

スマートな動き

  • *そして #、前方カーソル/後方の下の単語を検索します。
  • w 次の言葉へ
  • W スペースで区切られた次の単語へ
  • b/ e現在の単語の始まり/終わりまで。(B / Eスペースで区切られている場合のみ)
  • gg / Gファイルの最初/最後にジャンプします。
  • % 一致する{..}または(..)などにジャンプします。
  • { / }次の段落にジャンプします。
  • '. 最後に編集した行に戻ります。
  • g; 最後に編集した位置に戻ります。

クイック編集コマンド

  • I 最初に挿入します。
  • A 最後に追加します。
  • o / O現在の後/前に新しい行を開きます。
  • v/ V/Ctrl+Vビジュアルモード(テキストを選択する!)
  • Shift+R テキストを置き換える
  • C 行の残りの部分を変更します。

コマンドを組み合わせる

ほとんどのコマンドは、量と方向を受け入れます。次に例を示します。

  • cW =単語の終わりまで変更
  • 3cW = 3ワードを変更
  • BcW =完全な単語の始まり、完全な単語の変更
  • ciW =内側の単語を変更します。
  • ci" =「..」の間で内部を変更
  • ci( =(..)の間でテキストを変更
  • ci< = <..>(needs set matchpairs+=<:> vimrcで)
  • 4dd = 4行削除
  • 3x = 3文字削除します。
  • 3s = 3文字に置き換えます。

便利なプログラマコマンド

  • r1文字を置き換える(たとえばrd、現在の文字をd)。
  • ~ 大文字小文字を変更します。
  • J 2つの線を結合します
  • Ctrl + A / Ctrl + Xは、数値を増減します。
  • . 最後のコマンドを繰り返す(単純なマクロ)
  • == 行のインデントを修正
  • > インデントブロック(ビジュアルモード)
  • < インデント解除ブロック(ビジュアルモード)

マクロ記録

  • 押す q[ key ]て録音を開始します。
  • 次にヒット qを押して録音を停止します。
  • マクロはで再生できます@[ key ]

非常に具体的なコマンドと動きを使用することにより、VIMは次の行のためにそれらの正確なアクションを再生できます。(たとえば、末尾に追加する場合はA 、カーソルを単語の先頭または末尾にそれぞれ移動する場合b/ e

適切に構築された設定の例

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

設定はに保存する~/.vimrcか、システム全体に保存して/etc/vimrc.localから、次/etc/vimrcを使用してファイルから読み取ることができます。

source /etc/vimrc.local

(VIMで機能させるには、#コメント文字をに置き換える必要があります"。ここでは、適切な構文の強調表示を行いたかったです)。

ここにリストしたコマンドはかなり基本的なものであり、これまでに使用した主なコマンドです。彼らはすでにすべての凝ったものを知る必要なく、私をかなり生産的にしています。


4
より良い'.IS g;を通じて戻ってジャンプし、changelist。最後に編集された行ではなく、最後に編集された位置に移動します
naught101

98

Control+のRメカニズムは非常に便利です:-)のいずれかで、挿入モードまたはコマンドモード(つまり、上の:行のコマンドを入力するとき)は、番号または名前付きレジスタを続行します:

  • a- z名前付きレジスタ
  • " 最後の削除またはヤンクのテキストを含む名前のないレジスター
  • % 現在のファイル名
  • # 代替ファイル名
  • * クリップボードの内容(X11:一次選択)
  • + クリップボードの内容
  • / 最後の検索パターン
  • : 最後のコマンドライン
  • . 最後に挿入されたテキスト
  • - 最後の小さい(1行未満)削除
  • =5*5 テキストに25を挿入(ミニ電卓)

詳細については:help i_CTRL-R:help c_CTRL-Rを参照してください。CTRL-Rの詳細については、近くを調べてください。


10
参考までに、これは挿入モードでのCtrl + Rを指します。通常モードでは、Ctrl + Rはやり直しです。
vdboor

2
現在/代替ファイル名の+1。 Control-A最後に挿入されたテキストの挿入モードでも機能し、Control-@最後に挿入されたテキストを挿入してすぐに通常モードに切り替える。
Aryeh Leib Taurog

91

Vimプラグイン

ここには良い答えがたくさんあり、viの禅については1つの驚くべき答えがあります。私が言及していないことの1つは、vimがプラグインを介して非常に拡張可能であることです。元の作者が決して考えなかったあらゆる種類のクレイジーなことを実行させるスクリプトとプラグインがあります。以下は、非常に便利なvimプラグインの例です。

rails.vim

Rails.vimはtpopeによって書かれたプラグインです。Railsの開発をしている人にとっては素晴らしいツールです。それは、コントローラーのメソッドから関連するビュー、モデル、そしてそのモデルの単体テストに簡単にジャンプできるようにする魔法のような状況依存のことを行います。Rails開発者として数百時間ではないにしても数十時間を節約しました。

gist.vim

このプラグインを使用すると、ビジュアルモードでテキストの領域を選択し、クイックコマンドを入力してgist.github.comに投稿できます。これにより、簡単にペーストビンにアクセスできます。これは、IRCまたはIMを介して誰かと共同作業している場合に非常に便利です。

space.vim

このプラグインは、スペースバーに特別な機能を提供します。スペースバーをピリオドに似たものに変えますが、アクションを繰り返す代わりに動きを繰り返します。これは、オンザフライで定義した方法でファイルをすばやく移動するのに非常に便利です。

Surround.vim

このプラグインは、何らかの方法で区切られたテキストを操作する機能を提供します。括弧内のもの、引用符内のものなどを表すオブジェクトを提供します。区切られたテキストを操作するのに便利です。

supertab.vim

このスクリプトは、Vimに豪華なタブ補完機能をもたらします。オートコンプリート機能はすでにvimのコアにありますが、複数の異なるマルチキーショートカットではなく、クイックタブに移動します。非常に便利で、とても楽しく使用できます。これはVSのインテリセンスではありませんが、すばらしいステップであり、タブ補完ツールに期待する機能の多くをもたらします。

syntastic.vim

このツールは、vimに外部構文チェックコマンドをもたらします。個人的に使ったことはありませんが、素晴らしいことは聞いたことがあり、そのコンセプトに勝るものはありません。手動で行うことなく構文をチェックすることは、時間の節約になり、最終的にテストをやめるよりも、導入時に構文のバグを見つけるのに役立ちます。

fugitive.vim

vim内からgitに直接アクセスします。繰り返しますが、このプラグインは使用していませんが、ユーティリティは表示されます。残念ながら私はsvnが「新しい」と見なされている文化にいるので、かなり長い間gitが動作しているとは思えないでしょう。

nerdtree.vim

vimのツリーブラウザ。私は最近これを使い始めました、そしてそれは本当に便利です。ツリービューを縦に分割してファイルを簡単に開くことができます。これは、頻繁にジャンプするソースファイルが多いプロジェクトに最適です。

FuzzyFinderTextmate.vim

これはメンテナンスされていないプラグインですが、それでも信じられないほど便利です。「ファジー」記述構文を使用してファイルを開く機能を提供します。つまり、ファイルのスパースツリーでは、必要なファイルを残りの残骸から明確にするのに十分な文字を入力するだけで済みます。

結論

vimで利用できるすばらしいツールがたくさんあります。ここでは表面をひっかいただけで、ドメインに適用できるツールを探す価値は十分あると思います。従来のviの強力なツールセット、vimの改善、およびvimをさらに拡張するプラグインの組み合わせは、これまで考えられたテキストを編集するための最も強力な方法の1つです。Vimは、emacs、eclipse、visual studio、textmateと同じくらい簡単に強力です。

ありがとう

私が多くを学び、ここにリストされているプラ​​グインのほとんどを借りてきた彼のvim構成についてduwanisに感謝します。


rails.vimでの魔法のテストからクラスへのナビゲーションは、TextMateがすべての言語で絶対に釘付けになっていることをVimが望んでいたより一般的なものの1つです。リストにはPersonTest.scalaがあります。
トム・モリス

5
私はそれの時間FuzzyFinderTextmateに置き換えを取得するために始めたと思いますgithub.com/wincent/Command-T
ギャビン・ギルモアを

2
Syntasticの+1。JSLintと組み合わせると、JavaScriptのエラーが発生しにくくなります。Syntasticで動作するようにJSLintを設定する方法については、superuser.com / questions / 247012 /…を参照してください。
ネイサンロング

1
@ベンソン素晴らしいリスト!私もsnipMateを投げます。一般的なコーディング関連の非常に役立つ自動化。if <tab>インスタントifブロックなど
AlG

2
私はnerdcommenterも良いプラグインだと思います:ここ。その名前が言うように、それはあなたのコードにコメントするためのものです。
ステファン

53

. 最後のテキスト変更コマンドを繰り返す

これでかなりの時間を節約できます。

ビジュアルモードについては前述しましたが、テキストファイルで固定サイズの列を編集するときに、ブロックビジュアルモードを使用することで多くの時間を節約できました。(Ctrl-Vでアクセス)。


3
さらに、テキストを編集するために簡潔なコマンド(たとえば、末尾に追加する場合はA)を使用すると、vimは、.キーを押した次の行に対してまったく同じアクションを繰り返すことができます。
vdboor

48

最後に編集した場所に移動します(検索を実行した後で編集に戻りたい場合に非常に役立ちます)

^ Pおよび^ N

前の(^ P)または次の(^ N)テキストを入力します。

^ Oおよび^ I

前の場所(^O- "O"古い場合)または次の場所(^I-の"I"すぐ近く"O")に移動します。検索やファイルの編集などを行うと、これらの「ジャンプ」を前後にナビゲートできます。


4
@Kungi `。最後の編集に移動します ''最後の「ジャンプ」の前の位置に戻ります-/ might /も最後の編集の位置です。
Grant McLean

46

私は最近このサイトを発見しました(http://vimcasts.org/)。

それはかなり新しく、本当に本当に良いです。サイトを運営している人は、テキストメイトからvimに切り替え、特定のvimトピックに関する非常に優れた簡潔なキャストをホストしています。見てみな!


3
vimチュートリアルが好きな場合は、Derek Wyattのvimビデオもチェックしてください。彼らは素晴らしいです。
Jeromy Anglim 2011年

42

CTRL+A立っている数を増やします。


19
...とCTRL-Xが減少します。
innM 2009

9
それはきちんとしたショートカットですが、これまでのところ、それを使用することはありません。
SolutionYogi

8
画面でvimを実行し、なぜこれが機能しないのか疑問に思う場合
-ctrl

13
@SolutionYogi:各行の先頭に行番号を追加することを検討してください。解決策:ggI1 <スペース> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42

10
Vimperatorで非常に役立ちます。Vimperatorは、URLの最後の数値を増分(または減分、Ctrl-X)します。画像ギャラリーなどをすばやくサーフィンするのに便利です
青い染色された2010

38

すべて通常モード:

f <char>は、現在の行の特定の文字の次のインスタンスに移動します繰り返す。

F <char>は、現在の行の特定の文字の前のインスタンスに移動します繰り返す。

インテリジェントに使用する場合、上記の2つを使用すると、一直線に動き回ることができます。

*次のインスタンスを検索する単語。

前のインスタンスを検索する単語に。


6
おっと、*と#(カーソルの下の単語を前方/後方に検索)バインディングについては知りませんでした。それはちょっとクールです。f / Fおよびt / Tおよび; コマンドは、現在の行の文字にすばやくジャンプします。f / Fは指定された文字にカーソルを置き、t / Tはそれを文字(選択した方向に応じてその直前または直後の文字)の直前に置きます。;最新のf / F / t / Tを繰り返す(同じ方向に)ジャンプ。
ジム・デニス

10
:) vim.orgのヒントページの上部にあるキャッチフレーズ:「時間内に "*"コマンドしか知らなかった場合、いくつのキーストロークを保存できたか想像できますか?」-ユルゲンソルク、2001
1

1
ジムが述べたように、「t / T」コンボはしばしば同じように優れています。たとえば、より良くないとしても、ct(単語を消去して挿入モードにしますが、括弧はそのままにします!
puk

34

セッション

a。セッションを保存

mksセッション名

b。強制保存セッション

:mks!セッション名

c。ロードセッション

gvimまたはvim -S セッション名


足し算と引き算

a。足し算と引き算

CTRL-A;カーソルまたはその後ろの数字またはアルファベット文字に[count]を追加します。{Viにはない

CTRL-X;カーソル位置以降の数字またはアルファベット文字から[count]を減算します。{Viにはない}

b。ウィンドウキーのマッピング解除

ウィンドウでは、Ctrlキーを押しながらAキーを押してファイル全体を選択し、rcファイルでマップ解除する必要があります。mswin.vim CTRL-Aマッピングパーツをコメントとしてマークするか、unmapを使用してrcファイルを追加します

c。マクロあり

CTRL-Aコマンドは、マクロで非常に役立ちます。例:次の手順を使用して、番号付きリストを作成します。

  1. 最初のリストエントリを作成します。数字で始まることを確認してください。
  2. qa-バッファ 'a'への記録を開始する
  3. Y-エントリーをヤンク
  4. p-エントリのコピーを最初のエントリの下に置きます
  5. CTRL-A-数を増やす
  6. q-記録を停止
  7. @a-ヤンク、プット、インクリメントの時間を繰り返す

1
Windowsのショートカットは何ですか?
Don Reba 2010

32

先週の作業では、私たちのプロジェクトは別のプロジェクトから多くのPythonコードを継承しました。残念ながら、コードは既存のアーキテクチャに適合しませんでした。すべてグローバル変数と関数で行われており、マルチスレッド環境では機能しません。

オブジェクト指向になるように再加工する必要のある〜80個のファイルがありました。すべての関数がクラスに移動され、パラメーターが変更され、インポートステートメントが追加されました。各ファイルに対して実行する必要がある約20種類の修正のリストがありました。手作業で行うと、1人で1日あたり2〜4回程度の作業ができると思います。

そこで、最初のスクリプトを手動で作成し、変更を自動化するためのvimスクリプトを作成しました。そのほとんどはvimコマンドのリストでした。

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

最後のものは少し説明に値します:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

すべてのインポートステートメントの生成など、いくつかのより複雑な変換では、いくつかのpythonをvimスクリプトに埋め込みました。

数時間作業した後、変換の少なくとも95%を実行するスクリプトができました。私はvimでファイルを開いて実行します:source fixit.vimで、ファイルは瞬く間に変換されます。

自動化する価値のない残りの5%を変更し、結果をテストする作業はまだ残っていますが、このスクリプトを1日書くことで、数週間の作業を節約できたと思います。

もちろん、これをPythonやRubyなどのスクリプト言語で自動化することは可能でしたが、書くのにはるかに時間がかかり、柔軟性が低くなります-正規表現だけでは処理できないため、最後の例は困難でしたネストされた括弧、例えばに変換するbar(foo(xxx))ためfoo(xxx).bar()。Vimはこの作業に最適でした。


1
「便利で古典的ではない」マクロから学ぶのが本当にうれしい共有に感謝します。
Olivier Pons

%s/\(bar\)(\(.\+\))/\2.\1()/それもやります。(エスケープはと互換性があり:set magicます。)参考までに。:)
Ipsquiggle 2010年

1
:非常にマジックをオンにするあなたはvimのスタイルのエスケープ気に入らない場合は、使用\ Vの%s/\v(bar)\((.+)\)/\2.\1()/
Ipsquiggle

@lpsquiggle:提案では、複数のブラケットのセットを持つ複雑な式は処理されません。例えば if bar(foo(xxx)) or wibble(xxx): なり if foo(xxx)) or wibble(xxx.bar(): 、完全に間違っています。
Dave Kirby

28

組み込みのファイルエクスプローラーを使用してください!このコマンドを:Explore使用すると、ソースコードを非常に高速にナビゲートできます。私は私の中にこれらのマッピングがあります.vimrc

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

エクスプローラでは、ファイルを変更することもできます。私はお気に入りのキーのいくつかを投稿します。押す<F1>と完全なリストが表示されます。

  • -:最も便利:上位ディレクトリに変更(cd ..
  • mf:ファイルにマークを付ける
  • D:マークされたファイル、または何もマークされていない場合はカーソルが置かれているファイルを削除します。
  • R:カーソルが置かれているファイルの名前を変更します。
  • d:現在のディレクトリに新しいディレクトリを作成します
  • :現在のディレクトリに新しいファイルを作成します

1
私はいつも、ほとんどのもののためにややこしいブラウジングのためのデフォルトの方法を考えました。行きたい場所がわかっている場合は、閲覧に時間がかかるだけです。vim.orgのスクリプトセクションのLustyExplorerは、非常に必要な改善点です。
スベン

2番目のマッピングはより単純になる可能性があります。map <silent> <S-F8>:Sexplore <CR>
Taurus Olson

8
組み込みのエクスプローラーの代わりにNERDtreeをお勧めします。プロジェクトでvimを使用する方法が変わり、生産性が大幅に向上しました。ただググって。
kprobst 2010

ソースツリーを探索する必要性を感じたことはありません:find:tagと、さまざまな関連するキーストロークを使用してジャンプします。(たぶんこれは、私が取り組んでいるソースツリーが大きく、私がやったのとは異なる方法で編成されているためでしょうか?:))
dash-tom-bang

25

私はアメリカ暗号協会の会員です。隔月の雑誌には、100を超えるさまざまな種類の暗号文が含まれています。これらの約15は「暗号」-数字の代わりに文字を使用したさまざまなタイプの算術問題です。これらのうち2つまたは3つは数独ですが、数字ではなく文字が使用されています。グリッドが完了すると、9つの異なる文字が、グリッド内のどこかの行、対角線、らせんなどに単語を綴ります。

鉛筆で作業したり、手で問題を入力したりするのではなく、Webサイトのメンバーエリアから問題をダウンロードします。

これらの数独を扱うとき、私はviを使用します。それは、他のエディターがほとんど持っていないviの機能を使用しているからです。ほとんどの場合、文字グリッドを番号グリッドに変換します。解決しやすく、完成した番号グリッドを文字グリッドに戻して、ソリューションの単語を見つけます。

問題は、9つの文字の9つのグループとしてフォーマットされます。 - sは空白を表し、2行で記述されます。最初のステップは、これらをそれぞれ9文字の9行にフォーマットすることです。これには特別なことは何もありません。適切な場所に8つの改行を挿入するだけです。

結果は次のようになります。

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

したがって、これを数値に変換する最初のステップは、個別の文字のリストを作成することです。まず、ブロックのコピーを作成します。カーソルをブロックの上部に置き、と入力し:y}}pます。 :私をコマンドモードにしy、次の移動コマンドをヤンクします。}は次の段落の終わりに移動するので、段落をy}ヤンクします。 }次にカーソルを段落の最後に移動し、pヤンクしたものをカーソルの直後に貼り付けます。そうy}}p、次の段落のコピーが作成され、2つのコピーの間にカーソルが配置されます。

次に、それらのコピーの1つを個別の文字のリストに変換します。そのコマンドはもう少し複雑です:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:再び私をコマンドモードにします。 !次のヤンクのコンテンツをコマンドラインでパイプ処理する必要があることを示します。 }次の段落をヤンクし、コマンドラインはtrコマンドを使用して大文字以外のすべてを取り除きsed、各文字を1行に出力するsortコマンド、およびそれらの行を並べ替えて重複を削除するコマンドを使用します。tr出てストリップ改行。最初の段落を構成していた9行を置き換えて、9つの異なる文字を1行に残します。この場合、文字は次のとおりです。ACELNOPSTです。

次のステップは、グリッドの別のコピーを作成することです。次に、先ほど識別した文字を使用して、それらの各文字を1〜9の数字に置き換えます。これは簡単です:!}tr ACELNOPST 0-9。結果は次のとおりです。

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

これは、通常の方法で解決するか、好みの数独ソルバーに入力できます。完成したソリューションは、次に文字に変換して戻すことができます:!}tr 1-9 ACELNOPSTます。

非常に少数の他に匹敵するviの力があります。最大の問題は、viチュートリアルブック、ウェブサイト、ヘルプファイルなど、ごく一部しか、可能なことの表面にかろうじて触れる以上のことをしていないことです。


また、ubuntuなどの一部のディストリビューションには、「vi」から「vim」までの別名があり、人々が実際にviを目にすることがないのが不愉快です。すばらしい例です。試してみる必要があります... +1
hhh

1
vimは、正しい「モード」で起動できるように、最初の名前を確認しませんか?
ダッシュトムバン

3
私はこの繰り返しエラーに困惑しています。:コマンドモードに入る必要があると言いますが、コマンドモードでは機能しない通常モードコマンド(などy}}p)を必ず指定しますか。
sehe

独自の文字チャレンジの私の:se tw=1 fo=VG:s/./& /ggvgqV{:sort u
見解:(

23

大量のテキスト操作!

マクロを介して:

  • 録音から始めます: qq
  • 何かをする
  • 記録を停止: q
  • 繰り返し:(@q初回)、@@その後。
  • 20回繰り返します: 20@@

または正規表現を使用して:

  • ものを交換してください: :%s/[fo]+/bar/g

(ただし、注意してください:後者を実行すると、2つの問題が発生します:)。


5
Jamie Zawinski参照の+1 。(それにリンクしなかったとしても、ポイントは取り戻されません)。:)
ジム・デニス

1
@ジム私はそれがジェイミーザウィンスキーの引用だったことさえ知らなかった:)。これからも覚えておきます。
jqno

次のトリックはますます便利になります...あるパターンに一致する(または一致しない)行を前の行に結合する場合: :% g/foo/-1jまたは:'a,'z v/bar/-1j例えば(前者は「すべての行でパターンに一致する」)後者は「パターンに一致しないマークaとマークzの間の線」です)。a gまたはvexコマンドのパターンの後の部分は、他の任意のexコマンドである可能性があります。-1jは、相対行移動および結合コマンドです。
ジムデニス

もちろん、マクロに「2」という名前を付けた場合、それを使用するときに、「@」キーから「q」キーに指を移動する必要はありません。すぐに毎回50〜100ミリ秒を節約できるでしょう。= P
JustJeff、2010

@JustJeffキーボードレイアウトに完全に依存します。@キーは、キーボードの2つのキーの反対側にあります。
Simon Steele

23

最近発見しましたq:。「コマンドウィンドウ」を開き、最新の元モード(コマンドモード)コマンドを表示します。ウィンドウ内で通常どおりに移動でき、を押すと<CR>コマンドが実行されます。編集などもできます。複雑なコマンドや正規表現をいじくり回していて、全体を再入力したくない場合や、複雑なことをしたいのが3つのコマンドであった場合は、非常に貴重です。それはほとんどバッシュのようですset -o viが、vim自体のためです(へへ!)。

:help q:前後に移動するためのより興味深いビットについては、を参照してください。


22

先日、Vimの全完成を発見しました。何をするのか少し漠然としていますが、挿入モードでCtrl+ x Ctrl+ uまたは Ctrl+ n/ Ctrl+のいずれかをマッシュアップするだけで、驚くほど良い結果が得られましたp。それは完全なIntelliSenseではありませんでが、まだ学習中です。

やってみて! :help ins-completion


20

これらはショートカットではありませんが、関連しています:

  1. Capslockを追加のESC(またはCtrl)にする
  2. 次のコマンドを使用して、リーダーを "、"(カンマ)にマップします:let mapleader = "、"

彼らは私の生産性を高めます。


「\」についてのちょっといいヒント!「\」よりも「、」を入力する方がはるかに優れています。
Olivier Pons 2010年

2
キャップは、Windowsに追加Escキーをロックするようにするには(?キャップがアン「任意のキー」のキーをロック何)、これを試してみてください。web.archive.org/web/20100418005858/http://webpages.charter.net/...
R.マルティーニョフェルナンデス2010

詳細- Macでは、あなたはPCKeyboardHack必要superuser.com/questions/34223/...
トム・モリス

1
WindowsのI使用AutoHotkeyをオンCapslock::Escape
Jeromy Anglim

19

私が頻繁に使用する別の便利なvi「ショートカット」は「xp」です。これにより、カーソルの下の文字が次の文字と入れ替わります。


3
Xp反対方向に進む
テスター

5
Windows XPが登場した頃、私はこれが唯一の有効な利用法だと冗談を言っていました。
kguest '27

18

<Ctrl> + W、Vで画面を垂直に分割
<Ctrl> + W、Wでウィンドウ間を移動

!python%[args]このウィンドウで編集しているスクリプトを実行します

任意の線を折りたたむビジュアルモードのZF


2
<Ctrl> + Wおよびj / kを使用すると、絶対的にナビゲートできます(通常のvimと同様に、jを上に、kを下に)。これは、3つ以上の分割がある場合に最適です。
Andrew Scagnelli、2010

1
ビジュアルモードでのzfの+1。コードの折りたたみは好きですが、それについては知りませんでした。
coder_tim 2012年

2
私のキーボードをバッシングした後、私はと推測している<C-w>nか、<C-w>s新しい水平ウィンドウで、<C-w>b右下のウィンドウで、<C-w>cまたは<C-w>qウィンドウを閉じるで、<C-w>xその後増加し、ウィンドウの幅を(??)減少しているが、<C-w>p最後のウィンドウで、<C-w>backspace動きは(っぽい)ウィンドウ残っている
PUK

:help ctrl-wFTW ...自分に有利なことをして、少なくとも15分間これらのことを試すように自分自身を強制してください!
sjas

18

ビジュアルモード

他の何人かの人々が言っ​​たように、ビジュアルモードはあなたのコピー/カットアンドペースト問題への答えです。Vimは「v」、「V」、およびCvを提供します。vimの小文字の「v」は、メモ帳のシフトキーと基本的に同じです。良いことは、それを押し続ける必要がないということです。任意の移動手法を使用して、選択の開始(または終了)ポイントに効率的にナビゲートできます。次に「v」を押し、効率的な移動テクニックをもう一度使用して、選択の反対側に移動します。次に、「d」または「y」を使用すると、その選択を切り取りまたはコピーできます。

vimのビジュアルモードの利点は、viでのカット/コピー/貼り付けに関するジムデニスの説明よりも、正確な位置を取得する必要がないことです。場合によっては、目的の場所に正確に到達するためのより複雑な単一の移動コマンドを考えるよりも、移動したい場所の一般的な周辺に移動してから、他の移動でそれを調整する方が効率的です。

この方法でビジュアルモードを広範囲に使用することの欠点は、いつでも使用できる松葉杖になる可能性があり、より効率的に操作できる新しいvi(m)コマンドを学習できないことです。ただし、vi(m)の新しい側面について非常に積極的に学習している場合、これはおそらくあまり影響しません。

また、ビジュアルラインモードとビジュアルブロックモードでは、非常に強力な同じテーマのバリエーションが提供されることを強調しておきます。特に、ビジュアルブロックモードです。

キーボードの効率的な使用について

また、交互の手がキーボードを使用する最も速い方法であるというあなたの主張にも同意しません。それには真実の要素があります。非常に一般的に言えば、同じものを繰り返し使用することは遅いです。この原則のこの最も重要な例は、同じ指でタイプされた連続するキーストロークが非常に遅いことです。あなたの主張はおそらく、このパターンでs / finger / hand /変換を使用する自然な傾向に由来します。ある程度は正しいですが、効率スペクトルの非常に高い端では正しくありません。

ピアニストに聞いてみてください。いくつかのノートを交互に連続して演奏するのが速いのか、それとも片手で連続する指を順番に演奏するのが速いのかを尋ねます。4つのキーストロークを入力する最も速い方法は、手を交互にするのではなく、同じ手の4本の指で昇順または降順で入力することです(これを「実行」と呼びます)。この可能性を考えれば、これは自明です。

より難しい問題は、これを最適化することです。キーボードの絶対距離を最適化するのは非常に簡単です。Vimはそれを行います。「実行」レベ​​ルで最適化するのははるかに困難ですが、モーダル編集を使用したvi(m)を使用すると、モーダル以外のアプローチ(ahem、emacs)で実行できるよりも、それを実行できる可能性が高くなります。

Emacsの場合

最後の括弧付きのコメントのために、emacsの熱狂者が私の投稿全体を完全に無視しないように、emacsとvimの宗教の違いの根源を説明しなければならないように感じます。私は編集者の戦争で話したことがなく、おそらく再びそうするつもりはありませんが、誰もがこのように違いを説明するのを聞いたことがありません。違いは次のトレードオフです。

Vimは、比類のない生のテキスト編集効率を提供しますEmacsは、エディターをカスタマイズしてプログラムする比類のない機能を提供します

盲目のvim狂信者は、vimにスクリプト言語があると主張します。しかし、それは編集者に役立つように設計されたあいまいなアドホック言語です。EmacsはLispを持っています!十分に言った。これらの最後の2つの文の重要性を理解していない場合、または関数型プログラミングとLispについて十分に学習してその理解を深めることを望む場合は、vimを使用する必要があります。

emacs狂信者は、emacsにはviperモードがあると主張するため、vimのスーパーセットです。しかし、viperモードは標準ではありません。私の理解では、viperモードはemacsユーザーの大多数では使用されていません。これはデフォルトではないので、ほとんどのemacsユーザーはおそらく、モーダルパラダイムの利点を真に理解していません。

私の意見では、これらの違いは直交しています。私が述べたように、vimとemacsの利点はどちらも有効であると思います。これは、究極のエディターがまだ存在しないことを意味します。emacsが究極のエディターの基盤となる最も簡単なプラットフォームであることはおそらく本当です。しかし、モーダル編集はemacsの考え方に根付いていません。emacsコミュニティは将来的にそのように動く可能性がありますが、そうは思われません。

したがって、生の編集効率が必要な場合は、vimを使用してください。エディターのスクリプトとプログラミングのための究極の環境が必要な場合は、emacsを使用してください。プログラマビリティに重点を置いて両方を必要とする場合は、viperモードでemacsを使用します(または独自のモードをプログラムします)。あなたが両方の世界のベストを望むなら、あなたは今のところ運が悪いです。


17

vimチュートリアルを30分間実行します(ターミナルでvimの代わりにvimtutorを実行します)。基本的な動きといくつかのキーストロークを学習します。これにより、以前に使用したテキストエディターと同じように、少なくともvimの生産性が向上します。その後、まあ、ジムデニスの答えをもう一度読んでください:)


1
これは私がOPを読んだときに最初に考えたものです。ポスターがこれを実行したことがないことは明らかです。私は2年前に初めてvimを学習したときにそれを経験しました。それは、Vimが私が使用した他のエディタ(Macでの主要なコンボの使用が煩わしいため、Emacsを含む)に対する優位性を頭に浮かび上がらせました。 。
ダッシュトムバン

16

Vimをどのように使用すれば、現代のエディターよりも生産性が向上しますか?

非常に少ないキーストローク(多くの場合、マクロ使用)で複雑で反復的な編集を実行できること。VimGolfを見てくださいVimの力を目撃を!

ほぼ毎日の使用を10年以上行った後、他のエディターを使用することを想像するのは困難です。


16

\c大文字と小文字を無視するには、検索の任意の場所を使用します(ignorecaseまたはsmartcase設定を上書きします)。例えば/\cfooまたは/foo\c一致しますfooFoofOOFOO、など

\C検索の任意の場所を使用して、ケースマッチングを強制します。たとえば/\Cfoo/foo\Cfooのみに一致します。


16

誰もそのt運動に言及していないことに驚いた。dt,またはの形式のパラメータリストで頻繁に使用します。yt,


2
またはdfx、dFx、dtx、ytxなど。ここで、xは文字、+ 1
hhh

はい!そして、ct(忘れずに)を忘れないでください。
markle976

16

奇妙な誰も言及されたctags。「あふれんばかりのctags」をダウンロードして、検索パスにすでにある、プレインストールされたくだらないバージョンの前に置きます。Cdで作業しているもののルートに移動します。たとえば、Androidカーネルディストリビューション。「ctags -R」と入力します。「タグ」という名前のファイルで、そのディレクトリの下の任意の場所にソースファイルのインデックスを作成します。これには、すべてのタグが含まれ、言語もディレクトリ内のどこでも、1つのファイルに含まれているため、言語間の作業は簡単です。

次に、そのフォルダーでvimを開き、いくつかのコマンドについては:help ctagsを読みます。私が頻繁に使用するいくつか:

  • メソッド呼び出しにカーソルを置き、CTRL-]と入力してメソッド定義に移動します。

  • :ta nameと入力して、nameの定義に移動します。


14

自動インデント:

gg(ドキュメントの先頭に移動)
=(インデント時間!)
shift-g(ドキュメントの末尾に移動)

ファイルには「filetype plugin indent on」.vimrcと、おそらく適切な「shiftwidth」と「expandtab」設定が必要です。


4
あるいは、最初からviにあった「:set ai」(自動インデント)機能を使用するだけです。
xcramps

14

あなたは生産的なショートカットについて尋ねましたが、あなたの本当の質問は次のとおりだと思います:vimはそれだけの価値があるのでしょうか?このスタックオーバーフローの質問への答えは-> "はい"です

あなたは二つのことに気づいたに違いない。Vimは強力で、Vimを学ぶのは難しいです。その力の多くは、その拡張性とコマンドの無限の組み合わせにあります。圧倒されないでください。ゆっくり行きます。一度に1つのコマンド、1つのプラグイン。無理しないでください。

vimに投入した投資はすべて1000倍の利益をもたらします。あなたは死ぬまでの何時間もの間、テキストエディタの中にいるでしょう。Vimがあなたの仲間になります。


13

複数のバッファ、および特に速いとの2つのファイルを比較するために、それらの間のジャンプで:bp:bn(適切に単一に再マップShift+ pまたはShift+ n

vimdiff モード(2つの垂直バッファーに分割され、色が違いを示す)

Ctrl+を使用したエリアコピーv

そして最後に、識別子のタブ補完( "mosh_tab_or_complete"を検索)。それは人生を変えるものです。


12

トップポスターに同意-ther コマンドは非常に便利です。

ほとんどの場合、それを「貼り付け」るために使用します。

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

このようにして、をいじる必要はありません:set paste


3
デフォルトでシステムクリップボードを使用するには、clipboardオプションをunnamedset clipboard=unnamed.vimrcで)に設定することをお勧めします。または、システムのクリップボードを名前のないレジスターから切り離したい場合は、適切な名前のクリップボードレジスターを使用します"*p
R.マルティーニョフェルナンデス2010

2
大好きです!Webからコード例を貼り付けることに腹を立てた後、私はvimに習熟し始めたばかりです。それがその場で思いついたコマンドでした。これはvimが私を完全に夢中にさせたときでした。
kevpie

Macで開発している場合は、システムクリップボードを使用してCommand + CおよびCommand + Vでコピーアンドペーストするので、再マップは不要です。
ベンモルデカイ

GVImでのみ…コンソールから、自動:set pasteインデントが有効になっている場合、なしでの貼り付けはうまく機能しません。
David Wolever 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.