Grok Vim chuyển động và chỉnh sửa đơn giản


8

Tôi sẽ trở lại Vim sau khi sử dụng Emacs được vài năm. Tôi đang cố gắng mò mẫm Vim bằng cách đọc và xem hướng dẫn, cũng như thực sự sử dụng nó hàng ngày.

Khi chỉnh sửa văn bản, tôi thấy các lệnh Emacs của Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D và Alt-Backspace rất hữu ích và trực quan, cho phép chỉnh sửa cục bộ nhanh chóng và dễ dàng khi làm việc với văn bản (từ / mã).

Vim-way thực hiện chức năng tương tự là gì? Quay trở lại NORMALchế độ để phát hành một chuyển động, chỉ để vào lại INSERTchế độ là không tối ưu.

Ví dụ 1: Khi ở INSERTchế độ chèn a (ở đầu biểu thức, tôi nên di chuyển đến cuối biểu thức hoặc dòng để chèn tương ứng )trong Vim như thế nào?

Ví dụ 2: Khi chỉnh sửa văn bản, người ta thường có thể muốn xóa một từ tiến hoặc lùi trong khi viết hoặc chỉnh sửa một câu hoặc mã. Sẽ là bất thường khi có một câu / mã được hình thành hoàn hảo trong tâm trí của một người, sẵn sàng gõ "một lần" trước thời hạn; thường một câu thay đổi khi một người đang làm việc với văn bản. Các hạn chế của INSERTchế độ đang làm cho loại chỉnh sửa này trở nên khó khăn đối với tôi trong Vim. Tôi cảm thấy không thể thao tác hiệu quả văn bản trong chế độ chèn, luôn thấy mình phải chuyển về NORMALchế độ cho các chuyển động đơn giản hoặc xóa các từ.

PS: Alt-F và -B di chuyển con trỏ tiến hoặc lùi một từ. Ctrl-a và -e di chuyển con trỏ đến đầu hoặc cuối dòng. Alt-F xóa từ dưới con trỏ. Alt-Backspace xóa từ trước con trỏ.


1
Cách Vim có thể là sử dụng một plugin như Thuật toán.com.au / code / vimacs . : P Bạn có thể bao gồm một lời giải thích về những gì các lệnh này làm trong emacs? Một danh sách Ctrl / Alt / Meta-foo / bar khá vô nghĩa đối với bất kỳ ai không sử dụng emacs. Và Ctrl-W xóa từ trước con trỏ. Ngoài ra, tôi có cảm giác điều này hơi quá rộng.
muru

1
Nếu chúng tôi đang đi theo cách plugin, bạn nên xem github.com/tpope/vim-rsi
dkns

3
Khi chuyển từ ngôn ngữ lập trình "A" sang "B". Tốt nhất không nên viết "B" theo kiểu "A" mà nên học các thành ngữ tiêu chuẩn của "B" (đó là một bài học khó cho hầu hết các nhà phát triển). Quy tắc tương tự áp dụng cho các biên tập viên. Đừng thử và áp dụng quy trình làm việc tiêu chuẩn của trình soạn thảo "A" cho trình soạn thảo mới "B" của bạn. Thích học các thành ngữ sử dụng "B" trực tiếp. Đường cong học tập lớn hơn nhưng hiệu quả hơn nhiều về lâu dài. Trong vimkhi chỉnh sửa bạn dành phần lớn thời gian của bạn trong chế độ bình thường không ở chế độ chèn.
Martin York

Câu trả lời:


6

1

Bạn có thể đạt được những ánh xạ lệnh hoặc tốt hơn (màu hồng) rất nhanh. Tôi không đề xuất giải pháp này, nhưng là một ví dụ, nếu bạn muốn di chuyển con trỏ đến đầu dòng, <C-a>bạn có thể thực hiện dòng sau sau khi nhấn :từ chế độ bình thường (hoặc thêm dòng vào vimrc của bạn)

inoremap <C-a> <C-o>0

hoặc, nếu bắt đầu dòng có nghĩa là ký tự không trống đầu tiên của dòng

inoremap <C-a> <C-o>^

Điều tò mò, tôi chỉ thử nghiệm các ánh xạ này trong bộ đệm trong đó tôi đang viết câu trả lời này và tôi đã bối rối trong giây lát vì chúng không hoạt động. Sau đó, tôi nhận ra rằng tôi đã quên để vào chế độ chèn. Bạn dường như thấy khó khăn khi rời khỏi chế độ chèn để thực thi các lệnh chế độ bình thường. Bạn có thể thấy sau khi sử dụng Vim một thời gian, đó là phiên bản ngược mà bạn nán lại ở chế độ bình thường trong khi bạn đang suy nghĩ và chỉ thực hiện các chuyến du ngoạn để chèn chế độ cho những dịp đặc biệt. Vim có lẽ chỉ (hoặc chủ yếu) đáng để học nếu bạn thấy rằng bạn chỉnh sửa nhiều hơn là viết văn bản.

