1125

長所と短所の両方で、Vimについて多くのことを聞いてきました。(開発者として) Vim を使用すると、他のエディターよりも高速になるはずです。私は Vim を使用していくつかの基本的な作業を行っていますが、Vim を使用した場合の生産性はせいぜい 10 分の 1 です。

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

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

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

コピー/カット&ペースト。私はいつもそれをします。現在のすべてのエディターShift では、左手で押し、右手でカーソルを動かしてテキストを選択します。次にCtrl+Cコピーし、カーソルを移動してCtrl+V貼り付けます。

Vim では恐ろしいことです:

  • yy1 行をコピーする (行全体が必要になることはほとんどありません!)
  • [number xx]yyxx行をバッファにコピーします。しかし、自分が望んでいたものを選択したかどうかは正確にはわかりません。私はしばしば元に戻すため[number xx]ddにしなければなりません!u

もう一つの例?検索して置換します。

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

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

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

私の質問は:

現代のエディターよりも生産性を高める Vim の使用方法は何ですか?

4

50 に答える 50

2854

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

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

viの「禅」とは、言語を話しているということです。頭文字yは動詞です。このステートメントyyは の同義語ですy_。はyよく使われる操作なので、入力しやすいように 2 倍になっています。

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

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

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

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

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

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

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

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

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

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

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


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

いくつかの:コマンドがありますが、最も顕著なのは:% s/foo/bar/gグローバル置換テクニックです。(それは高度ではありませんが、他の:コマンドは可能です)。:コマンドのセット全体は歴史的にviの以前の化身によってed (ライン エディター) として継承され、後にex (拡張ライン エディター) ユーティリティとして継承されました。実際、 viはexへの視覚的なインターフェイスであるため、そのように名付けられました。

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

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

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

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

:% g/.../dor (reVerse/conVerse 対応する::% v/.../dが最も一般的な使用パターンであることに注意してください。ただしex、覚えておく価値のある他のコマンドがいくつかあります。

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

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

ほとんど言うまでもなく、旧友s(代用) をgand v(global/converse-global) コマンドで使用できます。通常はその必要はありません。ただし、他のパターンに一致する行だけを置換したい場合を考えてみましょう。多くの場合、キャプチャで複雑なパターンを使用し、後方参照を使用して変更したくない行の部分を保持できます。ただし、多くの場合、置換と一致を区別する方が簡単です。:% g/foo/s/bar/zzz/g-- 「foo」を含むすべての行について、すべての「bar」を「zzz」に置き換えます。(何かのようなもの:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g同じ行で「foo」が前にある「bar」のインスタンスの場合にのみ機能します。それはすでに十分に不格好であり、「バー」が「フー」に先行するすべてのケースをキャッチするには、さらにマングルする必要があります)

ポイントは、コマンド セットにはps、およびd行だけではありません。ex

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

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

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

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

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

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

別の便利なexコマンドは:so(の略:source) です。これは、ファイルの内容を一連のコマンドとして読み取ります。通常、 viを起動すると、暗黙のうちに:sourceon ~/.exinitrcfile が実行されます (そして、Vimは通常、これを onで行いますが~/.vimrc、当然のことです)。これを使用すると、マクロ、略語、およびエディター設定の新しいセットを単にソースするだけで、エディター プロファイルをオンザフライで変更できます。あなたが卑劣な場合は、これをトリックとして使用して、の編集コマンドのシーケンスを保存し、オンデマンドでファイルに適用することもできます。

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

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

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

この@コマンドは、おそらく最もあいまいなviコマンドです。高度なシステム管理コースを 10 年近くにわたって時折教えてきた中で、これまでに使用したことのある人はほとんどいませんでした。 viまたはexコマンド@であるかのようにレジスタの内容を実行します。 例: 私はよく次を使用します:システム上のファイルを見つけて、その名前をドキュメントに読み込む。そこから無関係なヒットを削除し、関心のあるファイルへのフル パスだけを残します。viのコピーで)私はただ使用します:
:r!locate ...Tab

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

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


冷静な考え

私はviの力の表面に引っかいただけであり、ここで説明したことは、 vimの名前が付けられた「改善」の一部でさえありません! ここで説明したことはすべて、20 年または 30 年前のviの古いコピーで動作するはずです。

