あなたのお母さんがあなたに言わなかったVimの暗いコーナーは何ですか?[閉まっている]


799

よくあるトリック、特に「Vim + ctagsのヒントとトリック」について人々が話す質問はたくさんあります。

ただし、Vimの初心者がかっこいいと思う一般的に使用されるショートカットについては触れません。私は、私たちの99%が聞いたことも夢にも思ったことがないことを知っていると経験豊富なUnixユーザー(開発者、管理者、その両方など)について話している。彼らの仕事をより簡単にするだけでなく、クールでハッキーなもの。結局のところ、Vimは世界で最も暗いコーナーが豊富なOSに常駐しているため、少数の特権者だけが知っていて、私たちと共有したいという複雑さが必要です。


10
:セックススプリットウィンドウと開いている統合ファイルエクスプローラー(水平分割)
user3218088

2
この質問はかなり建設的であるように思われます-投票の数を見て...、再オープンに投票しました-おそらくさらにクールな回答が届きます-有用であれば投票することができます-したがって、SOFにより多くの価値を与えます。投票で回答を注文するたった5分でたくさんのクールなことを学びました...ここで本当に価値のあるもの、なぜこの価値のあるものを閉じるのですか?これはどのように建設的ではないのですか?
jhegedus

7
この質問が終了していることはばかげています。合法性について話します。
鱗翅類

2
この質問は非常に建設的だと思いますが、Quoraではより適切です。
Diogo Melo

2
なぜこの質問を削除する票が2(今のところ)あるのですか?それはおそらく何をするでしょうか?
Akavall 2017年

回答:


782

Vimユーザーの99%が知らないものではないかもしれませんが、これは私が日常的に使用しているものであり、Linux + Vimパワーユーザーは知っておく必要があります。

基本的なコマンドですが、非常に便利です。

:w !sudo tee %

書き込み権限のないファイルを編集する前に、sudoを忘れることがよくあります。そのファイルを保存してアクセス許可エラーが発生した場合、一時ファイルに保存して再度コピーする必要なしにファイルを保存するために、そのvimコマンドを発行するだけです。

明らかに、sudoがインストールされたシステム上にあり、sudo権限を持っている必要があります。


116
間違いなく、それはvimをrootとして実行するより優れています!賛成です!
アラファンギオン2009

27
初心者の場合、Tシャツは正確に何をしますか?誰かがこのコマンドを解析してくれませんか?
AndyL 2010年

41
cmap w !! w!sudo tee%
jm666

58
走ってはいけませんsudo vim。代わりにEDITOR、vimとしてエクスポートして実行する必要がありますsudoedit
ヘラルドマーセット2011

8
@maximus:vimは%を現在のバッファー/ファイルの名前に置き換えます。
migu

617

私が最近発見したもので、とてもクールだと思いました:

:earlier 15m

文書を15分前の状態に戻します。ロールバックする時間の長さについては、さまざまな引数をとることができ、元に戻すレベルに依存します。反対のコマンドで逆にすることができます:later


6
@skinp:取り消してから、取り消した状態からさらに変更を加えると、そのやり直し履歴が失われます。これにより、元に戻すスタックにない状態に戻ることができます。
ephemient 2009

39
また、時間を前後に移動するg +およびg-も非常に便利です。これは元に戻す/やり直しスタックよりもはるかに強力です。元に戻す後に何かを行っても履歴が失われないためです。
エティエンヌピエール

9
元に戻した後で変更を加えても、やり直し履歴は失われません。簡単にアクセスできないだけです。Gundo.vimのような、これを視覚化するのに役立つプラグインがあります
Ehtesh Choudhury

559
うわー、だから私は今やることができ:later 8hて今日は終わりましたか?:P
Igor Popov

7
コマンドは、vimで少なくとも15分を費やすことを想定しています!
e2-e4 2014

411

:! [command] Vimにいる間に外部コマンドを実行します。

ただし、コロンの後にドットを追加する :.! [command]と、コマンドの出力が現在のウィンドウにダンプされます。それは: . !

例えば:

:.! ls

これは、入力しているドキュメントに現在の日付を追加する場合などによく使用します。

:.! date

