Chỉnh sửa đa dòng Vim như trong sublimetext?


132

Tôi bắt đầu sử dụng gvim và tôi hoàn toàn không thể hiểu cách chỉnh sửa đa dòng hoạt động trong gvim.

Ví dụ:

Văn bản gốc:

asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

ctrl + q, jjjjjj, $ mọi thứ được chọn, sau đó tôi nhấn I để thực hiện thao tác chèn đa dòng.

Ý định của tôi là chèn các trích dẫn như trong dòng đầu tiên, và sau đó nhấn Esc:

asd "asd asd" asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

Chuyện gì đã xảy ra? Tôi mong đợi một hành vi tương tự như hành vi của sublimetext:

nhập mô tả hình ảnh ở đây

Nếu bạn không biết làm thế nào nó hoạt động, nó chỉ lặp lại các hành động cho mỗi dòng. Làm thế nào có thể đạt được điều đó? Và vim đang làm gì ở đây?


Chỉ cần ghi macro bàn phím để thay đổi dòng đầu tiên và sau đó phát lại macro cho tất cả các dòng khác.
high5

Câu trả lời:


213

Tự mình làm bằng cách bỏ lớp tương thích Windows.

Phím tắt thông thường để vào chế độ Visual-Block là <C-v>.

Những người khác đã xử lý các macro ghi âm, đây là một vài ý tưởng khác:

Chỉ sử dụng chế độ khối hình ảnh .

  1. Đặt con trỏ vào từ thứ hai:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Nhấn <C-v>để vào chế độ chặn trực quan và mở rộng lựa chọn của bạn về phía dưới:

    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    
  3. Lượt I"<Esc>để có được:

    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  4. Đặt con trỏ trên char cuối cùng của từ thứ ba:

    asd "asd as|d| asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  5. Nhấn <C-v>để vào chế độ chặn trực quan và mở rộng lựa chọn của bạn về phía dưới:

    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    
  6. Lượt A"<Esc>để có được:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

Với chế độ khối hình ảnhSurround.vim .

  1. Đặt con trỏ vào từ thứ hai:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Nhấn <C-v>để vào chế độ chặn trực quan và mở rộng lựa chọn của bạn về phía dưới và bên phải:

    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    
  3. Nhấn S"để bao quanh lựa chọn của bạn với ":

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

Với chế độ trực quan:normal.

  1. Nhấn Vđể chọn toàn bộ dòng và mở rộng về phía dưới:

    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    
  2. Thực hiện lệnh này: :'<,'>norm ^wi"<C-v><Esc>eea"<CR>để có được:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    
    • :norm[al]cho phép bạn thực thi các lệnh chế độ bình thường trên một phạm vi dòng ( '<,'>phần được thêm tự động bởi Vim và có nghĩa là "hành động trên khu vực đã chọn")

    • ^ đặt con trỏ trên char đầu tiên của dòng

    • w chuyển sang từ tiếp theo

    • i"chèn a "trước con trỏ

    • <C-v><Esc>là cách của Vim để nhập ký tự điều khiển trong ngữ cảnh này, ở đây <Esc>được sử dụng để thoát chế độ chèn

    • ee di chuyển đến cuối từ tiếp theo

    • a"nối thêm "sau con trỏ

    • <CR> thực hiện lệnh

    Sử dụng Surround.vim, lệnh trên trở thành

    :'<,'>norm ^wvees"<CR>
    

7
Đối với bước 4 và 5, tôi khuyên bạn nên nhấn gvđể lấy lại lựa chọn hình ảnh trước đó của bạn và sau đó di chuyển theo chiều ngang, có lẽ với 2e. (Càng nhiều dòng, giá trị càng cao gv!)
joeytwiddle

4
Surround.vim sử dụng nhỏ sở chế độ bình thường nhưng lớn Sở chế độ trực quan, vì vậy trong bước 3 của phương thức Surround.vim, tổ hợp phím phải làS"
joeytwiddle

1
Điểm 3 của khối hình ảnh + Surround.vim nên S", khôngs"
zool 17/08/2015

1
Thay vì chế độ khối hình ảnh bước 5 và 6, bạn chỉ cần đặt con trỏ sau từ thứ ba và nhấn ..
Jonas

