Trong vim, ngăn caret di chuyển trở lại khi tôi rời chế độ chỉnh sửa?


9

Trong vim, nếu tôi vào và rời khỏi chế độ chỉnh sửa mà không làm gì, dấu mũ sẽ kết thúc một ký tự bên trái. Và nếu tôi vào và rời khỏi chế độ chắp thêm, dấu mũ sẽ di chuyển về phía trước và sau đó lùi lại.

Bất kỳ cách nào để cấu hình vim để rời khỏi dấu mũ một mình trong những trường hợp này?

Lý tưởng nhất là tôi chỉ muốn luôn luôn vào chế độ chắp thêm, nhưng không di chuyển dấu mũ khi tôi vào hoặc thoát khỏi chế độ.

(Hiện tại tôi thường sử dụng chế độ chèn vì nó không làm xáo trộn vị trí caret của tôi khi vào. Đó là, ngoại trừ khi tôi cần nối vào cuối dòng, trong trường hợp đó tôi thề với vim vì hành xử theo kiểu cổ xưa như vậy , nhấn Esc và vào chế độ chắp thêm.)


1
Các câu trả lời cho câu hỏi này là tốt. Tôi chỉ muốn chỉ ra rằng nếu họ đúng trong các giả định của họ rằng bạn sử dụng tôi để chuyển sang chế độ chỉnh sửa, thì đó là điều gây ra sự di chuyển ngược. Nếu bạn sử dụng 'a' (không phải A), nó sẽ hoạt động như bạn mong đợi.
johnny

@johnny Tôi không nghĩ nó sẽ như vậy. Tôi thường ở chế độ "bình thường", di chuyển xung quanh tệp và nội dung. Khi tôi cần chỉnh sửa, tôi định vị dấu mũ trước, sau đó nhấn "a" và sau đó thấy rằng tôi đã đặt sai vị trí, vì nó di chuyển sang phải. Cho rằng tôi dành 99% thời gian chỉnh sửa của mình trong các biên tập viên hiện đại, sẽ không có cơ hội nào tôi sẽ nhớ vị trí một char bên trái trước khi nhấn "a". Đó là lý do tại sao tôi đã hy vọng cho một vĩ mô hoặc một cái gì đó.
RomanSt

Đó là một câu hỏi về thói quen. Nó thực sự gây phiền nhiễu, nhưng chỉ những năm đầu tiên. Sau cùng, bạn sẽ học cách báo chí ihoặc akhông nghĩ về nó, và có thể thậm chí s, S, ci", , vv thay vì giới hạn ia.
Luc Hermitte

1
Tôi hiểu sự thất vọng của bạn nhưng. Thay vào đó hãy thử nghĩ về những gì bạn đang làm. Hãy tự hỏi mình xem có cách nào tốt hơn không (hơn là sử dụng Vim như một người nhắn tin thông thường, đó là). Tôi đã tìm thấy với Vim luôn có một cách tốt hơn, đó là cách làm của Vim. Chúng tôi có thể giúp nhưng chúng tôi phải biết bạn đang làm gì khi gặp vấn đề. Bạn có ví dụ đi vào chế độ chỉnh sửa khi bạn muốn xóa một cái gì đó? Đừng, có 'x' để xóa các ký tự. Muốn thay thế một nhân vật, sau đó có 'r'. Chỉ cần nghĩ về những gì bạn muốn đạt được.
johnny

@johnny Tôi hiểu những gì bạn đang nói, nhưng nó đòi hỏi quá nhiều việc học lại để có ý nghĩa với tôi. Tôi dành 99% thời gian chỉnh sửa của mình trong Visual Studio và tôi thích nó. Tôi chỉ biết rằng tôi sẽ không học lại điều này, vì vậy không lãng phí thời gian.
RomanSt

Câu trả lời:


9

Câu hỏi này được hỏi thường xuyên giữa những người dùng vi / Vim mới và câu trả lời là trong khi ở chế độ bình thường, con trỏ luôn "bật" một ký tự, nhưng ở chế độ chèn, con trỏ luôn "ở giữa" hai ký tự (hãy nhớ, kết thúc -of-line là một ký tự). Bạn thực sự không thể thấy điều này được minh họa trong bảng điều khiển Vim, nhưng trong GUI bạn sẽ nhận thấy con trỏ trở thành một thanh giữa hai ký tự khi bạn vào chế độ chèn, thay vì chặn một ký tự khi bạn ở chế độ bình thường.

Vì vậy, những gì bạn nhìn thấy không nhất thiết là con trỏ di chuyển trở lại một ký tự khi bạn rời khỏi chế độ chèn, mà chỉ di chuyển lên một ký tự. Hướng di chuyển an toàn duy nhất là sang trái (hoặc quay lại). Do đó, bạn có nhiều hơn một cách để vào chế độ chèn:

  • "a" vào chế độ chèn với con trỏ "giữa" ký tự con trỏ đang bật và ký tự tiếp theo bên phải.
  • "i" vào chế độ chèn với con trỏ "giữa" ký tự con trỏ đang bật và ký tự trước bên trái.