74
これは:r!とよく似ています。私が知る限り、唯一の違いは:r!新しい行を開きます、:。!現在の行を上書きします。
saffsd 2009年

6
の代わりに、:.!date「日付」を行に書き込んで実行することもできます!$sh(または、コマンドの後に空白行を続けて実行します!jsh)。これにより、行が「sh」シェルにパイプされ、コマンドの出力に置き換えられます。
hlovdal、2010年

43
:.!は実際にはの特殊なケースで:{range}!.コマンドを使用して行の範囲(範囲がの場合は現在の行)をフィルタリングし、それらの行を出力に置き換えます。私が見つけ:%!、全体のバッファをフィルタリングするために有用。
ネフルビル

2
@sundar:sed同様の組み込みed/ exコマンドを使用できるのに、なぜに行を渡すのですか?:.s/old/new/g;-)を実行してみてください
jabirali 10/07/13

4
また、「!」「y」、「d」、「c」などのようになります。つまり、次のことができます:!!、number !!、!motion(たとえば! shell_commandの出力)。
aqn 2013

312

はっきりとはわかりませんが、非常に便利な「削除」コマンドがいくつかあります。

  • diw 現在の単語を削除するには
  • di( 現在の括弧内で削除するには
  • di" 引用符の間のテキストを削除するには

その他は上で見つけることができます :help text-objects


8
dab "arounbブラケットの削除"、中括弧の周りのdaB、xmlタイプのタグのt、通常のコマンドとの組み合わせは予想どおりcib / yaB / dit / vatなど
sjh

15
@Masi:yi(va(pは括弧のみを削除します
Don Reba

42
これが私がVimにとどまる最大の理由かもしれません。これと同等の「変更」コマンド:ciw、ci(、ci "、およびdt <space>およびct <space>
thomasrutter 2009

4
@thomasrutter:なぜdt <space>の代わりにdW / cWを使わないのですか?

9
@Masi:サラウンドプラグインで:DS(。

237

deを押して、単語の最後までをすべて削除します。あなたの心の欲望で。

ci(xyz [Esc] -これは奇妙なものです。ここで、「i」は挿入モードを意味しません。代わりに括弧内を意味します。したがって、このシーケンスは、あなたが立っている括弧内のテキストを切り取り、それを次のように置き換えます"xyz"。これは、角括弧と図の括弧内でも機能します。ci[またはci {を実行するだけです。当然、diを実行できます(何も入力せずにすべてのテキストを削除したい場合)。a代わりにi、かっこ内のテキストだけでなく、かっこも削除したい。

ci " -現在の引用符でテキストを切り取ります

ciw-現在の単語を切り取ります。これ(は、で置き換えられることを除いて、前のものと同じように機能しwます。

C-残りの行を切り取り、挿入モードに切り替えます。

ZZ-現在のファイルを保存して閉じます(現在のタブを閉じるにはCtrl-F4よりも高速です!)

ddp-現在の行を1行下に移動

xp-現在の文字を1つ右に移動する

U-大文字なのでviwU、単語を大文字にします

-ので、ケースをスイッチviw~単語全体の筐体が逆になります

Ctrl + u / Ctrl + dで、画面を画面の半分だけ上下にスクロールします。これは、2つの画面の関係を簡単に確認できるため、通常の全画面ページングよりも便利なようです。それでも一度に画面全体をスクロールしたい人のために、Ctrl + fでForward、Ctrl + bでBackwardがあります。Ctrl + YおよびCtrl + Eは、一度に1行下または上にスクロールします。

クレイジーですが非常に便利なコマンドはzzです。このコマンドは画面をスクロールして、この行を中央に表示します。これは、作業中のコードを注意の中心に置くのに最適です。兄弟コマンド-ztおよびzb-この行をスクリーン上の一番上または一番下の行にしますが、それほど有用ではありません。

は、一致する括弧を見つけてそこにジャンプします。

-単語の末尾にカーソルから削除(あなたも行うことができますdE次のスペースまで削除します)

bde-現在の単語を左から右の区切り文字から削除する

df [スペース] -次のスペースまで削除します

dt。-次のドットまで削除

dd-この行全体を削除します

ye(またはyE) -ここから単語の終わりまでのテキストをヤンク

ce-単語の終わりを切り取る

bye-現在の単語をコピーします(「こんにちは」は何をしているのだろうと思います!)

yy-現在の行をコピーします

cc-現在の行を切り取りますS。代わりに行うこともできます。また、s現在の文字をカットして挿入モードに切り替える下側のキャップもあります。

viwyまたはviwc。現在の単語をヤンクまたは変更します。w後続の各単語を選択し続けるために複数回ヒットし、b後方に移動するために使用します

vi { -図の括弧内のすべてのテキストを選択します。va {-{}を含むすべてのテキストを選択

vi(p-()内のすべてを強調表示し、貼り付けたテキストで置き換えます

bおよびeは、Ctrl + Arrowsが通常行うのと同様に、カーソルを単語単位で移動します。ただし、単語の定義は少し異なります。連続する複数のDelmiterが1つの単語として扱われるためです。単語の途中から開始する場合、bを押すと常に現在の単語の先頭に移動し、連続する各bは次の単語の先頭にジャンプします。同様に、覚えやすくe、カーソルを現在の単語とそれに続く各単語の終わりに移動します。

類似b/ e資本、BおよびE区切り文字としてのみ空白を使用してカーソルを単語ごとの単語を動かします。

大文字D(深呼吸する)通常のエディターのShift + End / Delと同じように、カーソルの右側の行の残りを削除します(2つのキーを押す-Shift + D-3ではなく通知)


15
ztは、関数またはクラス定義の開始時に使用すると非常に便利です。
ニックルイス

9
vityvitcに短縮することが可能yitcitそれぞれ。
Nathan Fellman、

33
あなたが「カット」と呼んでいるものはすべて「変更」です。例:Cは行末まで変更されます。Vimの「カット」に相当するのは「削除」で、d / Dで行われます。changeとdeleteの主な違いは、deleteは通常モードのままにしますが、changeは一種の挿入モードになります(ただし、変更全体がで繰り返されるため、便利なchangeコマンドのままです.)。
Laurence Gonsalves、2011

11
これは多くの人が知らないことのリストのためだと思いました。yyは非常に一般的です。
Almo、2012年

19
byeあなたが単語の最初の文字にいるときは機能しません。yiw常にそうします。
Andrea Francia

204

ほとんどのVimチュートリアルではめったに見つかりませんが、(少なくとも私にとっては)非常に便利です。

g; and g,

チェンジリスト内を移動(前方、後方)します。

使い方をお見せしましょう。コードまたは文字列をコピーして貼り付ける必要がある場合があります。たとえば、CSSファイルの16進数のカラーコードを検索するため、検索してジャンプし(一致する場所を気にしない)、コピーしてから(g;)に戻ります。ようやくコードを編集して貼り付けました。マークを作成する必要はありません。よりシンプル。

ちょうど私の2セント。


29
同様'.に、最後に編集された行に`.移動し、最後に編集された位置に移動します
aehlke

8
Ctrl-OとCtrl-I(タブ)は同様に機能しますが、同じにはなりません。:jumpsまたは:juを実行して表示できる「ジャンプリスト」内で前後に移動します。詳細については、:helpジャンプリストを実行してください
Kimball Robinson

17
:changes
Kimball Robinson

便利なホットダン。私はこのために常に<C-o>/ を使用します<C-i>-または自分の場所をマークします。
Wayne Werner

187
:%!xxd

vimを16進エディターにします。

:%!xxd -r

元に戻す。

警告:バイナリ(-b)で編集しないと、ファイルが破損する可能性があります。–コメントのJosh Lee。


9
そして、どのようにそれを元に戻しますか?
クリスチャン、

40
:!xxd -r // HEXから戻るには
Naga Kiran

21
私は実際にはそれ:%!xxd -rを元に戻すことだと思います
Andreas Grech

@JoshLee:改行をトラバースしないように注意している場合、-bオプションを使用しない方が安全ですか?ので、私は聞いて、時々私は、六角変更をしたいが、私はそうするために、ファイルを閉じて再度開く必要はありません。
dotancohen 2013年

4
@dotancohen:ファイルを閉じたり再度開いたりしたくない場合は、次のようにできます:set binary
Bambu


119

場合によっては、.vimrcの設定がプラグインまたは自動コマンドによって上書きされることがあります。これをデバッグするには、:verboseコマンドを:setと組み合わせて使用​​すると便利です。たとえば、cindentが設定/設定解除された場所を特定するには:

:verbose set cindent?

これは次のようなものを出力します:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

これはマップとハイライトでも機能します。(これを指摘してくれたjoeytwiddleに感謝します。)たとえば:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim

8
優れたヒント-私が今日探していたもの。
Artem Russakovskii

優秀なチップマン!どのようにしてこれらのマニアックなものを知るようになりますか?
Rafid、2011年

1
:verboseキーマップまたはハイライトが最後に定義された場所を見つける前nmap lまたはhighlight Normal見つけるためにも使用できます。デバッグに非常に役立ちます。lNormal
joeytwiddle 14

@joeytwiddleありがとうございます!その情報を回答に追加しました。
ローレンスゴンサルベス2014

カスタムマッピングの作成に取り掛かると、これによってお尻が何度も保存されます。おそらくここ(IMO)で最も便利なものの1つです。
SidOfc 2017


98

これがダークコーナーっぽいものとしてカウントされるかどうかはわかりませんが、私はそれを学んだだけです...

:g/match/y A

「マッチ」を含むすべての行を"a/にヤンク(コピー)します@aレジスターに。(Avim のように大文字を使用すると、以前のレジスターの内容を置き換えるのではなく、ヤンキングが追加されます。)最近、Internet Explorerスタイルシートを作成するときによく使用しました。


これは見たことがないので、数えます:)

良いですね。聞いたことがない...役に立つかもしれない:P
skinp

5
:g!を使用できます。パターンに一致しない行を見つけるには、例:g!/ set / normal dd(setを含まないすべての行を削除)
tsukimi

3
時々、tsukimiが言ったことを実行して、パターンに一致しない行を除外する方が良い場合があります。ただし、そのコマンドの省略形::v/PATTERN/d説明::vはの省略形で:g!あり、この:gコマンドはすべてのexコマンドを行に適用します。:y[ank]動作し:normalますが、ここでは、最も自然なことはただ:d[elete]です。
pandubear 2013年

また、実行することもできます。:g/match/normal "Ayyこのnormalキーワードを使用すると、通常モードのコマンドを実行するように指示することができます(おそらく、より慣れているでしょう)。
キンボールロビンソン

93

:commandの履歴を見たいですか?

q:

次に、参照して編集し、最後にコマンドを実行します。

2つのファイルに同様の変更を加え、それらの間で切り替えを行ったことがありますか?(たとえば、ソースファイルとヘッダーファイル?)

:set hidden
:map <TAB> :e#<CR>

次に、それらのファイル間を前後にタブ移動します。


131
私はいつもq:偶然に当たりました...
ジョシュリー

11
または、exエディター(:)からCTRL-fを実行して、コマンド履歴ウィンドウをポップアップできます。
ジェイソン・ダウン

6
@jleedev私も。誤って使いすぎたからといって、このコマンドはほとんど嫌いです。
bradlis7

9
q /とq?検索パターンに対して同様のことを行うために使用できます。
bpw1621、2011

5
:または/(またはコマンドモードのときはいつでも)の後に<Cf>を押すと、同じ履歴メニューが表示されます。したがって、qを再マッピングできます。誤って大量にヒットしても、この素晴らしいモードにアクセスできます。
idbrii '23

82

たとえば、VimはURLを開きます

vim http://stackoverflow.com/

参照のためにページのソースをプルアップする必要がある場合に便利です。


2
私にとって、それはソースを開かなかった。代わりに、elinksを使用してレンダリングされたページをバッファーにダンプし、それを開きました。
IvanVučica10年

このコマンドを実行するとエラーが発生します
Dzung Nguyen

5
最後にスラッシュを付けるとより効果的に機能します。きちんとしたトリック!
トーマス

@Vdt:エラーを投稿すると便利です。これが「エラー(netrw)wgetもフェッチコマンドも使用できない」の場合は、PATH環境変数からこれらのツールのいずれかを使用できるようにする必要があることは明らかです。
Isaac Nequittepas 2013年

これは、貼り付けサービスにリンクを送信し、構文の強調表示を選択するのを忘れたときに特に便利です。通常、 "&raw"を追加した後、vimでリンクを開くだけです。
Dettorer 2014年

68

マクロは他のマクロを呼び出すことができ、自分自身を呼び出すこともできます。

例えば:

qq0dwj@qq@q

...ファイルの最後まで、すべての行から最初の単語を削除します。

これは非常に単純な例ですが、vimの非常に強力な機能を示しています


2
マクロが繰り返されることを知りませんでした。涼しい。注:qxは、レジスターxへの記録を開始します(レジスターqにはqqを使用します)。0は行の先頭に移動します。dwは単語を削除します。jは1行下に移動します。@qは再びマクロを実行します(ループを定義します)。しかし、最後の "q"で記録を終了するのを忘れて、@ qと入力して実際にマクロを実行しました。
キンボールロビンソン

2
ネストされた再帰的なマクロとして、それは意図的なものだと思います。
Yktula

7
qqqqqifuu<Esc>h@qq@q
ヘラルドマーセット

6
これを実行する別の方法は、1行に変換を行うマクロをレジスターaに記録し、Vで:normal! @a一連の行を行ごとに強調表示して、選択範囲のすべての行にマクロを適用することです。
ネイサンロング、

この投稿は、再帰的なVIMマクロをグーグルで見つけました。VIMプロセスを強制終了する以外に、マクロを停止する方法を見つけることができませんでした。
dotancohen 2013年

55

あなたはPerlと/またはRubyサポートがでコンパイルした、と仮定する:rubydo:perldoして、範囲(バッファ全体デフォルト)内のすべての行にRubyやPerlのワンライナーを実行する$_現在の行のテキスト(マイナス改行)に結合します。操作する$_すると、その行のテキストが変更されます。

これを使用して、スクリプト言語で簡単に実行できる特定のことを実行できますが、Vimビルトインを使用するとそれほど明白ではありません。たとえば、行内の単語の順序を逆にするには:

:perldo $_ = join ' ', reverse split

各行の終わりに8文字(AZ)のランダムな文字列を挿入するには:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

一度に1つの行のみを操作することに制限されており、改行を追加することはできません。


指定した行でのみperldoを実行したい場合はどうなりますか?または選択した数行?
-Sujoy

5
他のコマンドと同様に、範囲を指定できます。たとえば:1,5perldoは1〜5行目でのみ動作します。
ブライアンカーパー、

$ _ + = '\ nNEWLINE !!!' 現在のものの後に改行を取得するには?
グレッグ

悲しいことに、それは行の終わりにファンキーなコントロール文字を追加するだけです。次に、Vimの検索/置換を使用して、これらのすべての制御文字を実際の改行に変更できます。
ブライアンカーパー、

3
同様に、pydopy3doのpythonのための仕事あなたがでコンパイルに必要なサポートを持っている場合。
デレチョ

54

^ Oおよび^ I

古い/新しい位置に移動します。(検索、コマンドの移動などによって)ファイル内を移動しているとき、これらの「ジャンプ」をvimで実行するため、これらのジャンプを後方(^ O-古い場合はO)と前方(^ I-キーボードのIのすぐ隣)に繰り返すことができます。 )。コードを記述し、多くの検索を実行するときに非常に便利です。

最後に挿入モードを停止した位置に移動します。私は頻繁に編集してから何かを検索します。編集場所に戻るには、giを押します。

gf

ファイル名にカーソルを置き(インクルードヘッダーファイルなど)、gfを押すとファイルが開きます

gF

gfに似ていますが、「[ファイル名]:[行番号]」の形式を認識します。gFを押すと[ファイル名]が開き、カーソルを[行番号]に合わせます。

^ Pおよび^ N

編集中のテキストの自動補完(^ P-前の一致と^ N次の一致)

^ X ^ L

編集は同じ行まで完了します(プログラミングに役立ちます)。コードを記述した後、同じコードがファイルのどこかにあることを思い出します。^ X ^ Lを押すだけで、完全な行が完成します

^ X ^ F

完全なファイル名。"/ etc / pass"と書きますね。ファイル名を忘れました。^ X ^ Fを押すだけで、ファイル名が完成します

^ Zまたは:sh

一時的にシェルに移動します。簡単なバッシングが必要な場合:

  • ^ Z(viをバックグラウンドにする)を押して元のシェルに戻り、fgを押してvimに戻ります
  • :shを押してサブシェルに移動し、^ D / exitを押してviに戻ります

^X^F私の不満は、ファイル名に=記号が含まれていることです。これにより、多くの場合に腐敗したことになります(iniファイル、makefileなど)。私はse isfname-==その迷惑を終わらせるために使用します
sehe

3
+1組み込みのオートコンプリートは、発見されるのを待っているところです。
joeytwiddle 14

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

2
これが何に適しているのかわかりません(冗談の答えのように見えます)。他の誰かが私を啓発できますか?
ライアンエドワーズ

2
vimを開いて「:for i in range(1,255)| .put = '10 .0.0。 '。i | endfor」を実行
codygman

2
@RyanEdwards多分/ etc / hostsファイルを埋め込む
ルスラン

26
これは素晴らしい答えです。IPアドレスの作成に関するビットではなく、VIMがコマンド内のforループを使用できることを意味するビット。
dotancohen 2014年

4
exモードなし:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap 2017

47

これは、現在のファイルを別のエンコーディングで再度開くのに便利です。

:e ++enc=cp1250 %:p

レガシーエンコーディングを使用する必要がある場合に役立ちます。サポートされているエンコーディングは、encoding-values(を参照help encoding-values)の表にリストされています。同様のことがでも機能する++ffため、初めて間違った場合にWindows / Unixの行末でファイルを再び開くことができます(を参照help ff)。


この種のものを使用する必要はありませんでしたが、確かにトリックの武器を追加します...

素晴らしいヒント、ありがとう。ボーナスポイントについては、一般的な有効なエンコーディングのリストを追加します。
Adriano Varoli Piazza

2
今日はこれを使用しましたが、「%:p」を指定する必要はなかったと思います。ファイルを開くだけで、:e ++ enc = cp1250で十分でした。I
IvanVučica2009

:set encoding = cp1250は同じ効果がありますか?
2009

1
`:E + B%」はバイナリモード(改行のないいじる)で再開のために同様に有用である
直感

47

==と入力すると、上の行に基づいて現在の行のインデントが修正されます。

実際には、1つの=記号に続けて任意の移動コマンドを実行できます。= {動き}

たとえば、一致する中括弧間を移動する%移動を使用できます。次のコードの{にカーソルを置きます。

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

そして=%を押して即座にこれを取得します:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

代わりに、コードブロック内で= a {を実行することもできます。


うーん、私はインデントについてこれを知りませんでした。
Ehtesh Choudhury、

通常、中括弧に正確に置く必要はありません。依存度が低いという理由だけで=}、私は頻繁に考えましたvaBaB=。また、v}}:!astyle -bj私のコードスタイルによく一致しますが、シンプルであなたのスタイルに戻すことができます%!astyle -aj
sehe

7
gg=G何かを貼り付けるときは、かなりきれいです。
キリアス2013年


@kyriasああ、私はそれのようにやってきたggVG=
ブレーデンベスト

42
imap jj <esc>

7
では、jjをどのように入力しますか?:P
hasen

6
どのくらいの頻度でjjと入力しますか?少なくとも英語では?
ojblass 2009

50
代わりにcapslockをescに再マップしました。私のマッピングはOS全体でしたが、誤ってヒットすることを心配する必要がないという追加の利点があります。唯一の欠点は、人々に怒鳴るのが難しいことです。:)
Alex

7
@アレックス:間違いなく、キャプスロックは死です。「待って、wtf?ああ、それはZZだったのか……」
2010年

5
@ojblass:何人がVimのmatlabコードを正しく使用したかはわかりませんがii、とjjは複素数用に予約されているためi、一般的にカウンター変数に使用されjます。
brianmearns

37

かなり小さなIDEエディターが列の転置を行うところを見てみましょう。

:%s/\(.*\)^I\(.*\)/\2^I\1/

説明

\(そして、\)する方法です覚えて正規表現の土地で何かを。そして\1\2などは記憶されたものを取得する方法です。

>>> \(.*\)^I\(.*\)

^I(tab)の後にすべてが続くすべてを覚えておいてください。

>>> \2^I\1

上記のものを「2番目に覚えたもの」に置き換え、その後に「1番目に覚えたもの」を続けます-基本的に転置を行います。


4
タブで区切られた列のペア(セパレータは任意、すべて正規表現です)を相互に切り替えます。
混沌

39
これは単なる正規表現です。多くのIDEには正規表現による検索と置換があります。
rlbond 2009

7
@rlbond-IDEのregexエンジンがいかに優れているかにかかっています。Vimの正規表現はかなり強力です。その他..それほど多くはない。
romandas

3
*は貪欲になるので、この正規表現は2列しかないことを前提としています。貪欲にしない場合は、*の代わりに{-}を使用します({}乗数の詳細については、:help non-greedyを参照してください)
Kimball Robinson

4
これは実際にはかなり単純な正規表現であり、グループの括弧をエスケープするだけで複雑に見えます。
mk12

30

正確には秘密ではありませんが、次のマッピングを.vimrcファイルに入れたいので、いつでも "-"(マイナス)を押してファイルエクスプローラーを開き、編集したファイルに隣接するファイルを表示できます。ファイルエクスプローラーで、別の "-"を押して1つのディレクトリを上に移動し、複雑なディレクトリ構造(最近のMVCフレームワークで使用されているものなど)をシームレスに参照できます。

map - :Explore<cr>

これらは誰かにとっても役に立つかもしれません。画面をスクロールすると同時にカーソルを進めるのが好きです。

map <c-j> j<c-e>
map <c-k> k<c-y>

タブナビゲーション-タブが大好きで、タブ間を簡単に移動する必要があります。

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Mac OS Xのみ:Safariのようなタブナビゲーション:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>

:Explore
RomanPlášilOct

こんにちはローマン、これはまさにこのマッピングが行うことですが、それを「ホットキー」に割り当てます。:)
KKovacs、2009年

27

私は「sudo bash」を使うのが好きで、私のシステム管理者はこれを嫌っています。彼は「sudo」をロックダウンしたため、少数のコマンド(ls、chmod、chown、viなど)でのみ使用できましたが、とにかくvimを使用してルートシェルを取得することができました。

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

9
FWIW、sudoedit(またはsudo -e)は特権ファイルを編集しますが、通常のユーザーとしてエディターを実行します。
RJHunter 2009

12
ええ...私もあなたが嫌い​​です;)rootとしてあまりにも多くのコマンドを実行する癖がない限り、ルートシェルが必要になるのは非常にまれです。
私たちは全員モニカです

5
なぜあなたのシステム管理者はあなたにルートさえ与えるのですか?:D
d33tah 2014年

26

多くの場合、編集中に現在のディレクトリを変更するのが好きなので、パスを少なく指定する必要があります。

cd %:h

これは何をしますか?そしてそれはautchdirで動作しますか?
レナード

2
私はそれがautochdirを一時的にオーバーライドするだろうと思います(バッファを再び切り替えるまで)。基本的に、ディレクトリを現在のファイルのルートディレクトリに変更します。autochdirよりも少し手動で制御できます。
ホタルブクロ

1
:set autochdir //これも同じ機能を果たし、現在のディレクトリをバッファー内のファイルのディレクトリに変更します
Naga Kiran

25

プロジェクトで作業するときに多くのウィンドウを使用することが多く、サイズ変更が必要になる場合があります。これが私が使うものです:

map + <C-W>+
map - <C-W>-

これらのマッピングにより、現在のウィンドウのサイズを増減できます。非常にシンプルですが、高速です。


16
Ctrl-W =もあり、ウィンドウを同じ幅にします。
ビル・リンチ

2
数字の前にVimで複数回アクションを実行できることを忘れないでください。したがって、現在のウィンドウの高さを8行拡張するには:8 <CW> +
joeytwiddle

23

あいまいな機能ではありませんが、非常に便利で時間を節約できます。

開いているバッファ、タブ、マーカー、その他の設定のセッションを保存する場合は、次のコマンドを発行できます。

mksession session.vim

以下を使用してセッションを開くことができます。

vim -S session.vim

5
:so session.vimvimの内部にすることもできます。
TankorSmash

22
:r! <command>

外部コマンドの出力をバッファに貼り付けます。

いくつかの計算を行い、結果をテキストで直接取得します。

:r! echo $((3 + 5 + 8))

Makefileを書き込むときにコンパイルするファイルのリストを取得します。

:r! ls *.c

あなたがウィキペディアで読んだその事実を調べないでください、それをあなたが書いている文書に直接貼り付けてください:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

14
挿入モードで^ R = 3 + 5 + 8を使用すると、式の値(3 + 5 + 8)をより少ないキーストロークでテキストに挿入できます。
Sudhanshu

現在の結果とは異なるバッファに結果/出力を取得するにはどうすればよいですか?
dcn 2011年


21

F5をマップして、バッファーをすばやくROT13します。

map <F5> ggg?G``

ボスキーとして使用できます:)。


14
私はあなたがを書いているのわかりません...しかし、確かに、私のボスは、ROT13 jumbleを書くのを見たときにもっと好奇心が強いでしょう:)
sehe

またはあなたの友人を偽装しますnmap i ggg?G`` 。または悪魔:nmap i ggg?G``i
romeovs 14年

1
@romeovs 2番目は無限ループです。nnoremapを使用してください
Amit Gold

19

私はNSFAQを介して今日これを見つけました:

コードのコメントブロック。

CTRL-Vを押して、Blockwise Visualモードに入ります。

コメントするブロックをマークします。

I(大文字のI)を押して、行の先頭にコメント文字列を入力します。(// C ++の場合)

ESCキーを押すと、選択されたすべての行が//行の先頭に付加されます。


#を追加して、Rubyのコードブロックをコメント化しました。元に戻すにはどうすればよいですか。
Neeraj Singh、

3
もう一度ctrl + vを押して//をマークし、xを押して「コメント解除」することができます
nos

6
これにはNERDCommenterを使用します。
ZyX 2010年

1
コメントアウトされたコードは、おそらくコードに入力できる最悪のタイプのコメントの1つです。素晴らしいブロック挿入のより良い使用法があります。
Braden Best

1
@Pieコメントアウトされたコードはデッドコードだからです。デッドコードは有用な目的を果たしておらず、混乱を招いています。あなた後で持ち帰りたいかもしれないコードを保存していると思いますが、常にもっと良い方法があります。元に戻す履歴を使用したり、ファイルを複製したり、この機能が組み込まれたgitを使用したりできます(git checkout)。ブロック挿入のより良い使用法としては、根本的なセットはありません。同じ場所に同じ文字のシーケンスを挿入したい複数の行があるときはいつでも使用します。
ブレーデンベスト

17

私はほとんどすべてのテキスト編集にvimを使用しているため、コピーと貼り付けを使用することがよくあります。問題は、デフォルトでvimがインポートされたテキストを貼り付けて歪めることがよくあることです。これを止める方法は使用することです

:set paste

データを貼り付ける前。これにより、混乱を防ぐことができます。

:set nopaste自動インデントを回復するには発行する必要があることに注意してください。事前にフォーマットされたテキストを貼り付ける別の方法は、クリップボードレジスタ(*および+:r!catです(貼り付けたフラグメントを^ Dで終了する必要があります)。

ハイコントラストの配色をオンにすると役立つ場合もあります。これは

:color blue

私が使用しているvimのすべてのバージョンで動作するわけではないことに気づきましたが、ほとんどのバージョンで動作します。


10
何らかの形の自動インデントが有効になっているため、「歪み」が発生しています。オプションのset pasteキーを使用または指定することpastetoggleは、これを回避する一般的な方法ですが、set mouse=aVimが表示するテキストのフラッドがマウスによってトリガーされる貼り付けであることを認識している場合と同じ効果を得ることができます。
jamessan 2009

1
gvimがインストールされている場合、(ディストリビューションがvimをコンパイルするオプションによって異なりますが)vimから*レジスタを介して直接Xクリップボードを使用できます。たとえば"*p、X xlipboardから貼り付けます。(これはターミナルvimでも機能しますが、別々の場合はgvimパッケージが必要になるだけです)
kyrias

2
レコードの@kyrias *PRIMARY(「ミドルクリック」)レジスタです。クリップボードがある+
ブレーデンベスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.