viの力を私よりもかなり多く使った人がいます。

于 2009-08-02T23:08:04.560 に答える
504

テキストの選択とコピーについて話しているのですが、Vim Visual Modeを見てください。

ビジュアル モードでは、Vim コマンドを使用してテキストを選択することができ、その後、選択した内容で好きなことを行うことができます。

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

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

あなたがすることができます:

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

引用符の間のテキストを選択したい:

  • 二重引用符のvi"
  • 一重引用符の vi'

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

  • viB
  • vi{

ファイル全体を選択したい場合:

  • ggVG

視覚的なブロック選択は、もう 1 つの非常に便利な機能です。これを使用すると、テキストの長方形の領域を選択できます。それを開始するには、 Ctrl-を押す必要Vがあります。次に、必要なテキスト ブロックを選択し、ヤンク、削除、削除などの操作を実行します。貼り付け、編集など。列指向のテキストを編集するのは素晴らしいことです。

于 2009-08-02T08:27:12.863 に答える
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<= < .. > の間でテキストを変更 ( set matchpairs+=<:>vimrc で必要)
  • 4dd= 4行削除
  • 3x= 3 文字を削除します。
  • 3s= 3 文字を置き換えます。

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

  • r1 文字を置き換えます (たとえばrd、現在の文字を に置き換えますd)。
  • ~大文字と小文字を変更します。
  • J2 つの行を結合します
  • 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 で機能させるには、コメント文字をに置き換える必要があります"。ここでは、適切な構文を強調表示したかったのです)。

ここにリストしたコマンドはかなり基本的なもので、これまでに使用した主なものです。手の込んだことをすべて知らなくても、すでに生産性が大幅に向上しています。

于 2010-04-01T09:08:06.630 に答える
98

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

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

詳細については:help i_CTRL-R:help c_CTRL-Rを参照してください。さらに CTRL-R の利点については近くを詮索してください。

于 2010-06-02T18:49:57.400 に答える
91

Vim プラグイン

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

rails.vim

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

gist.vim

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

space.vim

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

サラウンド.vim

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

supertab.vim

このスクリプトは、高度なタブ補完機能を vim にもたらします。オートコンプリート機能はすでに vim のコアにありますが、これにより、複数の異なるマルチキー ショートカットではなく、クイック タブが表示されます。とても便利で、使っていてとても楽しいです。これは VS の IntelliSense ではありませんが、すばらしいステップであり、タブ補完ツールに期待する多くの機能をもたらします。

syntastic.vim

このツールは、外部構文チェック コマンドを vim に取り込みます。私は個人的には使用していませんが、それについて素晴らしいことを聞いており、そのコンセプトに勝るものはありません. 手動で構文をチェックすることなく構文をチェックすることは、時間を大幅に節約し、最終的にテストを停止するときではなく、構文上のバグを導入するときに発見するのに役立ちます。

逃亡者.vim

vim 内から git に直接アクセスできます。繰り返しますが、私はこのプラグインを使用していませんが、ユーティリティは確認できます。残念ながら、私は svn が「新しい」と見なされる文化にいるので、しばらくの間 git が機能するのを見ることはないでしょう。

nerdtree.vim

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

FuzzyFinderTextmate.vim

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

結論

vim には素晴らしいツールがたくさんあります。ここでは表面をなぞったにすぎないと確信しており、ドメインに適用可能なツールを検索する価値は十分にあります。従来の vi の強力なツールセット、それに対する vim の改良、および vim をさらに拡張するプラグインの組み合わせにより、これまでに考えられた中で最も強力なテキスト編集方法の 1 つです。Vim は、emacs、Eclipse、Visual Studio、および textmate と同じくらい簡単に強力です。

ありがとう

duwanisvim 構成に感謝します。ここから多くのことを学び、ここにリストされているほとんどのプラグインを借りてきました。

于 2010-04-01T03:44:29.657 に答える
53

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

これで多くの時間を節約できます。

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

于 2010-02-27T11:28:44.660 に答える
48

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

^Pおよび^N

前の(^ P)または次の(^ N)テキストを完成させます。

^Oと^I

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

于 2009-08-02T10:07:28.917 に答える
46

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

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

于 2010-03-31T19:37:33.913 に答える
42

CTRL+Aは、立っている番号を増やします。

于 2009-08-02T14:01:46.670 に答える
38

すべて通常モード:

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

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

インテリジェントに使用すると、上記の2つを使用すると、すばやく一列に移動できます。

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

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

于 2009-08-02T19:19:17.967 に答える
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-マッピング部分をコメントとしてマークするか、unmapを使用してrcファイルを追加します

c。マクロ付き

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

  1. 最初のリストエントリを作成し、番号で始まることを確認します。
  2. qa-バッファ'a'への記録を開始します
  3. Y-エントリをヤンクします
  4. p-エントリのコピーを最初のエントリの下に置きます
  5. CTRL-A-数値をインクリメントします
  6. q-記録を停止します
  7. @a-ヤンク、プット、インクリメントの時間を繰り返します
于 2010-08-19T08:08:28.973 に答える
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.

最後の 1 つは少し説明する価値があります。

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 "." 

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

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

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

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

于 2010-02-27T12:06:13.683 に答える
28

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

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

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

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

私はアメリカ暗号協会の会員です。隔月刊の雑誌には、さまざまな種類の 100 を超える暗号文が掲載されています。これらの約 15 は「cryptarithms」です - 数字の代わりに文字を使用するさまざまな種類の算術問題です。そのうちの 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'

:再び私をコマンドモードにします。 !次の yank の内容をコマンド ライン経由でパイプ処理する必要があることを示します。 }次の段落をヤンクし、コマンド ラインはtrコマンドを使用して大文字以外のすべてを削除し、コマンドを使用しsedて各文字を 1 行に出力し、sortコマンドを使用してそれらの行を並べ替え、重複を削除してから削除trします改行を削除し、9 つの異なる文字を 1 行に残し、元の段落を構成していた 9 行を置き換えます。この場合、文字は次のとおり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 のチュートリアル ブック、Web サイト、ヘルプ ファイルなどのごく一部しか、可能なことの表面にほとんど触れていないことです。

