web-dev-qa-db-ja.com

あなたのお母さんがあなたに言ったことがないVimの暗いコーナーは何ですか?

よくあるコツ、特に「 Vim + ctagsのコツとコツ 」について話す人がたくさんいます。

しかし、私はVimに不慣れな誰かがかっこいいと思う一般的に使われるショートカットについて言及しません。私は99%の人が聞いたことも夢に見たこともない何かを知っていると思う、熟練したUnixユーザー(開発者、管理者など)について話しています。彼らの仕事を楽にするだけでなく、COOLやハッキングもあります。結局のところ、Vimは世界で最も暗黒の豊富なOSに常駐しているので、少数の特権だけが知っていて私たちと共有したいという複雑さを持つべきです。

782
Sasha

Vimユーザーの99%が知らないという人ではないかもしれませんが、私が毎日使用しているものであり、Linux + Vimのパワーユーザーなら誰でも知っている必要があります。

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

:w !Sudo tee %

書き込み権限がないファイルを編集する前に、Sudoを忘れてしまうことがよくあります。そのファイルを保存してパーミッションエラーが発生したときは、一時ファイルに保存してから再度コピーする必要なくファイルを保存するために、そのvimコマンドを発行するだけです。

あなたは明らかにSudoがインストールされたシステム上にいてSudo権限を持っていなければなりません。

766
skinp

最近発見したことで、すごくかっこいいと思いました。

:earlier 15m

ドキュメントを15分前の状態に戻します。ロールバックしたい時間の長さについてさまざまな引数を取ることができます。これは元に戻すレベルによって異なります。反対のコマンド:laterで逆にすることができます

601
Chad Birch

あなたがVimにいる間、:! [command]は外部コマンドを実行します。

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

例えば:

:.! ls

入力している文書に現在の日付を追加するなどの目的で、これを多用します。

:.! date
402
Jeffrey Knight