Vì vậy, một phần của câu trả lời cho câu hỏi của bạn về việc thực hiện nhanh chóng các lệnh chế độ bình thường từ chế độ chèn là <C-o>, cho phép bạn tạm thời rời khỏi chế độ chèn để thực thi một lệnh chế độ bình thường, sau đó nhập lại. Đọc về nó tại :help i_Ctrl-o. Điều này rất hữu ích cho các tiện ích một lần. Một tuyến đường bền vững hơn có lẽ là cố gắng nắm lấy chế độ bình thường làm mặc định cho điều hướng và chỉnh sửa và chỉ nhập chế độ chèn khi bạn thực sự muốn chèn các ký tự mới bằng tay vào bộ đệm.

2

Ví dụ của bạn rất chung chung nên thật khó để đưa ra câu trả lời cụ thể. Tôi sẽ tạo ra một ví dụ cụ thể với hy vọng nó phù hợp hoặc có thể dịch được thành thứ bạn gặp phải. Đối với số 1 của bạn, nó phụ thuộc vào cách bạn biết dấu ngoặc đơn đóng ở đâu. giả sử tôi có một dòng như

let cchar = s:cchar["atx"]

Điều này có nghĩa là một dòng của VimL, ​​ngôn ngữ kịch bản của vim và nó (hoặc một cái gì đó giống như nó) xảy ra trong một tệp cú pháp Vim mà tôi hiện không đồng ý. Giả sử tôi muốn thay đổi phần bên phải của biểu thức này thành lệnh gọi hàm, có lẽ vì hàm cung cấp mặc định khi từ điển s:ccharchưa được gán giá trị cho "atx"khóa. Với con trỏ của tôi (ở chế độ bình thường) trên ký tự đầu tiên, 'l', tôi có thể nhập

f=wcf[MyFunction(<Esc>$r)

Nói ngắn gọn, điều này nói

  • f=- chuyển tiếp tới '=' (tôi có thể nói fs, nhưng có lẽ tôi sẽ không dừng lại đủ lâu để thấy rằng 'tôi' muốn tiếp cận là s đầu tiên trên dòng, vì vậy tôi đi tìm nhân vật đó là rõ ràng là duy nhất, và tiếp tục từ đó)
  • w - từ tiếp theo, bây giờ con trỏ của tôi nằm trên 's' của 's: cchar'
  • cf[ - thay đổi để chuyển tiếp sang '['

tại thời điểm này, dòng này trông giống như

let cchar = |"atx"]

nơi |là con trỏ, và tôi đang ở chế độ chèn. Tôi sau đó gõ MyFunction(và để chế độ chèn ( <Esc>).

  • $- di chuyển con trỏ đến cuối dòng. Tôi có thể đã sử dụng Echo từ cuối lớn hoặc f]chuyển tiếp đến '' '' hoặc một số chuyển động khác, nhưng $trước tiên xảy ra với tôi.
  • r) - thay thế ký tự dưới con trỏ bằng dấu ')'

Bây giờ tôi đã thay đổi biểu thức gán từ gán từ từ điển script-local sang sử dụng giá trị trả về của hàm và khi làm như vậy tôi đã giới thiệu dấu ngoặc đơn. Tôi không biết nhu cầu đặc biệt của bạn đối với dấu ngoặc đơn trông như thế nào, có lẽ nó rất khác nhau, trong trường hợp đó sẽ có một chuỗi lệnh khác nhau để đạt được nó. Nếu tôi dừng lại để suy nghĩ lâu hơn về ví dụ đã tạo của mình, tôi có thể tìm ra những cách hiệu quả hơn để đạt được điều đó, nhưng ai có thời gian để dừng lại và suy nghĩ.

