17

「ホーム」キーを使用して行の先頭に戻るという悪い習慣があります。最近vimを使い始めたとき、インデントされた行のホームキーを押すと、行の最初に戻ることに気付きました。Notepad ++(私が使用していたエディター)では、インデントの直後の、その行のコードの先頭に戻ります。

この動作をvimで再現する方法はありますか?通常、ホームを押しているときは、挿入モードで、(通常は)変数をそこに貼り付けます。

私はset smartindentvimrcにset noautoindent、「ヒント」ページで自動インデントを無効にするように指示されています(最初は有効になっていないようですが、おそらくそのオプションは無関係です)。

4

5 に答える 5

31

Vimの行の「先頭」に移動する通常の方法は2つあります。

  • 0(ゼロ)テキストの最初の列に移動します
  • ^行の最初の非空白に移動します

通常、使用する0wのが行の最初の空白以外の文字に移動するための最も便利な方法であることがわかります。これは、キーの数と同じであり、^到達するのが簡単です。(もちろん、行に先頭のスペースがない場合は、を押さないでくださいw。)

于 2010-01-10T02:23:16.840 に答える
14

Home次と同じになるように再マップできます^(ドキュメントによると、Homeのデフォルト関数は移動コマンドと同等です1|):

:map <Home> ^  
:imap <Home> <Esc>^i  

これにより、挿入モードのマッピングは、挿入モードから脱出し、を押し^てから挿入モードに戻るのと同じになります。挿入モード内で使用するモーションコマンドをマッピングする最良の方法がわからないため、何かが壊れる可能性がありますが、機能しているようです。

インデント設定に関しては、移動コントロールに影響を与えるべきではありませんが、おそらく別の方法で設定することをお勧めします。autoindentは、新しい行の現在のインデントを保持するだけです(したがって、行の先頭に4つのスペースを配置すると、returnキーを押した後、新しい行の前にも4つのスペースが配置されます)。それがほとんどすべてのプログラミング言語、あるいは単に自由形式のテキストでさえ非常に役立つので、なぜあなたがそれを望まないのか分かりません。一方、smartindentは、開始{の後のインデント、および終了}の後のインデント解除など、ハードコードされた軽いC風のインデントルールをいくつか実装しますが、前の行からのインデントを自動的に引き継ぐことはありません。スマートインデントを使用する場合、ドキュメントでは自動インデントをオンにしておくことを推奨しています。

ただし、smartindentは、ハードコーディングされたルールを満たしていない言語や、積極的に有害な言語(「#」で始まる行からインデントを自動的に削除する場合など)には役に立ちません。これは、プリプロセッサディレクティブであると見なされますが、インデントされたコメントを書き込もうとしているPythonプログラマー)。

そのため、vimには、より高度なインデントモードであるファイルタイプインデントも含まれています。これにより、言語/ファイルタイプごとに柔軟なインデントルールが可能になり、ほとんどの人(Cのような言語でも)に推奨されるインデントモードになります。ファイルタイプのインデントを使用する場合は、smartindentをオフにすることをお勧めします(そうしないと、Pythonファイルのすべてのコメント行を列0に移動するなど、ファイルタイプのインデントを妨げる可能性があります)。

個人的には、私は常に自動インデントをオンにしており、利用可能な場合はファイルタイプを使用し、smartindentを使用することはありません。私の.vimrcには以下が含まれます:

set autoindent " doesn't interfere with filetype indents, and is useful for text  
if has("autocmd")  
  " Enable file type detection and indentation  
  filetype plugin indent on  
  set nosmartindent  
endif  

ファイルタイプのインデントが利用できない多くの異なるCのような言語を編集している場合、ファイルタイプのファイルタイプのインデントが存在しない場合にのみsmartindentをオンにするためにできることがあると思います。

于 2010-02-16T20:35:56.353 に答える
9

これが私の中にあるもの.vimrcです。Homeこれは、行のどこかにいる場合はテキストの先頭に移動し、テキストの先頭にいる場合は列0に移動するようにマップされます。

function ExtendedHome()
    let column = col('.')
    normal! ^
    if column == col('.')
        normal! 0
    endif
endfunction
noremap <silent> <Home> :call ExtendedHome()<CR>
inoremap <silent> <Home> <C-O>:call ExtendedHome()<CR>

注: +にマップするキーボードレイアウトを使用してHomeいるため、これを使用しています。に到達するためにキーボードの文字フィールドを離れる必要がある場合は、代わりに通常モードに移動する必要があります。Alt GrAHome

于 2013-03-17T09:38:09.057 に答える
2

_通常モードで使用して、現在の行の最初の非空白文字に移動することもできます。このモーションでカウントを使用することもできます。

_  <underscore>     [count] - 1 lines downward,
                    on the first non-blank character linewise.
于 2015-07-28T14:56:26.700 に答える
1

を押してみてください0(も参照:help 0

また、これは役立つかもしれません:

:imap <C-Home> <esc>0a
于 2010-01-10T02:22:32.630 に答える