于 2010-04-02T05:17:26.527 に答える
23

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

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

于 2012-04-02T07:56:22.900 に答える
23

一括テキスト操作!

マクロを介して:

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

または正規表現を介して:

  • ものを置き換える::%s/[fo]+/bar/g

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

于 2009-08-02T08:59:30.177 に答える
22

先日、Vim のオムニコンプリート機能を発見したばかりで、どちらが何をするのか少し曖昧であることは認めますが、挿入モードでCtrl+ x Ctrl+uまたは Ctrl+ n/ Ctrl+をマッシュアップするだけで驚くほど良い結果が得られました。pそれは完全にIntelliSenseではありませんが、まだ学習中です。

やってみて!:help ins-completion

于 2009-08-02T08:54:00.017 に答える
20

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

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

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

于 2010-03-14T19:49:18.493 に答える
19

私が頻繁に使用するもう 1 つの便利な vi の「ショートカット」は「xp」です。これにより、カーソルの下の文字が次の文字と交換されます。

于 2010-09-20T10:34:50.607 に答える
18

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

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

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

于 2009-08-02T09:47:38.397 に答える
18

ビジュアルモード

他の何人かが言っているように、ビジュアルモードはコピー/カットアンドペーストの問題に対する答えです。Vimは'v'、'V'、Cvを提供します。vimの小文字の「v」は基本的にメモ帳のShiftキーと同じです。良い点は、それを押さえる必要がないことです。任意の移動テクニックを使用して、選択した開始点(または終了点)に効率的に移動できます。次に、「v」を押し、効率的な移動テクニックをもう一度使用して、選択範囲のもう一方の端に移動します。次に、「d」または「y」を使用すると、その選択を切り取るかコピーできます。

vimのビジュアルモードがviでのカット/コピー/貼り付けに関するJimDennisの説明よりも優れている点は、正確な場所を取得する必要がないことです。時々、あなたが行きたい場所の一般的な近くに到達するために速い動きを使用し、次にあなたが行きたい場所に正確に到達するより複雑な単一の動きのコマンドを考えるよりも他の動きでそれを洗練する方が効率的です。