(Hãy thử, sao chép-dán (xin lỗi, yank-put) văn bản và lệnh vào bộ đệm và với con trỏ của bạn trên ký tự đầu tiên, 'f', của lệnh nhấn y$. Bây giờ lệnh nằm trong thanh ghi không tên của bạn. Di chuyển đến đầu dòng đầu tiên và nhấn :normal <C-r>"vào a) nhập chế độ dòng lệnh, b) bắt đầu thực hiện lệnh chế độ bình thường từ dòng lệnh và c) để dán ( atchoo đặt) thanh ghi không tên vào dòng lệnh như bình thường lệnh chế độ được thực thi. Điều duy nhất bạn cần thay đổi trong lệnh là thay thế <Esc>chuỗi ký tự giả mạo (vì bạn đã sao chép atchoo từ trình duyệt của mình) bằng mã khóa Escape thực tế, vì vậy hãy xóa nó và nhấn <C-v>và sau đó là phím Esc. Nó sẽ trông giống như^[. Bây giờ nhấn return để chạy lệnh. Hoặc ... chỉ cần gõ chuỗi phím để kiểm tra các lệnh, tôi chỉ muốn cho bạn thấy rằng bạn có thể tương tác với chế độ bình thường từ chế độ cmdline <C-v>, và <C-r>, và tất cả các vinh quang khác của Wonderland. Ngoài ra, xem :help Cmdline-mode.)

3

Để xóa một từ ngược, bạn có thể sử dụng ánh xạ chuẩn <C-w>(xem :help i_Ctrl-w). Tôi không biết nếu có một ánh xạ mặc định để xóa một từ chuyển tiếp, nhưng tôi cho rằng bạn có thể tạo một từ với

inoremap <C-S-w> <C-o>dw

Một lần nữa, <C-o>sẽ đưa bạn ra khỏi chế độ chèn cho lệnh một lần và dwsẽ "xóa" qua chuyển động "từ". Xem :help d, :help w. Nếu các từ chuyển tiếp bạn xóa không phải là các từ thực tế mà là các tên class.feft #, bạn có thể muốn sử dụng W(xem :help W). Nếu bạn đã chủ yếu ở chế độ bình thường bạn không cần những ánh xạ, chỉ cần làm dw, dbhoặc bạn bè.

Một số chương giúp đỡ để xem xét kỹ hơn

  • :help <C-o>
  • :help Insert
  • :help fvà các phần sau ( F, t, T, ;,)
  • :help word-motions

5
Viết là KHÔNG tuyến tính. Bất cứ ai có thể viết văn xuôi (hoặc mã) từ đầu đến cuối mà không thực hiện một số chỉnh sửa nào đó đều là điên rồ hoặc có sức mạnh của một vị thần. Đối với phần còn lại của chúng tôi, chúng tôi thực hiện chỉnh sửa nhiều hơn sau đó viết và do đó, suy nghĩ về trình chỉnh sửa của bạn là thực hiện các lệnh chỉnh sửa (chế độ BÌNH THƯỜNG) trước và viết (chế độ INSERT) thứ hai hiệu quả hơn. Và đây là mấu chốt thực sự của lý do tại sao các biên tập viên như Emacs, MS Word, Notepad, v.v ... lại lạc hậu trong cách tiếp cận của họ. Thật không may là khái niệm không có chế độ tồn tại nhưng phải có mẫu số chung thấp nhất.
Sukima

12

Khi chỉnh sửa văn bản, tôi thấy các lệnh Emacs của Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D và Alt-Backspace rất hữu ích và trực quan, cho phép chỉnh sửa cục bộ nhanh chóng và dễ dàng khi làm việc với văn bản (từ / mã).

Để trả lời câu hỏi của bạn về các chỉnh sửa cục bộ: nếu bạn đang ở chế độ chèn và nhấn, ctrl-Obạn sẽ thực hiện lệnh tiếp theo trong chế độ chèn. Nó có thể hữu ích nếu bạn quyết định lau dòng. Có một vài lệnh khác trong chế độ chèn cho những thứ nhỏ, như dán từ thanh ghi và tự động hoàn thành các từ. Bạn có thể đọc tất cả chúng với :h ins-special-keys.

Ví dụ 1: Khi ở chế độ INSERT để chèn một (khi bắt đầu một biểu thức, tôi nên di chuyển đến cuối biểu thức hoặc dòng để chèn tương ứng) trong Vim như thế nào?

Thường thì có một cách tốt hơn để làm mọi thứ trong chế độ bình thường. Ví dụ: giả sử bạn muốn bao quanh một biểu thức bằng dấu ngoặc đơn. Một số điều bạn có thể làm là i(<end>), i(<esc>A), c$()<esc>P. * Điều ưa thích của tôi liên quan đến việc có một trong những "cần thiết" vim plugins, vim-vòm . Với vim-Surround, nó chỉ là ys$). Điều tuyệt vời về tất cả những điều này là một khi bạn biết cách thực hiện nó trong một tình huống, bạn có thể làm điều đó trong tất cả các tình huống tương tự. Điều gì sẽ xảy ra nếu thay vì thêm dấu ngoặc đơn vào cuối dòng, đó chỉ là ba từ? Bạn có thể sử dụng c3w()<esc>Phoặc ys3w). Còn toàn bộ dòng thì sao? cc()<esc>Phoặc yss).

