39

上記の動作をキャンセルすることはできますか?

追加のクレジットのタスク:挿入モードを終了した直後にVimにカーソル位置を更新させる方法を見つけます。

4

7 に答える 7

27

デフォルトのカーソルメカニズムを変更することはお勧めしませんが、問題の動作を実現する1つの方法は、次の挿入モードマッピングを使用することです。

:inoremap <silent> <Esc> <Esc>`^

ここではEsc、挿入モードでキーがオーバーロードさ`^ れ、最後に挿入モードが終了したときの位置にカーソルを移動するコマンドが追加で実行されます。このマッピングでは、挿入モードを終了した直後に実行されるEscため、デフォルトの動作での位置と比較して、カーソルは1文字右に移動します。

他のいくつかの回避策とは異なり、これはVimをこの+ex_extra機能でコンパイルする必要はありません。

于 2010-02-19T12:31:28.040 に答える
17

これに対処するための秘訣はありますが(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、一致する新しいコマンドを考え出す必要があります(多くのコマンドがあります)。したがって、これを行わないことを強くお勧めします。aIA

個人的には、デフォルトの動作に慣れることをお勧めします。i のために論理的に、またはのために論理的にすることが簡単にできますai論理forを犠牲にしてデフォルトを論理forに変更するとa、標準のvi/vimインストールを使用するときに混乱するだけです。

于 2010-02-19T12:32:33.390 に答える
10

ネイサンネフの コメントに基づいて、私が見つけた最良のアプローチは

autocmd InsertLeave * :normal! `^
set virtualedit=onemore

autocmdカーソルを挿入モードが終了したときの位置に戻します(つまり、デフォルトと比較して1つ前に移動します)。

virtualedit行末で一貫して動作するようにします(したがって、行の最後の文字の1つ前になります)。

(編集:normal!再帰的なマッピングを回避するため)

于 2018-11-26T16:14:17.817 に答える
8
inoremap <silent> <Esc> <C-O>:stopinsert<CR>

あなたの.vimrc

于 2010-02-19T10:09:54.880 に答える
4

私はこれを行うための適切な方法は

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
于 2013-06-11T21:57:56.680 に答える
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
于 2021-10-20T19:06:48.650 に答える
0

どうですか:

:imap <Esc> <Esc><Right>
于 2010-02-19T10:10:13.240 に答える