この方法でビジュアルモードを広範に使用することの欠点は、常に使用する松葉杖になる可能性があるため、より効率的に作業を行うことができる新しい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モードは大多数のemacsユーザーによって使用されていません。これはデフォルトではないため、ほとんどのemacsユーザーは、モーダルパラダイムの利点を真に理解していない可能性があります。

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

したがって、生の編集効率が必要な場合は、vimを使用してください。スクリプトとプログラミングのための究極の環境が必要な場合は、エディターでemacsを使用してください。プログラム可能性に重点を置いて両方のいくつかが必要な場合は、viperモードでemacsを使用します(または独自のモードをプログラムします)。両方の長所が必要な場合は、今のところ運が悪いです。

于 2010-04-01T16:49:49.550 に答える
17

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

于 2010-03-31T22:44:38.187 に答える
16

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

于 2010-04-01T11:30:31.540 に答える
16

大文字と小文字を無視するには、検索の任意の場所で使用\cします (ignorecase または smartcase の設定をオーバーライドします)。たとえば/\cfoo、 orは、、、など/foo\cと一致します。fooFoofOOFOO

\C大文字と小文字の一致を強制するには、検索の任意の場所で使用します。たとえば/\Cfoo、or/foo\Cは foo のみに一致します。

于 2010-06-09T10:29:11.787 に答える
16

現代のエディターよりも生産性を高める Vim の使用方法は何ですか?

非常に少ないキーストロークで複雑で反復的な編集を実行できる (多くの場合、マクロを使用する)。VimGolfを見て、Vim のパワーを目の当たりにしましょう!

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

于 2011-01-12T22:52:32.003 に答える
16

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

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

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

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

于 2012-02-04T22:54:14.407 に答える
14

自動インデント:

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

ファイルに「filetypepluginindenton」が必要.vimrcであり、おそらく適切な「shiftwidth」と「expandtab」の設定が必要です。

于 2009-08-06T01:56:28.140 に答える
14

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

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

vim に投資したすべての投資は、1000 倍の見返りがあります。死ぬまで何時間もテキストエディタの中にいることになります。Vim があなたの仲間になります。

于 2010-07-24T05:41:20.577 に答える
13

複数のバッファ、特に 2 つのファイルを:bpandで比較するためのそれらの間の高速ジャンプ (単一の+または+:bnに適切に再マップ)ShiftpShiftn

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

Ctrl+でエリアコピーv

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

于 2009-08-02T09:23:06.010 に答える
12

一番上のポスターに同意 - :r! コマンドは非常に便利です。

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

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

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

于 2009-08-28T16:07:18.983 に答える
10

cit – 挿入モードのトランジションでタグの内容を空にします

yit – タグの内容をコピーする

于 2010-09-10T21:27:21.953 に答える
10

私の最も生産的な vi/Vim トリックは次のとおりです。

:%s

その場で正規表現を使用して、ファイル内の必要なものを置き換えることができるのが気に入っています。すべてのテキスト エディターは正規表現 IMHO をサポートする必要があります。

于 2009-08-28T16:48:52.533 に答える
10

編集を高速化するための 3 つ目の基準は、必要なキーストロークの数です。これは他の 2 よりも重要だと思います。vim では、ほとんどすべての操作で、私がよく知っている他のどのエディターよりも少ないキーストロークで済みます。

カット アンド ペーストに問題があるとおっしゃっていましたが、vim の一般的なモーション コマンドの経験がもっと必要なようです。3 つの単語をヤンクします: y3w カーソルから次のセミコロンまでヤンクします: yf; 最も最近の検索の次の発生にヤンクします: yn これらはすべて、修飾キーを押しながらマウスで移動しようとするよりもはるかに高速です。また、CMS の応答のいくつかの例に見られるように、vim のモーション コマンドは、C および C++ ソース コードでの効率的なナビゲーションのために高度に最適化されています。

「生産性を高める vim の使用方法は?」という質問については、「効率的に」と答えていただければ幸いです。

于 2009-08-02T13:36:18.623 に答える
10

\= を置換文字列で使用できます。これは、私が頻繁に行うことです。

vim に本質的に順序付けられていないリストがある場合、たとえば # をマーカーとして使用している場合、それを順序付きリストに変換できます。