2
Điều này thật tuyệt, nhưng điều này chỉ hoạt động trong một số trường hợp các ký tự bạn muốn chỉnh sửa trên các dòng khác nhau ở cùng một vị trí nằm ngang chính xác trên mỗi dòng và các dòng được chỉnh sửa nối tiếp nhau. Chúng ta không thể chọn nơi để vào trong chế độ chỉnh sửa trên dòng nào trong Vim? Chúng ta có thể trong Sublim ... EDIT: Thật ra câu trả lời thứ hai là thứ tôi đang tìm kiếm
Alexandre Bour trước

30

Đó là một số giải pháp tốt nhất được đưa ra ở trên, nhưng chúng tôi cũng có thể thử một số plugin cung cấp nhiều con trỏ như Sublime.

Tôi nghĩ rằng điều này có vẻ đầy hứa hẹn:

Nó dường như bị bỏ rơi trong một thời gian, nhưng đã có một số đóng góp trong năm 2014.

Nó khá mạnh mẽ, mặc dù tôi phải mất một chút thời gian để làm quen với dòng chảy (khá giống Sublime nhưng vẫn là phương thức như Vim).

Theo kinh nghiệm của tôi nếu bạn có nhiều plugin khác được cài đặt, bạn có thể gặp một số xung đột!

Có một số nỗ lực khác ở tính năng này:

Xin vui lòng chỉnh sửa nếu bạn nhận thấy bất kỳ cải thiện đang trải qua.


Có vẻ như github.com/osyo-manga/vim-over là người tích cực nhất trong số các hiện tại.
Wernight

Tuyệt vời, đó là những gì tôi đang tìm kiếm
Alexandre Bour trước

1
Sau khi thử nghiệm hầu hết trong số họ hlissner / vim-multiedit có vẻ là AFAIAC tốt nhất
Alexandre Bour trước

1
Kiểm tra mg979 / vim-visual-multi như một sự thay thế tốt cho vim-multi-cursors
Mushex Antaranian

29

Có một số cách để thực hiện điều đó trong Vim. Tôi không biết cái nào giống với Văn bản cao siêu nhất.


Cái đầu tiên sẽ thông qua chế độ chèn đa dòng . Đặt con trỏ của bạn đến "a" thứ hai trong dòng đầu tiên, nhấn Ctrl-V, chọn tất cả các dòng, sau đó nhấn Ivà đặt trong doublequote. Nhấn <esc>sẽ lặp lại thao tác trên mỗi dòng.


Cái thứ hai là thông qua các macro. Đặt con trỏ vào ký tự đầu tiên và bắt đầu ghi macro qa. Đi bên phải của bạn với llll, nhập chế độ chèn với a, đặt xuống một doublequote, thoát chế độ chèn và quay lại đầu hàng của bạn với <home>(hoặc tương đương). Nhấn jđể di chuyển xuống một hàng. Dừng ghi với q. Và sau đó phát lại macro với @a. Vài lần.


Có bất kỳ phương pháp trên làm việc cho bạn?


15

nếu bạn sử dụng lệnh "toàn cầu", bạn có thể lặp lại những gì bạn có thể làm trên một trực tuyến với bất kỳ số lượng dòng nào.

:g/<search>/.<your ex command>

thí dụ:

:g/foo/.s/bar/baz/g

Lệnh trên tìm thấy tất cả các dòng có foo và thay thế tất cả các lần xuất hiện của thanh trên dòng đó bằng baz.

:g/.*/

sẽ làm trên mọi dòng


1
Điều này rất hữu ích, tôi không biết điều đó. Có vẻ như sự kết hợp mạnh mẽ và thông minh của các lệnh.
0xc0de

Để thuận tiện, tôi đã viết một hàm nhỏ lấy từ dưới con trỏ (hoặc từ được chọn trực quan), nhắc nhở thay thế, rồi chạy :glệnh được mô tả ở đây. Tôi thích sử dụng /gcđể yêu cầu "xác nhận" để tôi có thể nhấn yhoặc ncho từng thay thế hoặc athay đổi tất cả chúng.
joeytwiddle

11
Ctrl-v ................ start visual block selection
6j .................... go down 6 lines
I" .................... inserts " at the beginning
<Esc><Esc> ............ finishes start
2fdl. ................. second 'd' l (goes right) . (repeats insertion)

