web-dev-qa-db-ja.com

一致するブレースをVimに自動的に挿入する

way VimはほとんどのIDEが行うように閉じ括弧を処理しないため、手探りするのに時間がかかりすぎます。これが実現したいことです。

これを入力してください:

if( whatever )
{ <CR>

これを入手してください:

if( whatever )
{
  |  
}

ここで、<CR>はヒットを意味する ENTER キーと|はカーソルの位置です。これがEclipseの機能です。 Visual Studioの機能です。そして、Vimにしたいことです。

私はいくつかのプラグインを見てきましたが、いくつか試してみましたが、どれも私にこの振る舞いを与えていないようです。きっと私がこれを望む最初のプログラマーになることはできません。

63
Bob

VimLでは、{希望どおりに行うには:

inoremap { {<CR>}<Esc>ko

自動インデントの設定に応じて、<BS>の後<CR>

より完全なソリューションについては、 Luc Hermitteのvimプラグイン をご覧になることをお勧めします。彼らは今まで一度も失敗したことはありません。

33

新しい行に閉じ括弧を付け、2つの括弧の間の行にカーソルを置くには、括弧と括弧の処理を簡単にするというタイトルの記事の最初のコメントの提案に従ってください

16
Derek Mahar

以下でAutoCloseを使用すると、正常に機能します。

inoremap {<CR> {<CR>}<C-o>O

これは少なくとも私のシステム(Mac OS XのUnix端末)には当てはまります。

9
dmonopoly

中括弧、括弧、および括弧の間にタブを挿入したソリューション。

" Automatically closing braces
inoremap {<CR> {<CR>}<Esc>ko<tab>
inoremap [<CR> [<CR>]<Esc>ko<tab>
inoremap (<CR> (<CR>)<Esc>ko<tab>

結果:

function() {
  |
}
4
Rodrigo Pinto

Vimrcには次のものがあります。

let s:pairs={
            \'<': '>',
            \'{': '}',
            \'[': ']',
            \'(': ')',
            \'«': '»',
            \'„': '“',
            \'“': '”',
            \'‘': '’',
        \}
call map(copy(s:pairs), 'extend(s:pairs, {v:val : v:key}, "keep")')
function! InsertPair(left, ...)
    let rlist=reverse(map(split(a:left, '\zs'), 'get(s:pairs, v:val, v:val)'))
    let opts=get(a:000, 0, {})
    let start   = get(opts, 'start',   '')
    let lmiddle = get(opts, 'lmiddle', '')
    let rmiddle = get(opts, 'rmiddle', '')
    let end     = get(opts, 'end',     '')
    let prefix  = get(opts, 'prefix',  '')
    let start.=prefix
    let rmiddle.=prefix
    let left=start.a:left.lmiddle
    let right=rmiddle.join(rlist, '').end
    let moves=repeat("\<Left>", len(split(right, '\zs')))
    return left.right.moves
endfunction
 noremap! <expr> ,f   InsertPair('{')
 noremap! <expr> ,h   InsertPair('[')
 noremap! <expr> ,s   InsertPair('(')
 noremap! <expr> ,u   InsertPair('<')

そして、いくつかのファイルタイプについて:

inoremap {<CR> {<C-o>o}<C-o>O

// InsertPair関数は簡単なことを知っていますが、多くの<Left>s。

4
ZyX

.vimrcファイルに次を追加します。

inoremap { {}<ESC>ha

挿入モードで{を押すと、{}が生成され、右中括弧にカーソルが置かれるため、すぐに入力を開始できます。中括弧を別の行ではなく順番に配置することにより、}の前に手動でタブを配置できます。そうすれば、その前に間違った量のタブが表示されることはありません。

おそらく誰かがカーソルが置かれているタブの数を数える方法を見つけ出し、新しい行の}の前に同量のタブを生成できるでしょう。

3
user1534664

私がしたようにこれに遭遇し、AutoCloseよりも最近更新されたものを探していた人のために: delimitMate AutoCloseの好ましい解決策であるだけでなく、行動的にもアクティブであることがわかった開発。 vim.org によると、AutoCloseは2009年以降更新されていません。

3
Eric H

wikia tip でわかるように、この繰り返しの質問には多くの解決策があります( mine もあります)。

ブラケットペアに制限する場合です。ここでは、制御ステートメントのコンテキストにいます。したがって、「if」ステートメントを入力するときに「){」を入力することを期待しないスニペットシステムを見つける可能性が高くなります。 Vimのショートカットは、私があなたの質問で読んだものよりも短い傾向があります。ここでも多くの選択肢があります。最も可能性の高い切り抜きを見つけることができ、私の C&C++スイート かもしれません。

3
Luc Hermitte

delimitMate にはこの設定があります。

2
Henrik N

私は常に、崇高なテキストが次の文字として右中括弧を追加するようなことを好むので、次を.vimrcに追加しました。

inoremap (  ()<ESC>hli

カーソルを2つのブレースの間に移動します。

2
Aneesh Durg

さまざまなプラグインを試しましたが、最も正確で使いやすい auto-pairs です。それは本当に直観的であり、インストールするとすぐに期待通りの結果が得られます。

2
egelev

Vimパッチ7.4.849は、取り消しシーケンスを再起動せずにカーソルを移動できるバインディングを追加しました。 > = 7.4.849に更新すると、このようなことがうまく機能します。

inoremap ( ()<C-G>U<Left>

パッチに含まれているドキュメントから直接入手したことに注意してください。この機能のこれまでで最もシンプルなソリューション。

2
John Eikenberry

@Bobへのメモです。

Karl Guertinの AutoClose には `` double brace ''という名前の関数があります。つまり、次のように中括弧を2回入力できます。

int func_name(void) {{ ==> Type `{' twice here.

結果として:

int func_name(void) {
| ==> Cursor here.
}

次に、singleタブを入力して、「shiftwidth」設定に従ってインデントを取得してから入力します。

1
jtuki
1
Derek Mahar
inoremap ( ()<ESC>i
inoremap " ""<ESC>i
inoremap ' ''<ESC>i
inoremap { {<Cr>}<Esc>O
1
alvy

私の解決策:

inoremap <expr> <CR> InsertMapForEnter()
function! InsertMapForEnter()
    if pumvisible()
        return "\<C-y>"
    elseif strcharpart(getline('.'),getpos('.')[2]-1,1) == '}'
        return "\<CR>\<Esc>O"
    elseif strcharpart(getline('.'),getpos('.')[2]-1,2) == '</'
        return "\<CR>\<Esc>O"
    else
        return "\<CR>"
    endif
endfunction

説明:

上記のコードは、最初にEnterを使用してコード補完を確認しているかどうかを確認します。そうでない場合は、{|}Enterと入力したとき。また、htmlタグの自動インデントも提供します。

例:

if( whatever ){|}

Enterを押すと、

if( whatever )
{
  |  
}

これはhtmlファイルでも機能します。次の例をご覧ください

<html>|<html>

Enterを押すと、

<html>
    |
</html>
0
Vold Notz

これを行うために特別なプラグインは必要ありませんが、2段階のプロセスです。

最初に、以下を.vimrcに追加して、トリガーキャラクターを食べます:

" eat characters after abbreviation
function! Eatchar(pat)
    let c = nr2char(getchar(0))
    return (c =~ a:pat) ? '' : c
endfunction

そして、この略語を.vimrcに追加します:

inoreabbr <silent> { {
      \<cr><space><space>
      \<cr><esc>0i}<esc>k$i<c-r>=Eatchar('\m\s\<bar>\r')<cr>

2行目と3行目の先頭にある\は、単なる行継続文字です。これをすべて1行で行うこともできますが、探している出力を反映するように略語を広げられるように追加しました。

0
ricardo