# CSSLINT
# PHPCS
# Charlie
# Delta

1行目で開始する場合は、次のことができます

:1,6s/#/\=line(".")/g

それを変換するには

1 CSSLINT
2 PHPCS
3 Charlie
4 Delta

1行目から始まらない場合は、計算してください:

:16,20s/#/\=line(".") - 15/g

詳細については、:help sub-replace-expression を参照してください。

于 2011-08-27T09:04:48.070 に答える
9

Vim の学習に役立つ別のサイトを次に示します。それも楽しいです!:)

VIM Adventuresは、VIM のキーボード ショートカット (コマンド、モーション、オペレーター) に基づくオンライン ゲームです。「ゼルダのミーツテキストエディット」ゲームです。VIMコマンドを練習・覚えるためのパズルゲームです(もちろん古き良きVIも対象です)。これは、急な学習曲線を必要とせずに VIM を学習する簡単な方法です。

于 2012-04-25T04:41:39.287 に答える
9

以下を単純なキーの組み合わせにマッピングした後、以下は私にとって非常に便利です:

パス上でファイルにジャンプする

gf

既存ファイルのフルパス名を取得

:r!echo %:p

既存ファイルのディレクトリを取得

:r!echo %:p:h

実行コード:

:!ruby %:p

ルビの略語:

ab if_do if end<esc>bi<cr><esc>xhxO
ab if_else if end<esc>bi<cr><esc>xhxO else<esc>bhxA<cr> <esc>k$O
ab meth def method<cr>end<esc>k<esc>:s/method/
ab klas class KlassName<cr>end<esc>k<esc>:s/KlassName/
ab mod module ModName<cr>end<esc>k<esc>:s/ModName/

現在のプログラムを実行:

   map ,rby :w!<cr>:!ruby %:p<cr>

現在のプログラムの構文を確認します。

   map ,c :w!<cr>:!ruby -c %:p<cr>

現在の仕様プログラムのすべての仕様を実行します。

   map ,s :w!<cr>:!rspec %:p<cr>

開けてみてください irb:

   map ,i :w!<cr>:!irb<cr>

rspec の略語:

   ab shared_examples shared_examples_for "behavior here" do<cr>end
   ab shared_behavior describe "description here" do<cr>  before :each do<cr>end<cr>it_should_behave_like "behavior here"<cr><bs>end<cr>
   ab describe_do describe "description here" do<cr>end
   ab context_do describe "description here" do<cr>end
   ab it_do it "description here" do<cr>end
   ab before_each before :each do<cr>end<cr>

レールの略語:

ユーザ認証:

     ab userc <esc>:r $VIMRUNTIME/Templates/Ruby/c-users.rb<cr>
     ab userv <esc>:r $VIMRUNTIME/Templates/Ruby/v-users.erb<cr>
     ab userm <esc>:r $VIMRUNTIME/Templates/Ruby/m-users.rb<cr>

Firefox で視覚的に選択した URL を開く:

"function
   function open_url_in_firefox:(copy_text)
     let g:open_url_in_firefox="silent !open -a \"firefox\" \"".a:copy_text."\""
     exe g:open_url_in_firefox
   endfunction

"abbreviations
   map ,d :call open_url_in_firefox:(expand("%:p"))<cr>
   map go y:call open_url_in_firefox:(@0)<cr> 

rspec: 現在の行を含む仕様を実行:

"function
   function run_single_rspec_test:(the_test)
     let g:rake_spec="!rspec ".a:the_test.":".line(".")
     exe g:rake_spec
   endfunction

"abbreviations
   map ,s :call run_single_rspec_test:(expand("%:p"))<cr>

rspec-rails: 現在の行を含む run spec:

"function
   function run_single_rails_rspec_test:(the_test)
     let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")."\""
     exe g:rake_spec
   endfunction

"abbreviations
   map ,r :call run_single_rails_rspec_test:(expand("%:p"))<cr>

rspec-rails: 現在の行を含む spec をデバッグで実行:

"function
   function run_spec_containing_current_line_with_debugging:(the_test)
     let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")." -d\""
     exe g:rake_spec
   endfunction

