上記の動作をキャンセルすることはできますか?
追加のクレジットのタスク:挿入モードを終了した直後にVimにカーソル位置を更新させる方法を見つけます。
デフォルトのカーソルメカニズムを変更することはお勧めしませんが、問題の動作を実現する1つの方法は、次の挿入モードマッピングを使用することです。
:inoremap <silent> <Esc> <Esc>`^
ここではEsc、挿入モードでキーがオーバーロードさ`^
れ、最後に挿入モードが終了したときの位置にカーソルを移動するコマンドが追加で実行されます。このマッピングでは、挿入モードを終了した直後に実行されるEscため、デフォルトの動作での位置と比較して、カーソルは1文字右に移動します。
他のいくつかの回避策とは異なり、これはVimをこの+ex_extra
機能でコンパイルする必要はありません。
これに対処するための秘訣はありますが(ESC前の2つの投稿で述べたマッピングなど)、これを行うための一貫した方法はありません。その理由は、挿入モードに入るのに使用された方法を判別する方法がないためです。具体的には、 :abcDefg
にカーソルがある文字列を指定します。D
を押すiと、挿入モードの場所はとの間にc
なりD
ます。通常ESCはカーソルをc
;に置きます。<C-O>:stopinsert<CR>
(またはbacktickメソッド)はカーソルをに置きますD
。
を押すaと、挿入モードの場所はとの間にD
なりe
ます。通常ESCはカーソルをD
;に置きます。<C-O>:stopinsert<CR>
にカーソルを置きますe
。
本当にこれをやりたいのなら、次のようなものでそれをファッジすることができます:
let insert_command = "inoremap <ESC> <C-O>:stopinsert<CR>"
let append_command = "iunmap <ESC>"
nnoremap i :exe insert_command<CR>i
nnoremap a :exe append_command<CR>a
ただし、これは入力方法としてのみ処理されることを忘れないでください。ビジュアルブロックモードなどを使用する場合はi
、一致する新しいコマンドを考え出す必要があります(多くのコマンドがあります)。したがって、これを行わないことを強くお勧めします。a
I
A
個人的には、デフォルトの動作に慣れることをお勧めします。i
のために論理的に、またはのために論理的にすることが簡単にできますa
。i
論理forを犠牲にしてデフォルトを論理forに変更するとa
、標準のvi/vimインストールを使用するときに混乱するだけです。
inoremap <silent> <Esc> <C-O>:stopinsert<CR>
あなたの.vimrc
。
私はこれを行うための適切な方法は
au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
Vim Tips wikiからのアプローチがあり、それは私にとってうまく機能しました...私は何年かわかりません:
" Leave insert mode to the *right* of the final location of the insertion
" pointer
" From http://vim.wikia.com/wiki/Prevent_escape_from_moving_the_cursor_one_character_to_the_left
let CursorColumnI = 0 "the cursor column position in INSERT
autocmd InsertEnter * let CursorColumnI = col('.')
autocmd CursorMovedI * let CursorColumnI = col('.')
autocmd InsertLeave * if col('.') != CursorColumnI | call cursor(0, col('.')+1) | endif
どうですか:
:imap <Esc> <Esc><Right>