挿入モードに入る前にカーソル位置に戻る方法は?


7

カーソルの周りに空白を簡単に追加できるように、通常モードのマッピングを設定しようとしています。

<C-h>カーソルの右側にスペースを1つ追加します。
<C-j>以下に改行を追加します。
<C-k>上記に改行を追加します。
<C-l>カーソルの右側にスペースを1つ追加します。そして
<C-Enter>、現在のカーソル位置に改行を追加します。

また、コマンド中にカーソル位置が移動しないようにしたい。左、右、および改行の場合、これは簡単です。

nnoremap <C-h> i <Esc>l
nnoremap <C-l> a <Esc>h
nnoremap <C-^M> i<CR><Esc><Backspace>

しかし、上と下では、対応するコマンド

nnoremap <C-j> o <Esc>k
nnoremap <C-k> O <Esc>j

正しい行に戻りますが、以前と同じ列には戻りません。

挿入モードに入る直前のカーソル位置に戻る方法はありますか?私の最高のGoogle-fuは、''&ダブルバックティック(そこにマークダウンをフォーマットする方法がわからない)と:jumps/ <C-O>&への参照のみをもたらしましたが<C-I>、どちらも私が望んでいるようには機能していないようです。

これはVimscriptなしで解決できますか?それも解決することが可能 Vimscript?

回答:


7

新しい行を開く前にローカルマークを設定し、後でこのマークに戻ることができます。

マークには任意の文字を選択できます。たとえば、x次のようにします。

nnoremap <C-k> mxO<esc>`x
nnoremap <C-j> mxo<esc>`x
  • mxxカーソルがある場所にマークを設定します
  • `x カーソルをマークの位置に戻します x

また、tpopeが障害のないプラグインで書き込んだ内容を確認して、vimrc内に次のコードを挿入することもできます。

set nostartofline

function! s:BlankUp(count) abort
  put!=repeat(nr2char(10), a:count)
  ']+1
endfunction

function! s:BlankDown(count) abort
  put =repeat(nr2char(10), a:count)
  '[-1
endfunction

nnoremap <c-k> :<c-u>call <SID>BlankUp(v:count1)<cr>
nnoremap <c-j> :<c-u>call <SID>BlankDown(v:count1)<cr>

前のソリューションに対するこのソリューションの利点は、カウントを受け入れ、マークを変更しないことです。
たとえば、現在の行の上に2行挿入するには2<C-k>、を3行下に押します3<C-j>

PS:ポストにダブルバックティックを書き込むには、前後にトリプルバックティックを使用します(ダブルバックティックの前後にスペースを入れます)。 ``

編集
2つ目の解決策の場合、カーソルを新しい行を貼り付ける前と同じ列に戻すには、オプションを無効にする必要があることに気づきました'startofline'set nostartofline

このオプションを無効にすると、カーソルの列番号のようなさまざまなコマンドを使用した後に同じまま<C-d>ggdd>>:bnext:25
詳細については:help 'startofline'、を参照してください。


6

ここではvimscriptは必要ありません。以下のマッピングは、ユーザーが要求したとおりの処理を実行します。

nnoremap <C-j> m`o<Esc>``
nnoremap <C-k> m`O<Esc>``
  • m` 「前のコンテキストマーク」を設定するために使用され、
  • o<Esc> あなたが期待することをします、
  • `` 前のコンテキストマークに戻ります。

またm'、andの''代わりにm`andを使用することもできます``
EvergreenTree

2
@EvergreenTree、''右側の列にジャンプせず、右側の行にジャンプします。
romainl

ああ、気づかなかった。
EvergreenTree
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.