Một số người đã nỗ lực để ngăn chặn "phong trào" này mà họ không thích, nhưng chắc chắn nó sẽ can thiệp vào các plugin và các tập lệnh Vim khác mà họ muốn chạy trong tương lai.

Đề nghị của tôi là làm quen với việc sử dụng các lệnh "a" và "i" (và "A" và "I") trong các trường hợp thích hợp.

Các lệnh "o" và "O" cũng hữu ích để tìm hiểu. Xem:

:help a
:help i
:help A
:help I
:help o
:help O

Chỉnh sửa: Nếu bạn vẫn quyết tâm thay đổi hành vi này, hãy thử mẹo này: Ngăn không cho di chuyển con trỏ một ký tự sang trái


1
Tôi hiểu những gì bạn đang nói, nhưng "i" / "Esc" / "i" / "Esc" gây ra chuyển động ròng thực sự chung của dấu mũ. Tôi thực sự nghĩ rằng VIM đơn giản là không dành cho tôi.
RomanSt

2
@romkyns: Tôi nghĩ những gì bạn nên làm là sử dụng athay vì i.
Tạm dừng cho đến khi có thông báo mới.

1
@Dennis đồng ý, "a" tốt hơn một chút vì nó cho phép dấu mũ đứng trước char đầu tiên và sau char cuối cùng trong một dòng - điều mà "i" không tự ý bỏ qua. Nhưng tôi đã thử điều đó; Điều xảy ra là tôi luôn đặt sai vị trí của dấu mũ trước khi nhấn "a" - vì vậy tôi phải ngay lập tức di chuyển vị trí của dấu mũ sang bên trái. Mỗi lần như vậy. Nó mệt mỏi nên tôi chuyển sang "i".
RomanSt

@Heptite Có lẽ bạn có thể chỉ cho tôi một trong những triển khai thiếu sót như vậy của một cái gì đó ngăn chặn phong trào? Cơ hội tôi muốn sử dụng plugin hoặc các tập lệnh khác trong tương lai về cơ bản là bằng không.
RomanSt

1
@romkyns, nó (không) hoạt động cả hai cách. Việc ánh xạ lại <esc>thực sự sẽ ngăn hầu hết các plugin sử dụng <esc>để hoạt động chính xác, nhưng đồng thời, nó sẽ tiếp tục làm phiền bạn khi bạn sẽ sử dụng các tính năng tiêu chuẩn khác trở lại chế độ bình thường theo cách tương tự <esc>. Học cách sử dụng chìa khóa phù hợp khi đang bay là giải pháp mở rộng / hoạt động trong thời gian dài.
Luc Hermitte

1

Tôi nghĩ bằng cách carat bạn có nghĩa là con trỏ của bạn và nếu bạn đang sử dụng "i", điều này sẽ chèn trực tiếp vào vị trí con trỏ của bạn, "a" (mà tôi tin rằng bạn đang tìm kiếm) di chuyển con trỏ một ký tự sang phải. Ngoài ra, shift-i (I) sẽ đi đến điểm bắt đầu của dòng và shift-a (A) sẽ đi đến hết dòng.

Nếu tôi đã hiểu nhầm câu hỏi của bạn, tôi xin lỗi.


1

Vì ánh xạ lại <ESC>được coi là 'rủi ro', tôi chỉ cần kết hợp với một trong các cách tiếp cận phím thoát và có những điều sau đây .vimrc:

 inoremap ii <ESC>l

Lưu ý: Đảm bảo không có ký tự khoảng trắng ở cuối dòng.

Đơn giản, nhưng được chứng nhận đầy đủ là "hoạt động tốt với tôi" vì đó chính xác là những gì tôi phải gõ bằng tay.

Cho dù tôi sử dụng ahay itôi vẫn khiến hành vi quay trở lại và nó làm tôi khó chịu hơn thường xuyên, điều tiếp theo tôi muốn gõ là d$xóa đến cuối dòng, v.v.


Giải pháp đơn giản đến không ngờ. Tốt nhất tôi đã đi qua.
Tyler Collier

1

Đây là giải pháp của tôi:

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

Thật buồn cười. Câu hỏi tương tự này tồn tại trên cả ba trang web: SO, SU, Unix + Linux.


Tôi không thấy buồn cười :) May mắn thay, tôi đã tìm thấy một trình soạn thảo không khiến tôi thất vọng (diazo), vì vậy đây không còn là vấn đề nữa. Tuy nhiên, nâng cao cho những người thích vim.
RomanSt
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.