"abbreviations
   map ,p :call run_spec_containing_current_line_with_debugging:(expand("%:p")) <cr>

html

"abbreviations

  "ab htm <html><cr><tab><head><cr></head><cr><body><cr></body><cr><bs><bs></html>
   ab template_html <script type = 'text/template' id = 'templateIdHere'></script>
   ab script_i <script src=''></script>
   ab script_m <script><cr></script>
   ab Tpage <esc>:r ~/.vim/templates/pageContainer.html<cr>
   ab Ttable <esc>:r ~/.vim/templates/listTable.html<cr>

"function to render common html template

   function html:() 
     call feedkeys( "i", 't' )
     call feedkeys("<html>\<cr>  <head>\<cr></head>\<cr><body>\<cr> ", 't')
     call feedkeys( "\<esc>", 't' )
     call feedkeys( "i", 't' )
     call include_js:()
     call feedkeys("\<bs>\<bs></body>\<cr> \<esc>hxhxi</html>", 't')
   endfunction

JavaScript

"jasmine.js
  "abbreviations
   ab describe_js describe('description here', function(){<cr>});
   ab context_js context('context here', function(){<cr>});
   ab it_js it('expectation here', function(){<cr>});
   ab expect_js expect().toEqual();
   ab before_js beforeEach(function(){<cr>});
   ab after_js afterEach(function(){<cr>});

"function abbreviations

   ab fun1 function(){}<esc>i<cr><esc>ko
   ab fun2 x=function(){};<esc>hi<cr>
   ab fun3 var x=function(){<cr>};

"method for rendering inclusion of common js files

   function include_js:()
     let includes_0  = "  <link   type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/jasmine-1.1.0\/jasmine.css'\/>"
     let includes_1  = "  <link   type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/screen.css'\/>"
     let includes_2  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jquery-1.7.2\/jquery-1.7.2.js'><\/script>"
     let includes_3  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/underscore\/underscore.js'><\/script>"
     let includes_4  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/backbone-0.9.2\/backbone.js'><\/script>"
     let includes_5  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine.js'><\/script>"
     let includes_6  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine-html.js'><\/script>"
     let includes_7  = "<script>"
     let includes_8  = "  describe('default page', function(){ "
     let includes_9  = "it('should have an html tag', function(){ "
     let includes_10 = "  expect( $( 'head' ).html() ).not.toMatch(\/^[\\s\\t\\n]*$\/);"
     let includes_11  = "});"
     let includes_12 = "});"
     let includes_13 = "$(function(){"
     let includes_14 = "jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );"
     let includes_15 = "jasmine.getEnv().execute();"
     let includes_16 = "});"
     let includes_17 = "\<bs>\<bs><\/script>"

     let j = 0

     while j < 18
       let entry = 'includes_' . j
       call feedkeys( {entry}, 't' )
       call feedkeys( "\<cr>", 't' )
       let j = j + 1
     endwhile

   endfunction

"jquery

  "abbreviations

     ab docr $(document).ready(function(){});
     ab jqfun $(<cr>function(){<cr>}<cr>);
于 2012-03-24T03:30:19.353 に答える
7

コードの一部にテキストを挿入する:

ctrl + v, (selecting text on multiple lines), I, (type something I want), ESC

テキストを編集するマクロを記録し、それを N 回実行します。

q, a (or some other letter), (do the things I want to record), q, ESC,
(type N, as in the number of times I want to run the macro), @, a
于 2009-08-02T08:27:52.160 に答える
7
Ctrl-w Ctrl-f ............ open file under cursor in new window
Ctrl-6 ................... alternate file
'0 ....................... open last file
:x ....................... close if save
于 2010-11-04T22:51:50.403 に答える
7

ちょっと質問を無視して(私の答えは以下にあります)、vimの問題を解決するのに役立つかもしれないいくつかのことがあります:

:map <C-F> /\V

これにより、Ctrl-F で検索の最初の文字が である検索が開始され\V、すべての「魔法」がオフになるため、何もエスケープする必要はありません (PsPad と同様)。

" CTRL-X and SHIFT-Del are Cut
vnoremap <C-X> "+x
vnoremap <S-Del> "+x

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y
vnoremap <C-Insert> "+y

