Làm cách nào để quay lại vị trí con trỏ trước khi tôi vào chế độ chèn?


7

Tôi đang cố gắng thiết lập ánh xạ chế độ bình thường để dễ dàng thêm khoảng trắng xung quanh con trỏ:

<C-h>sẽ thêm một khoảng trắng ở bên phải con trỏ;
<C-j>sẽ thêm một dòng mới bên dưới;
<C-k>sẽ thêm một dòng mới ở trên;
<C-l>sẽ thêm một khoảng trắng ở bên phải con trỏ; và
<C-Enter>sẽ thêm một dòng mới ở vị trí con trỏ hiện tại.

Tôi cũng muốn vị trí con trỏ không di chuyển trong lệnh. Đối với bên trái, bên phải và dòng mới, điều này rất đơn giản:

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

nhưng đối với bên trên và bên dưới, các lệnh tương ứng

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

sẽ đưa tôi trở lại đúng dòng, nhưng không trở lại cùng cột mà tôi đã ở trước đó.

Có cách nào để trở về vị trí con trỏ tôi đang ở ngay trước khi vào chế độ chèn không? Google-fu tốt nhất của tôi chỉ đưa ra các tham chiếu đến ''& double-backtick (không thể tìm ra cách định dạng đánh dấu ở đó) và :jumps/ <C-O>& <C-I>, cả hai dường như không hoạt động theo cách tôi muốn.

Điều này có thể được giải quyết mà không có Vimscript? Nó thậm chí có thể được giải quyết với Vimscript?

Câu trả lời:


7

Bạn có thể đặt một dấu địa phương đến nơi bạn trước khi mở một dòng mới và quay lại dấu này sau đó.

Bạn có thể chọn bất kỳ chữ cái nào cho nhãn hiệu, ví dụ x: giả sử:

nnoremap <C-k> mxO<esc>`x
nnoremap <C-j> mxo<esc>`x
  • mxđặt dấu xnơi con trỏ là
  • `x di chuyển con trỏ trở lại vị trí đánh dấu x

Bạn cũng có thể nhìn vào những gì tpope đã viết trong plugin chưa từng thấy của anh ấy và đặt đoạn mã sau vào vimrc của bạn:

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>

Ưu điểm của giải pháp này so với giải pháp trước đó là nó chấp nhận số lượng và không thay đổi bất kỳ nhãn hiệu nào của bạn.
Ví dụ: để chèn 2 dòng trên dòng hiện tại, nhấn 2<C-k>, 3 dòng bên dưới 3<C-j>.

PS: để viết một backtick kép trong bài viết của bạn, hãy sử dụng ba backticks trước và sau (và đặt khoảng trắng trước và sau backtick kép): ``

Chỉnh sửa
Tôi chỉ nhận thấy rằng trong trường hợp của giải pháp thứ 2, nếu bạn muốn con trỏ quay trở lại cùng một cột trước khi dán một dòng mới, bạn phải tắt tùy chọn 'startofline':set nostartofline

Khi tùy chọn này bị vô hiệu hóa, số cột của con trỏ của bạn vẫn như cũ sau khi sử dụng các lệnh khác nhau như <C-d>, gg, dd, >>, :bnext, :25.
Xem :help 'startofline'để biết thêm.


6

Không cần vimscript ở đây, các ánh xạ bên dưới làm chính xác những gì bạn yêu cầu:

nnoremap <C-j> m`o<Esc>``
nnoremap <C-k> m`O<Esc>``
  • m` được sử dụng để đặt "dấu bối cảnh trước",
  • o<Esc> làm những gì bạn mong đợi,
  • `` nhảy trở lại dấu bối cảnh trước đó.

Cũng lưu ý rằng bạn cũng có thể sử dụng m'''thay vì m```
EvergreenTree

2
@EvergreenTree, ''sẽ không nhảy sang cột bên phải, chỉ đến đúng dòng.
romainl

Ah, tôi đã không nhận ra điều đó.
EvergreenTree
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.