Ở bước 3, I không thể vào chế độ chèn, bạn có biết tại sao điều này xảy ra không?
Ninja

Hãy thử tải vim không có plugin: vim -u NONEvà thử thực hiện lại hành động mong muốn, đó có thể là một số bản đồ hoặc plugin thay đổi hành vi của vim của bạn.
SergioAraujo

6

Tôi không chắc chắn những gì vimđang làm, nhưng đó là một hiệu ứng thú vị. Cách bạn mô tả những gì bạn muốn nghe giống như cách các macro hoạt động ( :help macro). Một cái gì đó như thế này sẽ làm những gì bạn muốn với macro (bắt đầu ở chế độ bình thường):

  1. qa: Ghi macro để ađăng ký.
  2. 0w: 0goto bắt đầu của dòng, wnhảy một từ.
  3. i"<Esc>: Nhập chế độ chèn, chèn a "và trở về chế độ bình thường.
  4. 2e: Nhảy đến cuối từ thứ hai.
  5. a"<Esc>: Nối a ".
  6. jq Di chuyển đến dòng tiếp theo và kết thúc ghi macro.

Lấy nhau: qa0wi"<Esc>2ea"<Esc>

Bây giờ bạn có thể thực thi macro với @a, lặp lại macro cuối cùng với @@. Để áp dụng cho phần còn lại của tệp, hãy làm một cái gì đó như99@a giả sử bạn không có quá 99 dòng, thực thi macro sẽ kết thúc khi đến cuối tệp.

Đây là cách để đạt được những gì bạn muốn visual-block-mode(bắt đầu ở chế độ bình thường):

  1. Điều hướng đến nơi bạn muốn báo giá đầu tiên được.
  2. Đi vào visual-block-mode , chọn các dòng bạn muốn ảnh hưởng,G để đi đến dưới cùng của tập tin.
  3. Đánh I"<Esc> .
  4. Di chuyển đến vị trí tiếp theo bạn muốn chèn " .
  5. Bạn muốn lặp lại những gì bạn vừa làm một cách đơn giản .sẽ đủ.

4
Không cần 99 @ a. Nếu bạn muốn thực thi một macro trên mỗi dòng của tệp, hãy thử:% Norm! @a.
Rook

Không có dấu chấm (chúng chỉ là phần cuối của câu, không phải là một phần của lệnh)
Rook

9999@acó thể xấu nhưng nó dễ gõ hơn nhiều :%norm! @avà nó không chạy lại trên dòng bạn vừa chỉnh sửa. Vẫn tốt để biết điều đó. :)
joeytwiddle

0

Giải pháp của tôi là sử dụng 2 ánh xạ này:

map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>

Cách sử dụng chúng:

  1. Chọn dòng của bạn. Nếu tôi muốn chọn 12 dòng tiếp theo, tôi chỉ cần nhấnV12j
  2. nhấn <leader>n
  3. Thay đổi dòng của bạn
  4. Đảm bảo bạn đang ở chế độ bình thường và sau đó nhấn <leader>m

Để thực hiện chỉnh sửa khác, bạn không cần phải thực hiện lại lựa chọn. Chỉ cần nhấn <leader>n, thực hiện chỉnh sửa của bạn và nhấn <leader>mđể áp dụng.


Cách thức hoạt động:

  • <Esc><Esc>0qq Thoát khỏi lựa chọn trực quan, đi đến đầu dòng và bắt đầu ghi một macro.

  • q Dừng ghi macro.

  • :'<,'>-1normal!@q<CR> Từ đầu lựa chọn trực quan đến dòng trước khi kết thúc, hãy phát macro trên mỗi dòng.

  • <Down> Quay trở lại xuống dòng cuối cùng.


Bạn cũng có thể chỉ ánh xạ cùng một khóa nhưng cho các chế độ khác nhau:

vmap <leader>m <Esc><Esc>0qq
nmap <leader>m q:'<,'>-1normal!@q<CR><Down>

Mặc dù điều này làm rối tung khả năng của bạn để thực hiện một chỉnh sửa khác. Bạn sẽ phải chọn lại dòng của bạn.

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.