" CTRL-V and SHIFT-Insert are Paste
map <C-V>       "+gP
map <S-Insert>      "+gP

cmap <C-V>      <C-R>+
cmap <S-Insert>     <C-R>+

(Vim ディストリビューションの mswin.vim から直接取得)。これにより、コピーして貼り付けるための Ctrl-C、Ctrl-V などが提供されます。

個人的には、コピーと貼り付けは標準の Vim の方がはるかに優れていると思います。Vim では、行にカーソルを置き、入力yyしてコピーし、10p10 個のコピーを貼り付けることができます。Alignプラグインを使用すると、(Ctrl-V上記のウィンドウ マッピングが使用されていないと仮定して) 作成された数値の列を視覚的にブロックして選択できます。:II次に、その数値の列を自動インクリメントします。同様に、YankRingを使用すると、10 行 (またはそれ以上) の行を次々にコピーして、それらを次々に貼り付けることができます。

Vim が私の生産性を向上させる方法について言えば、tags ファイルはもうなくてはならないものの 1 つです。カーソルがタグの上にあるとき、押すCtrl-]と関数に移動したり (Ctrl-T で好きな数のレベルに戻る,pことができます)、プレビュー ウィンドウで関数やマクロ定義 (または何でも) を開くことができます (これにより、 :pcl) ですばやく閉じるか[i、ステータス バーにマクロ定義を表示するだけです。複雑なソース コードをナビゲートするには、これらのツールが非常に役立ちます。

ただし、プレビュー ウィンドウは .vimrc のマッピングに依存しています。

:map ,p :ptag <C-R><C-W><CR>

タグファイルでは、マウスをキーワードの上に移動すると、(認識されたタグを強調表示し、認識されていないタグを強調表示しないことによって) エラーをより明確に示す構文の強調表示とタグ署名を提供する (私の) プラグインをいくつか使用することもできます。

于 2009-08-02T08:47:51.230 に答える
6

特にコピー/カットアンドペーストの場合、ビジュアルモードを使用すると、他のエディターからの適応がはるかに簡単になります。したがって、私が通常カットアンドペーストする方法は次のとおりです。

  • Esc-挿入モードを終了します(すでに通常モードになっている場合はスキップします)
  • v-ビジュアルモードをオンにします
  • ファイル内を移動して、必要なテキストを選択します。ビジュアルモードでは、選択されている文字が表示されます。いくつかの単語については、w便利eですb(次の単語の先頭、次の単語の末尾、この/前の単語の先頭にそれぞれ移動します)。
  • d-テキストを切り取ります(テキストyをコピーする場合に使用します)
  • テキストを移動したい場所に移動します
  • p-貼り付け(これは現在の文字の後にP貼り付け、現在の文字の前に貼り付けます。

Vまた、カーソルが行上にある場合は常に、行全体を自動的に選択するビジュアルモード(行)に入るのに使用すると便利です。

于 2010-03-16T15:42:09.917 に答える
6

http://www.viemu.com/a-why-vi-vim.htmlは優れた支持記事です。.コマンドを使用して最後の編集を繰り返すことの威力を説明しています。

コピー/カット&ペースト。私はいつもそれをします。すべての従来のエディターでは、左手で Shift キーを押し、右手でカーソルを移動してテキストを選択します。次に、Ctrl+C でコピーし、カーソルを移動して Ctrl+V で貼り付けます。

Vim では恐ろしいことです:

* yy to copy one line (you almost never want the whole line!)
* [number xx]yy to copy xx lines into the buffer. But you never know

まさにあなたが望むものを選択したかどうか。私はしばしば [number xx]dd を実行しなければならず、それから元に戻す必要があります!

他の回答の方がよく説明されていると思いますが、あなたは間違っています。視覚モードを使用してヤンクまたは削除するテキストを選択することがよくありますが、これは shift + select の例に似ていますが、手がホーム行を離れないため、ここでは Vim が明らかに有利です。yy は素晴らしいコマンドですが、行全体をヤンクしたい場合は代わりに Vy をよく使用します。

于 2010-03-16T15:53:56.120 に答える
5

実際、私は常にバッファを失っていたので、通常、ある範囲の行をコピーする方法は、それを一時ファイルに書き込んでから、適切な場所で読み込むことです。

例えば

ka(マークを設定)

'a 、。w!t(マークからすべてをファイルtにコピーします)

..カーソルを移動します..

:.rt(現在のスポットにtを読み込みます)。

これはおそらく、バッファを使用するよりもキーストロークが少なく、追跡が容易であり、ファイルを長期間貼り付けることができます。私は通常、速度のためにファイルに1文字の名前を使用します。

これが高速である主な理由は、カーソルを自分の周りに移動するには、検索機能「/」を使用し、目的の場所に到達する前にパターンの別のオカレンスに遭遇した場合は「n」を使用することです。

于 2009-12-22T19:04:34.087 に答える
5

ショートカットをさらにショートカットするのはどうですか?


あなたの .vimrc に入れてください:
nnoremap ; :

このようにして、コマンドモードに入るのがずっと簡単 になり;qます。;w:q:w

3 回ではなく 2 回のキーストロークで、非常に頻繁に必要になります。


sysadmins にとっては悪いことです。なぜなら、どこにいてもすべてのボックスで同じにするために、すぐに同じ機能を提供する必要があるからです。

しかし、vi を使用するプログラマにとっては大きな改善です。

于 2012-06-28T12:51:26.200 に答える
4

レジスターの内容を検索できます。

xあなたのレジスタが含まれていると仮定します

検索する文字列

この文字列を検索するには、通常モードで入力する必要があります
/CTRL-rxENTER

登録内容を貼り付けますx

于 2012-06-28T14:16:49.353 に答える
4

grokking vi に関する素晴らしい回答に加えて、vimはvi コマンドをより使いやすくする非常に vi に似た機能をいくつか追加していることに注意してください。最初に頭に浮かぶのはテキスト オブジェクトです。{!}fmt現在の段落を再フォーマットする代わりに!apfmt、同じことを行います。最初に、現在の段落aであるテキスト オブジェクトを選択するように指定することによって機能します。同様に、現在の文字列リテラルを変更するには (たとえば、to )、 (直前の直前に移動、次の直前まで変更barを挿入) の代わりに、次のように言うことができます: (最も内側の) 引用符内を変更し、barを挿入します。foobarT"ct"bar""ci"bar

移動コマンドではなく、テキスト オブジェクトの観点から考えると、非常に便利です。

于 2010-04-01T13:25:20.687 に答える
3

一連の vim コマンドggVGg?は、Rot13 暗号を現在のドキュメントのテキストに適用します。

Gung vf zl zbfg cebqhpgvir fubegphg fvapr V nyjnlf glcr va Ebg13.

于 2012-07-07T02:15:58.997 に答える
3

Vim のトリックはたくさんありますが、今のところ、私が本当に楽しんでいるのはCtrl+です。Aたまたま、配列インデックスをハードコーディングする st**d コードを扱っているからです。

于 2011-10-14T12:43:51.083 に答える
2

行の一部をすばやく切り取って上書きする:

行を編集しているときの非常に一般的な作業は、現在のカーソル位置から特定の場所までを切り取り、新しい内容を上書きすることです。

次のコマンドを使用できます。

ct<identifier>フォワードカット用。

cT<identifier>バックカット用。

カットしたい行の文字はどこにありますか。

例:これが編集したい行で、カーソルが にあるとしましょうI

Hi There. I am a Coder and I code in : Python and R.

まで切り取っ:て で上書きしたい場合はI am a programmer、次のようct:に入力しI am a programmerます。これにより、次のようになりますHi There. I am a programmer: Python and R

行のクイック削除部分:

上記と同様に、次のコマンドは、現在のカーソル位置から「識別子」までのコンテンツを削除します

dt<identifier>前方削除用

dT<identifier>後方削除用

これがあなたにも役立つことを願っています。

于 2012-07-20T13:35:30.577 に答える
1

巧妙なタブ補完 ^^

http://vim.wikia.com/wiki/Smart_mapping_for_tab_completion

于 2012-07-18T07:47:43.767 に答える
0

nnoremap q; q:私の .vimrc では、複雑な検索と置換を作成するときにフローを維持します。

于 2012-07-18T13:03:30.890 に答える