way VimはほとんどのIDEが行うように閉じ括弧を処理しないため、手探りするのに時間がかかりすぎます。これが実現したいことです。
これを入力してください:
if( whatever )
{ <CR>
これを入手してください:
if( whatever )
{
|
}
ここで、<CR>
はヒットを意味する ENTER キーと|
はカーソルの位置です。これがEclipseの機能です。 Visual Studioの機能です。そして、Vimにしたいことです。
私はいくつかのプラグインを見てきましたが、いくつか試してみましたが、どれも私にこの振る舞いを与えていないようです。きっと私がこれを望む最初のプログラマーになることはできません。
VimLでは、{
希望どおりに行うには:
inoremap { {<CR>}<Esc>ko
自動インデントの設定に応じて、<BS>
の後<CR>
。
より完全なソリューションについては、 Luc Hermitteのvimプラグイン をご覧になることをお勧めします。彼らは今まで一度も失敗したことはありません。
新しい行に閉じ括弧を付け、2つの括弧の間の行にカーソルを置くには、括弧と括弧の処理を簡単にするというタイトルの記事の最初のコメントの提案に従ってください。
以下でAutoCloseを使用すると、正常に機能します。
inoremap {<CR> {<CR>}<C-o>O
これは少なくとも私のシステム(Mac OS XのUnix端末)には当てはまります。
中括弧、括弧、および括弧の間にタブを挿入したソリューション。
" Automatically closing braces
inoremap {<CR> {<CR>}<Esc>ko<tab>
inoremap [<CR> [<CR>]<Esc>ko<tab>
inoremap (<CR> (<CR>)<Esc>ko<tab>
結果:
function() {
|
}
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。
.vimrcファイルに次を追加します。
inoremap { {}<ESC>ha
挿入モードで{
を押すと、{}
が生成され、右中括弧にカーソルが置かれるため、すぐに入力を開始できます。中括弧を別の行ではなく順番に配置することにより、}
の前に手動でタブを配置できます。そうすれば、その前に間違った量のタブが表示されることはありません。
おそらく誰かがカーソルが置かれているタブの数を数える方法を見つけ出し、新しい行の}
の前に同量のタブを生成できるでしょう。
私がしたようにこれに遭遇し、AutoCloseよりも最近更新されたものを探していた人のために: delimitMate AutoCloseの好ましい解決策であるだけでなく、行動的にもアクティブであることがわかった開発。 vim.org によると、AutoCloseは2009年以降更新されていません。
delimitMate にはこの設定があります。
私は常に、崇高なテキストが次の文字として右中括弧を追加するようなことを好むので、次を.vimrcに追加しました。
inoremap ( ()<ESC>hli
カーソルを2つのブレースの間に移動します。
さまざまなプラグインを試しましたが、最も正確で使いやすい auto-pairs です。それは本当に直観的であり、インストールするとすぐに期待通りの結果が得られます。
Vimパッチ7.4.849は、取り消しシーケンスを再起動せずにカーソルを移動できるバインディングを追加しました。 > = 7.4.849に更新すると、このようなことがうまく機能します。
inoremap ( ()<C-G>U<Left>
パッチに含まれているドキュメントから直接入手したことに注意してください。この機能のこれまでで最もシンプルなソリューション。
@Bobへのメモです。
Karl Guertinの AutoClose には `` double brace ''という名前の関数があります。つまり、次のように中括弧を2回入力できます。
int func_name(void) {{ ==> Type `{' twice here.
結果として:
int func_name(void) {
| ==> Cursor here.
}
次に、singleタブを入力して、「shiftwidth」設定に従ってインデントを取得してから入力します。
Vimスクリプトをインストールして使用します AutoCloseというタイトルの記事で推奨されているとおり、自動的に終了文字を追加します 。
inoremap ( ()<ESC>i
inoremap " ""<ESC>i
inoremap ' ''<ESC>i
inoremap { {<Cr>}<Esc>O
私の解決策:
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>
これを行うために特別なプラグインは必要ありませんが、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行で行うこともできますが、探している出力を反映するように略語を広げられるように追加しました。