Ví dụ 2: Khi chỉnh sửa văn bản, người ta thường có thể muốn xóa một từ tiến hoặc lùi trong khi viết hoặc chỉnh sửa một câu hoặc mã. Sẽ là bất thường khi có một câu / mã được hình thành hoàn hảo trong tâm trí của một người, sẵn sàng gõ "một lần" trước thời hạn; thường một câu thay đổi khi một người đang làm việc với văn bản. Các hạn chế của chế độ INSERT đang làm cho loại chỉnh sửa này trở nên khó khăn đối với tôi trong Vim. Tôi cảm thấy không thể thao tác hiệu quả văn bản trong chế độ chèn, luôn thấy mình phải chuyển về chế độ BÌNH THƯỜNG để di chuyển đơn giản hoặc xóa các từ.

Một điều giúp rất nhiều là thêm inoremap jk <esc>vào vimrc của bạn. Sau đó, bạn có thể thoát chế độ chèn bằng cách nhấn jk. Điều này sẽ loại bỏ phần lớn chi phí ra khỏi chế độ chèn để bạn có thể thực jk<sequenceofcommands>ihiện các lệnh mà không làm gián đoạn quá trình gõ của mình.


Ngoài ra :h ins-special-keys, hãy kiểm tra :h ins-special-specialđể có thêm ánh xạ.
Tiếng Litva

9

Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D và Alt-Backspace

Các lệnh tương đương trong chế độ bình thường là w, b, ^, $, dw, db. Lưu ý logic: dwxóa những gì được bao phủ bởi wdbxóa những gì được bao phủ bởi b. Lệnh nào bạn sẽ sử dụng để xóa những gì được bao phủ bởi ^? Hay để kéo nó?

Logic giống như ngôn ngữ đó là toàn bộ vấn đề chỉnh sửa phương thức; có thể mất một chút thời gian để điều chỉnh nó nhưng không có sự thay đổi.

Các lệnh tương đương trong chế độ chèn là: <C-Right>, <C-Left>, <Home>, <End>, <C-w>và ... không có gì nhưng bạn có thể tạo ra một bản đồ đơn giản: inoremap <C-something> <C-o>dw.

Quay trở lại NORMALchế độ để phát hành một chuyển động, chỉ để vào lại INSERTchế độ là không tối ưu.

Thật. Cách tiếp cận đúng là vào chế độ chèn để chèn càng ít văn bản càng tốt và trở về chế độ bình thường càng sớm càng tốt.

Ví dụ 1: Khi ở INSERTchế độ chèn a (ở đầu biểu thức, tôi nên di chuyển đến cuối biểu thức hoặc dòng để chèn tương ứng )trong Vim như thế nào?

Giống như trong bất kỳ trình soạn thảo văn bản hoặc IDE hoặc bộ xử lý văn bản hoặc <textarea>:

<End>)

Ví dụ 2: Khi chỉnh sửa văn bản, người ta thường có thể muốn xóa một từ tiến hoặc lùi trong khi viết hoặc chỉnh sửa một câu hoặc mã. Sẽ là bất thường khi có một câu / mã được hình thành hoàn hảo trong tâm trí của một người, sẵn sàng gõ "một lần" trước thời hạn; thường một câu thay đổi khi một người đang làm việc với văn bản. Các hạn chế của INSERTchế độ đang làm cho loại chỉnh sửa này trở nên khó khăn đối với tôi trong Vim. Tôi cảm thấy không thể thao tác hiệu quả văn bản trong chế độ chèn, luôn thấy mình phải chuyển về NORMALchế độ cho các chuyển động đơn giản hoặc xóa các từ.

Một lần nữa, chế độ chèn là để chèn văn bản. "Thao tác văn bản" và di chuyển xung quanh được cho là xảy ra ở chế độ bình thường.

Hãy hỏi những câu hỏi chính xác hơn.


Sử dụng chuyển động (chẳng hạn như Endhoặc phím mũi tên) trong INSERTchế độ là OK?
SabreWolfy

4
Tất nhiên, bất cứ điều gì làm cho công việc của bạn dễ dàng hơn.
romainl

3

Vim-way thực hiện chức năng tương tự là gì? Quay trở lại chế độ BÌNH THƯỜNG để phát hành một chuyển động duy nhất, chỉ để vào lại chế độ INSERT là không tối ưu.

Chà, người ta có thể nói Vim-way là không ở trong chế độ INSERT. Khoảnh khắc khai sáng trong Vim đến khi bạn nhận ra mình không cần ở chế độ INSERT như thế nào. Có nhiều cách để chèn văn bản và tất cả chúng đều bắt đầu từ chế độ BÌNH THƯỜNG.

Điều đó đang được nói, bản thân tôi không phải là một người thực sự và tôi đã ánh xạ lại các phím để thực hiện công việc (à Windows):

nmap <C-BACKSPACE> dbi
nmap <C-DEL> dei
imap <C-BACKSPACE> <ESC>ldbi
imap <C-DEL> <ESC>ldei
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.