821

人々が一般的なトリック、特に " Vim+ctags のヒントとトリック"について話している質問がたくさんあります。

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

4

70 に答える 70

797

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

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

:w !sudo tee %

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

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

于 2009-04-07T18:03:41.483 に答える
628

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

:earlier 15m

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

于 2009-04-07T18:09:16.883 に答える
419

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

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

例えば:

:.! ls

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

:.! date
于 2009-04-26T04:03:04.300 に答える
316

まったくわかりにくいわけではありませんが、非常に便利な「delete in」コマンドがいくつかあります..

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

その他は次のサイトでご覧いただけます:help text-objects

于 2009-04-07T20:33:30.437 に答える
240

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

ci(xyz[Esc] -- これは奇妙なものです。ここで、「i」は挿入モードを意味しません。代わりに、括弧内を意味します。したがって、このシーケンスは、あなたが立っている括弧内のテキストを切り取って、 "xyz". 角括弧と数字括弧内でも機能します -- ci[ または ci{ を対応して実行します. もちろん、di を実行できます (何も入力せずにすべてのテキストを削除したい場合. ifaの代わりに実行することもできiます括弧内のテキストだけでなく、括弧も削除したい。

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

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

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

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

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

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

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

~ - 大文字と小文字を切り替えるためviw~、単語全体の大文字と小文字が逆になります

Ctrl+u / Ctrl+dページを半画面分上下にスクロールします。これは、2 つの画面がどのように関連しているかを簡単に確認できるため、通常のフルスクリーン ページングよりも便利なようです。画面全体を一度にスクロールしたい場合は、Ctrl+f で前方に、Ctrl+b で後方にスクロールできます。Ctrl+Y および Ctrl+E は、一度に 1 行ずつ上下にスクロールします。

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

%は一致する括弧を見つけてジャンプします。

de -- カーソル位置から単語の末尾までを削除 (dE次のスペースまで削除することもできます)

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

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

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

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

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

ce - 単語の末尾をカットします

bye -- 現在の単語をコピーします ("hi" が何をするのか不思議に思います!)

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

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

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

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

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

b と e は、Ctrl+矢印が通常行うのと同様に、カーソルを単語ごとに移動します。複数の連続する区切り文字が 1 つの単語として扱われるため、word の定義は少し異なります。単語の途中から開始する場合、b を押すと常に現在の単語の先頭に移動し、連続する各 b は次の単語の先頭にジャンプします。同様に、覚えやすいようにe、現在の単語と後続の各単語の最後にカーソルを移動します。

b/と同様にe大文字BE使用し、区切り文字として空白のみを使用してカーソルを単語ごとに移動します。

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

于 2009-04-29T13:21:55.380 に答える
211

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

g; and g,

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

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

ちょうど私の2セント。

于 2009-06-04T11:54:15.460 に答える
136
gv

最後のビジュアル選択を再選択します。

于 2011-01-12T20:03:40.860 に答える
123

.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
于 2009-05-04T20:04:33.233 に答える
103

:%TOhtml

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

于 2011-03-27T10:05:01.137 に答える
102

これが暗いコーナーのように数えられるかどうかはわかりませんが、私はそれを学んだばかりです...

:g/match/y A

"match" を含むすべての行を"a/@aレジスタにヤンク (コピー) します。(大文字の asAは、以前のレジスタの内容を置き換えるのではなく、vimにヤンクを追加します。) 最近、Internet Explorer のスタイルシートを作成するときによく使用します。

于 2009-04-08T15:36:36.977 に答える
96

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

q:

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

2 つのファイルに同様の変更を加えて、その間を行ったり来たりしたことはありませんか? (たとえば、ソースファイルとヘッダーファイル?)

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

次に、これらのファイル間をタブで行き来します。

于 2009-04-20T20:36:25.020 に答える
88

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

vim http://stackoverflow.com/

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

于 2010-09-17T16:50:46.907 に答える
71

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

例えば:

qq0dwj@qq@q

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

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

于 2009-09-11T12:39:23.203 に答える
57

^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に戻ります
于 2009-07-13T19:18:26.800 に答える
57

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

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

:perldo $_ = join ' ', reverse split

各行の終わりに 8 文字 (A ~ Z) のランダムな文字列を挿入するには、次のようにします。

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

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

于 2009-04-08T01:15:58.930 に答える
51

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

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

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

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

=%を押すと、すぐに次のようになります。

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

または、コード ブロック内で=a{を実行することもできます。{ 文字のすぐ上に配置するのではありません。

于 2010-04-16T00:44:56.780 に答える
51
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor
于 2009-08-17T13:57:55.707 に答える
47

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

:e ++enc=cp1250 %:p

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

于 2009-04-07T18:40:23.813 に答える
41
imap jj <esc>
于 2009-04-19T18:33:15.337 に答える
37

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

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

説明

\(そして、正規表現ランドで物事を覚える\)方法です。そして、などは、記憶されたものを取得する方法です。\1\2

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

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

>>> \2^I\1

上記のものを「2番目に覚えたもの」に置き換えてから「1番目に覚えたもの」に置き換えます-本質的に転置を行います。

于 2009-04-07T18:03:21.373 に答える
31

厳密には暗い秘密ではありませんが、次のマッピングを.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>
于 2009-04-11T07:14:21.593 に答える
29

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

cd %:h
于 2009-04-07T20:11:12.033 に答える
27

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

bash$ sudo vi +'silent !bash' +q
Password: ******
root#
于 2009-06-12T05:54:59.633 に答える
24

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

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

mksession session.vim

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

vim -S session.vim
于 2011-03-04T02:20:57.050 に答える
24
:r! <command>

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

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

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

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

:r! ls *.c

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

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever
于 2009-05-06T07:38:25.990 に答える
21

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

map <F5> ggg?G``

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

于 2009-07-08T19:19:08.073 に答える
20

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

:set paste

データを貼り付ける前に。これでぐちゃぐちゃになりません。

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

また、ハイ コントラストのカラー スキームをオンにすると便利な場合もあります。これはで行うことができます

:color blue

私が使用しているすべてのバージョンの vim で機能するわけではありませんが、ほとんどのバージョンで機能することに気付きました。

于 2009-04-29T18:56:49.773 に答える
19

今日、 NSFAQ経由でこれを見つけました。

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

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

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

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

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

于 2009-05-11T21:59:04.003 に答える
12

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

于 2009-06-05T19:10:57.123 に答える
11

IDE が必要ですか?

:make現在のディレクトリで makefile を実行し、コンパイラの出力を解析します。次に、 と を使用:cn:cpて、各ファイルを開いて問題の行番号をシークするコンパイラ エラーをステップ実行できます。

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

于 2009-06-06T14:27:05.820 に答える
10

クライアント/サーバー ベースのモードで 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を参照してください。

于 2011-03-24T22:44:40.250 に答える
9

特定の単語/関数名を強調表示したいことがよくありますが、その次のインスタンスまではまだ検索したくありません。

map m* *#
于 2009-04-19T18:18:26.903 に答える
8

HOWTO:BashでVimを使用するときにCtagをオートコンプリートします。VimとCtagsを使用している他の人のために、Bash用の小さな自動コンプリーター関数を作成しました。〜/ .bash_completionファイルに以下を追加します(存在しない場合は作成します)。

彼の多くの修正と改善をしてくれたstylishpantsに感謝します。

_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

簡単なバグ修正に飛び込んでいるとき、それは本当に便利だと思います。

于 2009-04-07T23:11:04.193 に答える
7

%は、(project1のルートからの)ピンキーを使い果たすことなく、プロジェクトの2つの異なるコピー間でファイルを差分する場合にも適しています。

:vert diffs /project2/root/%
于 2009-04-09T12:37:25.807 に答える
7

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

gqap(またはgwap)

引用文の先頭文字が含まれていても、段落ごとに簡単かつ正確に再フォーマットすることができます。この機能を実現するために、以下も追加します。

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

エディターを外部から呼び出すコマンドに。注目すべき追加の 1 つは、「a」を fo (formatoptions) パラメータに追加することです。これにより、コンテンツを入力してナビゲートするときに段落が自動的に再フォーマットされますが、メッセージに含まれる誤ったまたは奇妙なフォーマットに干渉したり、問題が発生したりする可能性があります。

于 2009-05-08T01:36:24.907 に答える
7

:setlocal 自動読み取り

現在のバッファを自動リロードします..特にログファイルを表示しているときに役立ち、vim内からUNIXの「テール」プログラムの機能をほぼ提供します。

vim 内からコンパイル エラーをチェックしています。言語に応じてmakeprg変数を設定します。たとえば、perlの場合です

:setlocal makeprg = perl\ -c \ %

PHPの場合

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

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

于 2009-07-08T19:07:42.607 に答える
6

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

任意のビルド システムを使用してください。make、mvn、ant、なんでも。プロジェクト ディレクトリのルートに、次のように、常に使用するコマンドのファイルを作成します。

mvn install
mvn clean install
...など

ビルドを行うには、行にカーソルを置き、!!sh と入力します。つまり、その行をフィルタリングします。それをシェルに書き込み、結果に置き換えます。

ビルド ログが行を置き換え、スクロール、検索などの準備が整います。

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

于 2009-05-08T01:54:44.897 に答える
6
================================================== ========
通常モード時
================================================== ========
gf ... 同じウィンドウでカーソル下のファイルを開く --> :h パスを参照
Ctrl-w f ........... カーソル下のファイルを新しいウィンドウで開く
Ctrl-w q .... 現在のウィンドウを閉じる
Ctrl-w 6 ......... 別のファイルを開く --> :h # を参照
gi ................ 最後の挿入位置で挿入モードを開始
'0 ................ ファイルが最後に編集されたときの位置にカーソルを置きます
于 2009-08-20T12:21:53.330 に答える
6

これを .vimrc に入れて、xml をきれいに印刷するコマンドを用意します。

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

command FormatXml :call FormatXml()
于 2009-04-19T18:35:13.430 に答える
6

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

<C-Q>x[type the hexadecimal byte]
于 2009-04-09T12:53:15.160 に答える
5

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

于 2011-07-12T12:21:24.057 に答える
5

いくつかの便利なもの:

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

私のお気に入り: Ctrl+ nWORD COMPLETION!

于 2010-01-19T00:26:07.960 に答える
4

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

于 2009-12-28T09:21:01.443 に答える
4

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

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

于 2009-08-06T09:33:01.673 に答える
4

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

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

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

コメントで要求されたとおり:

retab 1. これにより、タブ サイズが 1 に設定されます。ただし、コードを調べて、余分なタブとスペースを追加して、書式設定によって実際のテキストが移動しないようにします (つまり、テキストは、ratab の後も同じように見えます)。

% s/^I/ /g: ^I は、タブを押した結果であることに注意してください。これにより、すべてのタブが検索され、単一のスペースに置き換えられます。再タブを行ったばかりなので、これによって書式が変更されることはありませんが、ウェブサイトにタブを配置することはヒットとミスであるため、タブを削除することをお勧めします.

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

于 2009-09-15T20:18:16.863 に答える
3

再利用

他のコマンドとミックスするモーション、詳細はこちら

tx
fx
Fx

Vimでお気に入りのツールを使用してください。

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

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

;
于 2011-01-12T14:32:03.393 に答える
3

次のどちらも本当に難しいものではありませんが、非常に便利だと思います。

些細なバインディングですが、私はそれなしでは生きられません。挿入モードでhjklスタイルの移動を有効にします(Ctrlキーを使用)。通常モードの場合: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」)で保存します。これにはctagsが必要です。

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つのフレーバーがあります。1つは正式なパラメーターの名前を削除するもので、もう1つはそれを保持するものです。プロトタイプを更新する必要があるたびに、リスト全体を更新するだけです。非同期のプロトタイプと関数定義が発生するのを防ぎます。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
于 2009-09-13T18:29:22.463 に答える
3

私は:lsコマンドが大好きです。

于 2009-04-24T13:36:44.687 に答える
3

挿入モードでは、ctrl+ xctrl+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
             ∶
于 2011-03-17T20:41:47.670 に答える
3

マップ マクロ

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

例:

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,

ばかげた例:)。

私はすべての欠点を完全に認識しています。たまたま、場合によってはかなり便利だと思いました。また、職場で見るのも面白いかもしれません;)。

于 2011-01-12T15:22:06.153 に答える
3
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>"
于 2011-06-29T16:05:50.133 に答える
2

マウスの右キーを使用して、〜/.gvimrcの次の設定でgVimの挿入モードを切り替えます。

"
"------------------------------------------------------------------
" toggle insert mode <--> 'normal mode with the <RightMouse>-key
"------------------------------------------------------------------
nnoremap  <RightMouse> <Insert>
inoremap  <RightMouse> <ESC>
"
于 2009-04-22T16:41:05.863 に答える
2

シバンを使用して現在のバッファを実行する関数を作成し(設定されていると仮定)、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
于 2010-05-10T15:01:43.753 に答える
2

私は何年にもわたってこれらを集めました。

" 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
于 2009-11-24T20:21:01.600 に答える
2

すべて置換

  :%s/oldtext/newtext/igc

すべてを置き換えるために a を与えてください:)

于 2009-04-27T13:06:44.920 に答える
2

ノーマルモードコマンドperltidyでフォーマットしてみる=

:set equalprg=perltidy
于 2009-08-20T18:55:48.970 に答える
2

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

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

vim は xterm サポート付きでコンパイルする必要があることに注意してください。

于 2011-04-05T18:43:08.820 に答える
1

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

タイプごとに個別のファイルを作成する代わりに、.vimrcファイルにaugroupの長いリストを書き込むことを回避できます。

しかし、明らかに、.vim/ftpluginディレクトリは.vim/after / ftpluginと同じことをしますが、私は.vimディレクトリをvimプラグインに任せたいと思います。

于 2011-07-12T10:49:15.160 に答える
1

私の必需品のいくつかは次のとおりです。

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を文字列にします

于 2009-05-06T16:08:49.820 に答える
1

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

于 2009-08-13T10:50:24.440 に答える
1

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

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
于 2010-09-04T04:13:11.883 に答える