あいまいではありませんが、いくつかの "delete in"コマンドが非常に役に立ちます。

  • 現在のWordを削除するためのdiw
  • 現在のペイン内で削除するdi(
  • 引用符の間のテキストを削除するdi"

他のものは :help text-objects にあります。

307
dbr

deを押して、単語の末尾までをすべて削除します。あなたの心の願いで。

ci(xyz [Esc] - これは奇妙なことです。ここで、 'i'は挿入モードを意味するのではなく、かっこの内側を意味します。それで、このシーケンスは、あなたが立っている括弧の内側のテキストを切り取り、それを "xyz"に置き換えます。それはまた、角括弧と数字括弧の内側でも働きます - ci [またはci {を対応してやればいいのです。括弧も削除したいが括弧の中のテキストだけでなくaの代わりにiを実行することもできます。

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

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

C - 残りの行をカットして挿入モードに切り替えます。

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

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

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

U - 大文字なので、viwUはWordを大文字にします。

- 大文字と小文字が切り替わるので、viw~はWord全体の大文字と小文字を区別します

Ctrl + u/Ctrl + dページを半画面上下にスクロールします。これは、2つの画面がどのように関連しているかがわかりやすくなるため、通常のフルスクリーンページングよりも便利なようです。それでも一度に画面全体をスクロールしたい人には、進むにはCtrl + f、戻るにはCtrl + bがあります。 Ctrl + YとCtrl + Eは、1行ずつ上下にスクロールします。

クレイジーだが非常に便利なコマンドはzzです - これは画面をスクロールしてこの行を中央に表示させるためのものです。これは、作業中のコードを注意の中心に置くのに最適です。兄弟コマンド - ztとzb - はこの行を画面上の一番上または一番下の行にしますが、それほど役に立ちません。

は、一致するかっこを見つけてジャンプします。

de - カーソルの位置からWordの末尾までを削除します(dEを実行して次のスペースまで削除することもできます)。

bde - 現在のWordを左から右の区切り文字から削除します

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

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

dd - この行全体を削除する

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

ce - 単語の終わりを通り抜ける

bye - 現在のWordをコピーする( "hi"が何をするのか疑問に思う)

yy - 現在の行をコピーする

cc - 現在行を切ります。代わりにSを実行することもできます。現在の文字をカットして挿入モードに切り替える下限sもあります。

viwyまたはviwc。現在のWordをヤンクまたは変更します。後続の各Wordを選択し続けるにはwを複数回押します。後方に移動するにはbを使用します

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

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

bとeは、Ctrl + Arrowが通常するのと同じように、カーソルを1ワードずつ移動します。ただし、Wordの定義は少し異なります。連続する複数のデリミタが1つのWordとして扱われるためです。単語の途中から始める場合は、bを押すと常に現在の単語の先頭に移動し、連続するbを押すたびに次の単語の先頭に移動します。同様に、覚えやすいように、eはカーソルを現在の、そしてそれ以降の各Wordの終わりに移動します。

b/e、大文字のB、およびEと同様に、空白文字のみを区切り文字として使用して、カーソルをWord単位で移動します

大文字D(深呼吸)通常のエディタのShift + End/Delと同じように、カーソルの右側にある行の残りを削除します( 2つのキープレスに注意してください - Shift + D - 3の代わりに)

235
ultraman

私がほとんどのVimチュートリアルでめったに見つけることはありませんが、(少なくとも私にとっては)非常に役に立ちます。

g; and g,

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

使用方法を説明しましょう。 CSSファイルの中の16進数のカラーコードなど、コードや文字列をコピーして貼り付ける必要がある場合があるので、検索してジャンプし(一致部分を気にすることはしません)、コピーしてから(g;)にジャンプします。最後に貼り付けるためにコードを編集していました。マークを作成する必要はありません。もっと簡単です。

私の2代だけです。

199
:%!xxd

ヘックスエディタを起動します。

:%!xxd -r

元に戻す.

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

184
Bill Lynch
gv

最後の視覚的選択を再選択します。

121
AaronS

時々あなたの.vimrcの設定はプラグインかautocommandによって無効になるでしょう。これをデバッグするには、: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
119

これがまったくダークコーナーっぽいものになるかどうかはわからないが、私はそれを学んだだけで...

:g/match/y A

"match"を含むすべての行を"a/@aレジスタにヤンク(コピー)します。 (Aのように大文字にすると、前のレジスタの内容を置き換えるのではなく、vimのヤンクを追加するようになります。

98
sjh

:%TOhtml

現在のファイルのHTMLレンダリングを作成します。

97
N 1.1

あなたの:コマンド履歴を見たいですか?

q:

次に、ブラウズ、編集、そして最後にコマンドを実行します。

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

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

それからそれらのファイル間を行ったり来たりしてください。

89
MikeyB

例えばVimはURLを開きます。

vim http://stackoverflow.com/

参照用にページのソースを取得する必要があるときに便利です。

79
Cercerilla

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

例えば:

qq0dwj@qq@q

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

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

68
spence91

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

これを使って、スクリプト言語では簡単にできるが、Vimの組み込み関数を使用してもそれほど明白ではないことを行うことができます。たとえば、行内の単語の順序を逆にするには、次のようにします。

:perldo $_ = join ' ', reverse split

すべての行の末尾にランダムな8文字の文字列(A〜Z)を挿入するには

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

あなたは一度に1行に演技することに限られており、改行を追加することはできません。

55
Brian Carper

^ Oと^ I

古い/新しい位置に移動します。ファイルを移動しているとき(コマンドを検索したり移動したりすることによって)vimはこれらの "ジャンプ"を思い起こさせるので、これらのジャンプを逆方向(^ O - O for old)と順方向(^ I - キーボードのIのすぐ隣)で繰り返すことができます)私はそれがコードを書いてそしてたくさんの検索を実行するときそれが非常に役に立つと思います。

gi

挿入モードが最後に停止した位置に移動します。私は自分自身がよく編集してから何かを探しているのがわかります。編集場所に戻るにはgiを押します。

gf

ファイル名(例:ヘッダファイルを含む)にカーソルを置き、gfを押すとファイルが開きます。

gF

gfと似ていますが、 "[ファイル名]:[行番号]"という形式を認識します。 gFを押すと[ファイル名]が開き、カーソルが[行番号]に設定されます。

^ Pと^ N

編集中にテキストを自動補完する(^ P - 前の一致および^ N次の一致)

^ X ^ L

編集中は同じ行に完成します(プログラミングに役立ちます)。あなたはコードを書き、それからあなたはあなたがファイルのどこかに同じコードを持っていることを思い出します。 ^ X ^ Lを押すだけでフルラインが完成します。

^ X ^ F

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

^ Zまたは:sh

一時的にシェルに移動します。素早い攻撃が必要な場合:

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

これは、現在のファイルを別のエンコーディングで開くためのいいトリックです。

:e ++enc=cp1250 %:p

従来のエンコーディングを使用する必要がある場合に便利です。サポートされているエンコーディングはencoding-valuesの下の表にリストされています(helpencoding-valuesを参照)。同様のことが++ffでも機能するので、最初に間違えたときにWindows/Unixの行末でファイルを再び開くことができます(helpffを参照)。

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

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

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

実際には、=記号の後に任意の移動コマンドを続けることができます。 ={動き}

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

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

そして=%を押すと即座にこれが得られます。

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

別の方法として、コードブロック内で= a {を実行して、{文字の上に配置することもできます。

46
imap jj <esc>
41
Trumpi

いくつかのかわいいIDEエディタが列の転置を行うのを見てみましょう。

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

説明

\(\)はregex-landのrememberstuffの使い方です。そして\1\2などは記憶されたものをどのように検索するかです。

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

^I(tab)とそれに続くすべてのものを続けてください。

>>> \2^I\1

上記のものを「覚えている2番目のもの」と「覚えている1番目のもの」で置き換えます - 基本的に転置を行います。

37
chaos

厳密には秘密ではありませんが、次のマッピングを自分の.vimrcファイルに追加したいので、いつでも " - "(マイナス)を押してファイルエクスプローラを開いてファイルを表示できます私が編集したもの。ファイルエクスプローラで、私は別の " - "を押して一つのディレクトリを上に移動し、複雑なディレクトリ構造のシームレスなブラウジングを提供することができます(最近の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>
30
KKovacs

私は 'Sudo bash'を使うのが好きです、そして私のシステム管理者はこれを嫌います。彼は 'Sudo'をロックして、ほんの一握りのコマンド(ls、chmod、chown、viなど)でしか使えないようにしましたが、とにかく私はvimを使ってrootシェルを取得することができました。

bash$ Sudo vi +'silent !bash' +q
Password: ******
root#
27
too much php

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

cd %:h
26
rampion

私はプロジェクトで作業するとき、私はしばしば多くのウィンドウを使います、そして時々私はそれらをリサイズする必要があります。これが私が使っているものです:

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

これらのマッピングにより、現在のウィンドウのサイズを増減できます。それはとても簡単ですが速いです。

24
Taurus Olson

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

開いているバッファ、タブ、マーカー、その他の設定のセッションを保存したい場合は、以下を発行することができます。

mksession session.vim

あなたはあなたのセッションを開くことができます:

vim -S session.vim
22
mohi666

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

map <F5> ggg?G``

あなたはボスキーとしてそれを使うことができます:)。

21
jqno
:r! <command>

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

いくつかの数学を行い、テキストで直接結果を得る:

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

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

:r! ls *.c

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

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

私は NSFAQ で今日これを見つけました。

コードブロックにコメントを付けます。

Ctrlキーを押しながらVキーを押して、Blockwise Visualモードに入ります。

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

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

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

19
Grant Limberg

私はテキスト編集のためだけにvimを使っているので、しばしばコピー&ペーストを使います。問題は、デフォルトではvimがインポートされたテキストをペーストで歪めることが多いということです。これを止める方法は使うことです

:set paste

データを貼り付ける前に。これはそれがめちゃくちゃになるのを防ぎます。

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

コントラストの高い配色をオンにすると便利なこともあります。これはで行うことができます

:color blue

私はそれが私が使っているvimのすべてのバージョンでうまくいくわけではないことに気づいたが、それはほとんどのものでうまくいく。

17
Ian H

これは明白ではないものです。あなたの$ HOMEにたくさんのカスタムプラグイン/拡張機能があり、su/Sudo/...から作業する必要があるなら、これは便利かもしれません。

あなたの〜/ .bashrcに:

export VIMINIT=":so $HOME/.vimrc"

あなたの〜/ .vimrcに:

if $HOME=='/root'
        if $USER=='root'
                if isdirectory('/home/your_typical_username')
                        let rtuser = 'your_typical_username'
                elseif isdirectory('/home/your_other_username')
                        let rtuser = 'your_other_username'
                endif
        else
                let rtuser = $USER
        endif
        let &runtimepath = substitute(&runtimepath, $HOME, '/home/'.rtuser, 'g')
endif

それはあなたがあなたのローカルプラグインをロードすることを可能にするでしょう - あなたがユーザーを変えるのに使うどんな方法でも。

現在のパスから* .swpファイルを取り出して〜/ vimtmpに入れたい場合もあります(これは.vimrcに入ります)。

if ! isdirectory(expand('~/vimtmp'))
   call mkdir(expand('~/vimtmp'))
endif
if isdirectory(expand('~/vimtmp'))
   set directory=~/vimtmp
else
   set directory=.,/var/tmp,/tmp
endif

また、私が編集をより簡単にするために使用するいくつかのマッピング - ctrl + sがエスケープやctrl + h/lのように動作するようにタブを切り替えます

inoremap <C-s> <ESC>
vnoremap <C-s> <ESC>
noremap <C-l> gt
noremap <C-h> gT
11
viraptor

挿入モードでCtrl-nを押すと、開いているバッファにあるすべての単語に基づいて、入力しているすべての単語が自動的に補完されます。複数の一致がある場合は、ctrl-nとctrl-pを使用して循環できる単語のリストが表示されます。

11
Niki Yoshiuchi
gg=G

ファイル全体のインデントを修正します。私はEclipseで私の信頼できる<C-a><C-i>を見逃していましたが、vimがそれをうまく処理していることがわかりました。

10
daltonb

クライアント/サーバーベースのモードでVimを実行する機能。

たとえば、session.vimというセッションファイルに保存された多数のバッファ、タブ、その他の情報を含むプロジェクトで作業しているとします。

次のコマンドを発行してセッションを開き、サーバーを作成できます。

vim --servername SAMPLESERVER -S session.vim

サーバーを作成する必要があり、必ずしもセッションである必要はない場合は、通常のテキストファイルを開くことができます。

今、別の端末にいて、別のファイルを開く必要があるとします。あなたが発行することによってそれを定期的に開く場合:

vim new_file.txt

あなたのファイルは別のVimバッファで開かれるでしょう、それはあなたのセッションでファイルとの相互作用をするのが難しいです。サーバ上の新しいタブでnew_file.txtを開くには、次のコマンドを使用します。

vim --servername SAMPLESERVER --remote-tab-silent new_file.txt

サーバーが実行されていない場合、このファイルは通常のファイルと同じように開かれます。

実行するたびにこれらのフラグを指定するのは非常に面倒なので、クライアントとサーバーを作成するための別名を作成することができます。

私は私のbashrcファイルに次のものを置きました:

alias vims='vim --servername SAMPLESERVER'
alias vimc='vim --servername SAMPLESERVER --remote-tab-silent'

あなたはこれに関するより多くの情報を見つけることができます: http://vimdoc.sourceforge.net/htmldoc/remote.html

9
mohi666

IDEが欲しいですか?

:makeはカレントディレクトリでmakefileを実行し、コンパイラの出力を解析します。それから:cn:cpを使って各ファイルを開いて問題の行番号を探すことができます。

:syntax onはvimの構文の強調表示をオンにします。

9
caskey

Sudoのバリエーション

.vimrcに

cmap w!! w !Sudo tee % >/dev/null

Vimをリロードした後は、「Sudo save」を実行することができます。

:w!!
9
jm666

HOWTO:BashでVimを使うときの自動補完Ctags。 VimとCtagsを使う人のために、私はBash用の小さな自動補完機能を書きました。以下を〜/ .bash_completionファイルに追加します(存在しない場合は作成します)。

彼の多くの修正と改良のためのスタイリッシュなパンツに感謝します。

_vim_ctags() {
    local cur prev

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    case "${prev}" in
        -t)
            # Avoid the complaint message when no tags file exists
            if [ ! -r ./tags ]
            then
                return
            fi

            # Escape slashes to avoid confusing awk
            cur=${cur////\\/}

            COMPREPLY=( $(compgen -W "`awk -vORS=" "  "/^${cur}/ { print \\$1 }" tags`" ) )
            ;;
        *)
            _filedir_xspec
            ;;
    esac
}

# Files matching this pattern are excluded
excludelist='*.@(o|O|so|SO|so.!(conf)|SO.!(CONF)|a|A|rpm|RPM|deb|DEB|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MP?(E)G|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)'

complete -F _vim_ctags -f -X "${excludelist}" vi vim gvim rvim view rview rgvim rgview gview

Bashセッションを再開(または新しいセッションを作成)したら、次のように入力します。

コード:

~$ vim -t MyC<tab key>

そしてそれはファイルやディレクトリに対して行うのと同じ方法でタグを自動補完します。

コード:

MyClass MyClassFactory
~$ vim -t MyC

迅速なバグ修正に飛び込むとき、私はそれが本当に役に立つと思います。

8
michael

私はしばしば特定のWord /関数名をハイライトしたいのですが、まだその次のインスタンスを検索したくはありません。

map m* *#
8
Scotty Allen

(project1のルートから)ピンキーを消さずに、プロジェクトの2つの異なるコピー間でファイルを比較したい場合も、%が適しています。

:vert diffs /project2/root/%
7
Ben

:setlocal自動読み込み

Autoは現在のバッファをリロードします。ログファイルを見ている間に特に役に立ちます、そしてそれはvimの中からのunixの "tail"プログラムの機能をほとんど果たします。

Vimの中からコンパイルエラーをチェックする。言語に応じてmakeprg変数を設定しましょう

:setlocal makeprg = Perl\-c \%

PHPの場合

set makeprg = php\-l \%
set errorformat =%m\in \%f\on\line \%l

":make"を発行すると、関連するmakeprgが実行され、クイックエラーウィンドウにコンパイルエラー/警告が表示され、対応する行番号に簡単に移動できます。

7
Naga Kiran

私はすべてにVimを使っています。電子メールメッセージを編集するときは、次のように使用します。

gqap(またはgwap

たとえ引用の先頭文字があっても、段落ごとに簡単かつ正確に再フォーマットするため。この機能を実現するために、私はまた追加します:

-c 'set fo=tcrq' -c 'set tw=76'

外部からエディタを起動するためのコマンド。注目に値する追加の1つは、fo(formatoptions)パラメーターに 'a'を追加することです。内容を入力してナビゲートすると、段落が自動的に再フォーマットされますが、mayがメッセージに含まれる誤った形式や奇妙な形式の問題を妨げたり、問題を引き起こす可能性があります。

7
Gary Chambers

誰かがすでにこれを投稿していると確信していましたが、ここに行きます。

好きなビルドシステムを選んでください。 、mvn、ant、なんでも構いません。プロジェクトディレクトリのルートに、いつも使うコマンドのファイルを以下のように作成します。

mVNインストール
mvnクリーンインストール
...など

構築するには、カーソルをその行に置いて!! shと入力します。すなわちその行をフィルタリングします。それをシェルに書いて結果に置き換えます。

ビルドログはその行を置き換え、スクロール、検索、その他の準備はすべて整います。

ログの表示が終わったら、uと入力して元に戻します。コマンドのファイルに戻ります。

6
Brad Cox

待ち時間と色不足のため(配色が大好きです:) PuTTY のリモートマシンでのプログラミングは好きではありません。だから私はこの問題を回避するためにこのトリックを開発しました。私はそれをWindows上で使います。

あなたは必要になるでしょう

  • 1倍のgVim
  • リモートマシンとローカルマシンで1倍のrsync
  • あなたがパスワードを入力する必要がないようにリモートマシンへの1x SSH秘密鍵認証
  • 1x ページェント
  • 1倍のPuTTY

リモートマシンの設定

作業ディレクトリにアクセスできるようにrsyncを設定します。私はSSHトンネルを使い、トンネルからの接続のみを許可します。

address = 127.0.0.1
hosts allow = 127.0.0.1
port = 40000
use chroot = false
[bledge_ce]
    path = /home/xplasil/divine/bledge_ce
    read only = false

次にrsyncdを起動します。rsync --daemon --config = rsyncd.conf

ローカルマシンの設定

Cygwinからrsyncをインストールしてください。 Pageantを起動して、リモートマシンの秘密鍵をロードします。 SSHチューニングを使用している場合は、PuTTYを起動してトンネルを作成します。作業ディレクトリにバッチファイルPush.batを作成し、rsyncを使用して変更されたファイルをリモートマシンにアップロードします。

rsync --blocking-io *.cc *.h SConstruct rsync://localhost:40001/bledge_ce

SConstructはsconsのためのビルドファイルです。必要に応じてファイルのリストを変更してください。 SSHチューニングを使用しない場合は、localhostをリモートマシンの名前に置き換えます。

Vimの設定これは簡単です。クイックフィックス機能(makeとエラーリスト)を使用しますが、コンパイルはリモートマシン上で実行されます。それで、makeprgを設定する必要があります。

set makeprg=Push\ &&\ plink\ -batch\ [email protected]\ \"cd\ /home/xplasil/divine/bledge_ce\ &&\ scons\ -j\ 2\"

これは最初にPush.batタスクを開始してファイルをアップロードし、次にSSHを使用してリモートマシン上でコマンドを実行します(PuTTYスイートの Plink )。このコマンドは最初にディレクトリを作業ディレクトリに変更してからビルドを開始します(私はsconsを使用します)。

ビルドの結果はあなたのローカルgVimエラーリストに都合よく表示されます。

6
Roman Plášil

16進値から文字を入力します(挿入モード)。

<C-Q>x[type the hexadecimal byte]
6
Luper Rouch

これをあなたの.vimrcに入れて、xmlをきれいに印刷するコマンドを書いてください。

function FormatXml()
    %s:\(\S\)\(<[^/]\)\|\(>\)\(</\):\1\3\r\2\4:g
    set filetype=xml
    normal gg=G
endfunction

command FormatXml :call FormatXml()
6
Trumpi
 =============================================== ============= 
通常モードでは
 ========================= =============================== 
 gf .......... ......同じウィンドウ内でカーソル下のファイルを開く - >参照:h path 
 Ctrl-w f ..........新しいウィンドウ内でカーソル下のファイルを開く
 ] Ctrl-w q ..........現在のウィンドウを閉じる
 Ctrl-w 6 ..........代替ファイルを開く - >参照:h#
 gi .............................最終挿入位置にinit挿入モードがあります。
 '0 ............... placeファイルが最後に編集されたときの場所のカーソル
6
SergioAraujo

vim 7.3の場合はset colorcolumn=+1またはset cc=+1

5
quabug

ビルドプロセスが遅いプロジェクトで作業するときは、常にバックグラウンドでビルドし、その出力をerrors.errというファイルにパイプ処理します(make debug 2>&1 | tee errors.errのようなもの)。これにより、ビルドプロセス中にソースコードの編集または確認を続けることができます。準備ができたら(GTKでpynotifyを使ってそれが完了したことを知らせます)、 quickfix を使ってvimで結果を見ることができます。エラーファイルを読み込み、最初のエラーにジャンプする:cf [ile]を発行して開始します。私は個人的にcwindowを使用してビルド結果を別のウィンドウに表示するのが好きです。

4
Anders Holmberg

:sp %:h - 現在のファイルのディレクトリを使ったディレクトリリスト/ファイルチューザ

(rampionのcdチップの下のコメントとして属しますが、私はまだコメント権を持っていません)

4
searlea

コピーしてstackoverflowに貼り付ける直前:

:retab 1
:% s/^I/ /g
:% s/^/    /

今すぐコードをコピーして貼り付けます。

コメントで要求されるように:

retab 1.タブサイズを1に設定します。しかし、それはまたコードを通り抜け、余分なタブとスペースを追加してフォーマットが実際のテキストを動かさないようにします(すなわち、テキストはratabの後でも同じに見えます)。

%s/^ I// g:^ Iはタブを押した結果です。これはすべてのタブを検索し、それらを単一のスペースに置き換えます。たった今リタブをしたのでフォーマットを変更するべきではありませんが、タブをウェブサイトに入れることは打撃を受け、そしてミスするのでそれらを削除するのは良いことです。

%s/^//:行頭をスペース4つで置き換えます。実際には行の先頭を何かに置き換えることはできないので、行の先頭に4つのスペースを挿入します(これはコードを目立たせるためにSOフォーマットで必要です)。

4
Martin York

いくつかの便利なもの:

:set nu # displays lines
:44     # go to line 44
'.      # go to last modification line

私のお気に入り: Ctrl + n 単語補完!

4
dfens
In Insert mode 
<C-A>   - Increments the number under cursor 
<C-X>   - Decrements the number under cursor

Vimで連番を生成したいのであれば非常に便利です。
1行目から10行目に1から10までの数字を挿入する場合を考えてみましょう[1行目に "1"、2行目に "2"など)。
最初の行に "0"を挿入し、その行を9回以上コピーして、すべての行に "0"が表示されるようにします。

次のExコマンドを実行する

:g/^/exe "norm " . line(".") . "\<C-A>"
3
Naga Kiran

Vimをもう少しIDEエディタのようにするには:

  • 左余白の行番号にはnuを設定します。
  • set cul - カーソルを含む行を強調表示します。
3
mpe

私は大好きです:ls command。

3
PuzzleCracker

挿入モードでは、 ctrl+x、 ctrl+p あなたがタイプしている現在の長い識別子を完成させるでしょう(それがあなたがそれを好きであるならそれが可能な補完のメニューで)。

if (SomeCall(LONG_ID_ <-- type c-x c-p here
            [LONG_ID_I_CANT_POSSIBLY_REMEMBER]
             LONG_ID_BUT_I_NEW_IT_WASNT_THIS_ONE
             LONG_ID_GOSH_FORGOT_THIS
             LONG_ID_ETC
             ∶
3
bobbogo

再利用

他のコマンドと混ぜる動き、もっと こちら

tx
fx
Fx

あなたの好きなツールをVimで使ってください。

:r !python anything you want or awk or Y something

ビジュアルモードで繰り返します。上記のヒントと組み合わせると効果的です。

;
3
hhh

すべて交換

  :%s/oldtext/newtext/igc

すべてを置き換えてください:)

2
AIB

他のアプリケーションで使用するためにVimからクリップボードにテキストをコピーするには、ビジュアルモードでコピーしたいテキストを選択してから "+ y"を押すと、他のアプリケーションにテキストを簡単に貼り付けることができます。

これは、ウィンドウを縦に分割していて、正しいウィンドウから何かをコピーしたい場合に特に便利です。 set mouse = rを使用しても、この状況では役に立ちません。左側のウィンドウでもすべてが選択されるためです。

あなたのvimはxtermサポート付きでコンパイルされなければならないことに注意してください。

2
mohi666

私は長年かけてこれらを集めました。

" Pasting in normal mode should append to the right of cursor
nmap <C-V>      a<C-V><ESC>
" Saving
imap <C-S>      <C-o>:up<CR>
nmap <C-S>      :up<CR>
" Insert mode control delete
imap <C-Backspace> <C-W>
imap <C-Delete> <C-O>dw
nmap    <Leader>o       o<ESC>k
nmap    <Leader>O       O<ESC>j
" tired of my typo
nmap :W     :w
2
Yada

マウスの右ボタンを使用してgVimの挿入モードを〜/ .gvimrcの以下の設定で切り替えます。

"
"------------------------------------------------------------------
" toggle insert mode <--> 'normal mode with the <RightMouse>-key
"------------------------------------------------------------------
nnoremap  <RightMouse> <Insert>
inoremap  <RightMouse> <ESC>
"
2
Fritz G. Mehner

マップマクロ

マクロを定義するのと同じように、キーマッピングをその場で定義するのが便利なことがよくあります。ここでのねじれは、マッピングが再帰的であり、失敗するまで実行されるということです。

例:

enum ProcStats
{
        ps_pid,
        ps_comm,
        ps_state,
        ps_ppid,
        ps_pgrp,
:map X /ps_<CR>3xixy<Esc>X

与えます:

enum ProcStats
{
        xypid,
        xycomm,
        xystate,
        xyppid,
        xypgrp,

愚かな例:)。

私はすべての欠点を完全に認識しています - それは私がそれがかなりの機会にそれをむしろ有用であるとわかったことが起こるのです。仕事で見るのも面白いかもしれません;)。

2

Shebangを使って現在のバッファを実行する関数を作成し(1が設定されていると仮定して)、crtl-xで呼び出します。

map <C-X> :call CallInterpreter()<CR>

au BufEnter *
\ if match (getline(1) , '^\#!') == 0 |
\   execute("let b:interpreter = getline(1)[2:]") |
\ endif

fun! CallInterpreter()
    if exists("b:interpreter")
        exec("! ".b:interpreter." %")
    endif
endfun
2
jonyamo

=通常モードコマンドによるフォーマットにperltidyを使用してみてください

:set equalprg=perltidy
2
c9s

以下のどちらも本当に辛いものではありませんが、私はそれが非常に役に立つと思います。

些細な束縛、しかし私はただしなければ生きていけない。挿入モード(ctrlキーを使用)でhjklスタイルの移動を可能にします。通常モードでは、ctrl-k/jは画面の半分を上下にスクロールし、ctrl-l/hは次のバッファまたは前のバッファに移動します。 µとÂマッピングは、特にAZERTYキーボード用で、次の/前のmakeエラーに進みます。

imap <c-j> <Down>
imap <c-k> <Up>
imap <c-h> <Left>
imap <c-l> <Right>
nmap <c-j> <c-d>
nmap <c-k> <c-u>
nmap <c-h> <c-left>
nmap <c-l> <c-right>

nmap ù :cp<RETURN>
nmap µ :cn<RETURN>

私が書いた小さな関数は、関数、グローバル、マクロ、構造体、そしてtypedefを強調するために書いた。 (非常に大きなファイルでは遅くなるかもしれません)。それぞれのタイプは異なる強調表示をします(あなたの現在のカラーテーマの設定を知るために ":help group-name"を見てください)使用法:wwでファイルを保存します(デフォルト "\ ww")。これにはタグが必要です。

nmap <Leader>ww :call SaveCtagsHighlight()<CR>

"Based on: http://stackoverflow.com/questions/736701/class-function-names-highlighting-in-vim
function SaveCtagsHighlight()
    write

    let extension = expand("%:e")
    if extension!="c" && extension!="cpp" && extension!="h" && extension!="hpp"
        return
    endif

    silent !ctags --fields=+KS *
    redraw!

    let list = taglist('.*')
    for item in list
        let kind = item.kind

        if     kind == 'member'
            let kw = 'Identifier'
        elseif kind == 'function'
            let kw = 'Function'
        elseif kind == 'macro'
            let kw = 'Macro'
        elseif kind == 'struct'
            let kw = 'Structure'
        elseif kind == 'typedef'
            let kw = 'Typedef'
        else
            continue
        endif

        let name = item.name
        if name != 'operator=' && name != 'operator ='
            exec 'syntax keyword '.kw.' '.name
        endif
    endfor
    echo expand("%")." written, tags updated"
endfunction

私はたくさんのコードや関数を書く習慣がありますが、それらのプロトタイプを書くのは好きではありません。そのため、Cスタイルのソースファイル内にプロトタイプのリストを生成するための関数をいくつか作成しました。形式パラメータの名前を削除するものとそれを保持するものの2種類があります。プロトタイプを更新する必要があるたびにリスト全体を更新するだけです。プロトタイプと関数定義が同期しなくなるのを防ぎます。 ctagsも必要です。

"Usage: in normal mode, where you want the prototypes to be pasted:
":call GenerateProptotypes()
function GeneratePrototypes()
    execute "silent !ctags --fields=+KS ".expand("%")
    redraw!
    let list = taglist('.*')
    let line = line(".")
    for item in list
        if item.kind == "function"  &&  item.name != "main"
            let name = item.name
            let retType = item.cmd
            let retType = substitute( retType, '^/\^\s*','','' )
            let retType = substitute( retType, '\s*'.name.'.*', '', '' ) 

            if has_key( item, 'signature' )
                let sig = item.signature
                let sig = substitute( sig, '\s*\w\+\s*,',        ',',   'g')
                let sig = substitute( sig, '\s*\w\+\(\s)\)', '\1', '' )
            else
                let sig = '()'
            endif
            let proto = retType . "\t" . name . sig . ';'
            call append( line, proto )
            let line = line + 1
        endif
    endfor
endfunction


function GeneratePrototypesFullSignature()
    "execute "silent !ctags --fields=+KS ".expand("%")
    let dir = expand("%:p:h");
    execute "silent !ctags --fields=+KSi --extra=+q".dir."/* "
    redraw!
    let list = taglist('.*')
    let line = line(".")
    for item in list
        if item.kind == "function"  &&  item.name != "main"
            let name = item.name
            let retType = item.cmd
            let retType = substitute( retType, '^/\^\s*','','' )
            let retType = substitute( retType, '\s*'.name.'.*', '', '' ) 

            if has_key( item, 'signature' )
                let sig = item.signature
            else
                let sig = '(void)'
            endif
            let proto = retType . "\t" . name . sig . ';'
            call append( line, proto )
            let line = line + 1
        endif
    endfor
endfunction
2
RoaldFre

ウィンドウを切り替えるための私のお気に入りのレシピ:

function! SwitchPrevWin()
    let l:winnr_index = winnr()
    if l:winnr_index > 1
       let l:winnr_index -= 1
    else
       "set winnr_index to max window open
        let l:winnr_index = winnr('$')
    endif
    exe l:winnr_index . "wincmd w" 
endfunction

nmap <M-z> :call SwitchPrevWin()
imap <M-z> <ESC>:call SwitchPrevWin()

nmap <C-z> :wincmd w
imap <C-z> <ESC>:wincmd w
1
ken

自分の設定ファイルのいくつかを after-directory に配置したいのですが。特に ftplugin に便利です。

タイプごとに別々のファイルを作成する代わりに、長いグループのaugroupのリストを.vimrcファイルに書き込まないようにすることができます。

しかし、明らかに、.vim/ftpluginディレクトリは.vim/after/ftpluginと同じことをします、しかし私はvimプラグインのために.vimディレクトリを残すことを望みます。

1
quabug

このあたり スレッド

一連の行の先頭に付けるには、2つの異なる方法のうちの1つを使用します。

1つの方法はブロック選択です(sthで言及)。一般的には、ctrl-Vとそれに続くカーソル移動で矩形領域を選択できます。四角形をハイライトしたら、shift-Iを押すと四角形の左側に文字が挿入されます。またはshift-Aを押すと四角形の右側に文字が追加されます。そのため、この手法を使用して、接頭辞を付ける行の左端の列を含む長方形を作成し、shift-Iを押して接頭辞を入力してから、escapeを押すことができます。

もう1つの方法は、代替を使用することです(Brian Agnewによる言及のとおり)。 Brianの置換はファイル全体に影響します(コマンド内の%は "all lines"を意味します)。ほんの数行に影響を与えるには、一番簡単な方法はshift-V(ビジュアルラインモードを有効にする)を最初/最後の行に置いてから、最後/最初の行に移動することです。次に入力します。

:s/^ /あなたのプレフィックス/

^は正規表現(この場合は行頭)です。これをビジュアルラインモードで入力すると、 '<、'>がsの前に自動的に挿入されます。これは、置換の範囲が視覚的な選択になることを意味します。

追加のヒント:接頭部にスラッシュが含まれている場合は、円記号を使用してそれらをエスケープするか、コマンドの区切り文字として別​​の句読文字を使用することができます。たとえば、C++の行コメントを追加するには、通常次のように書きます。

:s:^://:

接尾辞を追加するために、すべての行が正確に同じ長さでない限り、置換アプローチは一般的に簡単です。 ^の代わりに$をパターンに使用するだけで、文字列は先頭に追加されるのではなく追加されます。

プレフィックスとサフィックスを同時に追加したい場合は、次のようにすることができます。

:s /.*/プレフィックスとサフィックス/

。*は行全体と一致します。置換の&はマッチしたテキスト(1行全体)を元に戻しますが、今度はプレフィックスとサフィックスが追加されます。

ところで:コードをコメントアウトするとき、おそらく後でコメント解除したいと思うでしょう。 visual-block(ctrl-V)を使用してスラッシュを選択してからdを押してそれらを削除することができます。あるいは置換(おそらくshift-Vを使用して視覚的な行選択)を使用して先頭のスラッシュを除去できます:

:s:// ::

1
vehomzzz

移動を行うためのマッピングは、折り返しモードで現在の画面行に作用します。私はしばらく前にVimのヒントに対するコメントでこれを発見しました、そしてそれはかなり便利であることが証明されました。

function! ScreenMovement(movement)
  if &wrap
    return "g" . a:movement
  else
    return a:movement
  endif
endfunction
onoremap <silent> <expr> j ScreenMovement("j")
onoremap <silent> <expr> k ScreenMovement("k")
onoremap <silent> <expr> 0 ScreenMovement("0")
onoremap <silent> <expr> ^ ScreenMovement("^")
onoremap <silent> <expr> $ ScreenMovement("$")
nnoremap <silent> <expr> j ScreenMovement("j")
nnoremap <silent> <expr> k ScreenMovement("k")
nnoremap <silent> <expr> 0 ScreenMovement("0")
nnoremap <silent> <expr> ^ ScreenMovement("^")
nnoremap <silent> <expr> $ ScreenMovement("$")
1
Mark42

私の必需品のいくつかは:

cscope + ctags + vim、これはWeb上にあります。

次のような新しいコードファイルをすばやく起動するためのいくつかの略語

ab cpph #include <iostream><CR>#include <string><CR>#include <cstdlib><CR>#include <cassert><CR>#include <vector><CR>#include <
stdexcept><CR>using namespace std;<CR>int main(int argc, char *argv[]) {
ab perlh #!/usr/bin/Perl<CR>use strict;<CR>use warnings;<CR>
ab chdr #include <stdio.h><CR>#include <sys/types.h><CR>#include <unistd.h><CR>#include <stdlib.h><CR>#include <sys/stat.h><CR>
#include <sys/wait.h><CR>#include <string.h><CR>int main(int argc, char *argv[]) {
ab xhtmlhdr <?xml version="1.0" encoding="UTF-8"?><CR><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.o
rg/TR/xhtml1/DTD/xhtml1-strict.dtd"><CR><html xmlns="http://www.w3.org/1999/xhtml"><CR>  <head><CR>  <title></title><CR><link h
ref="style.css" rel="STYLESHEET" type="text/css"><CR></head>

例えばcpphはmain.ccファイルの基本骨格を挿入します

ファンクションキーの私のマッピングもあります:

map <F1> <Esc>:w<CR>:Perl $e = `./error.pl`; my ($f,$l,@w) = split(":",$e); my $w=join(":",@w); $curwin->Cursor($l,0); VIM::Msg($w);<CR>
map <F2> :wincmd w<CR>
map <F3> :wincmd s<CR>
map <F4> :wincmd v<CR>
map <F5> :wincmd o<CR>
map <F6> :sball<CR>
map <F7> :wq<CR>
map <F8> :wincmd q<CR>
map <F9> :wincmd -<CR>
map <F10> :wincmd +<CR>
map <F11> :wincmd <<CR>
map <F12> :wincmd ><CR>

この場合、私のF1はソースコードの移行のために修正される必要がある次のエラーの上にカーソルを置くためにマッピングされます。

map _ ebi"^[ea"^[

このマップは_ quoteを文字列にします

1
piotr

私のは検索ではなくマクロを使用しています - マクロとビジュアルモードを組み合わせるほうがより効率的な場合があります。

1
lukaszkorecki