Tôi có thể tăng tốc dán vào vim không?


12

Tôi đã sao chép một phần HTML ra khỏi trang web và muốn lưu nó vào một tệp. Vì vậy, tôi đã bắt đầu một vim phiên mới trong cửa sổ đầu cuối, với tên tệp (mới) được chỉ định trên dòng lệnh, nhấn iđể vào chế độ chèn và sau đó CtrlShift+ Vvà chờ trong khi [-- INSERT --]hiển thị ở dưới cùng và chờ ...

Như vimkhông phản hồi sau vài giây, tôi đã mở 'Trình soạn thảo văn bản' từ menu Ứng dụng → Accessoiries dán văn bản (xuất hiện trong một phần của giây, lưu nó dưới một tên mới, đóng và giết phiên Vim vẫn chưa được thực hiện, 1,5 phút sau. Số lượng văn bản là 186K trong 3200 dòng, tôi không nói quá nhiều, cũng không phải với những dòng quá dài.

Có cách nào để tăng tốc các loại chèn vào này vimvà / hoặc có một lời giải thích tại sao điều này quá chậm so với việc sử dụng Trình soạn thảo văn bản, theo định hướng khủng khiếp và chuột không?

(% CPU theo topkhông đạt trên 5%, mặc dù tôi có một số bộ xử lý miễn phí trong hệ thống, do đó có thể là một số vấn đề ràng buộc I / O, không tồn tại khi đọc cùng một văn bản từ một tệp)

Thông tin phiên bản:
Ubuntu 12.04
Vim: 7.3, với các bản vá được cung cấp bởi Ubuntu 12.04
bash: 4.2.25
gnome-terminal: 3.4.1.1


1
Tôi nghĩ rằng nó chậm b / c nó phải phân tích cú pháp đầu vào và cố gắng định dạng nó, v.v. Tôi không chắc chắn về tùy chọn để làm điều này nhưng sẽ cho rằng bạn có thể tạm thời vô hiệu hóa tính năng đó vim, thực hiện dán, và sau đó kích hoạt lại nó Cũng thử sử dụng :set pastetính năng này để xem nó có cải thiện mọi thứ không. Xem :help pastenó mô tả làm thế nào để vimkhông phân biệt b / w gõ và dán.
slm

Tôi cũng sẽ vicố gắng phân tích tệp khi đọc (sau khi lưu cách @ l0b0 đề xuất). Nhưng nó hoạt động nhanh.
Anthon

Đúng, nhưng tôi đang tưởng tượng rằng nó phải lặp lại mọi thứ mà nó đã phân tích cú pháp + ký tự mới khi bạn dán nó. Đó dường như là những gì đang diễn ra khi bạn chỉnh sửa một tệp, ở một mức độ.
slm

điều :set pastenày dường như không thực sự tạo ra sự khác biệt (tôi không sử dụng đồng hồ bấm giờ, chỉ là đồng hồ treo tường).
Anthon

OK, chỉ là một ý nghĩ ...
slm

Câu trả lời:


14

Để lưu nhanh nhiều văn bản clipboard vào tệp một cách nhanh chóng, bạn có thể chạy cat > file.txt, dán nội dung, sau đó nhấn Ctrl- d.

Nếu bạn đã cài đặt xsel , bạn có thể thực hiện :r !xselđể chèn lựa chọn "chính" (còn gọi là "chuột") trong Vim hoặc :r !xsel -bđể chèn bộ đệm "clipboard" ( Ctrl- c). Bạn cũng có thể lưu lựa chọn trực tiếp vào một tệp có xsel >file.txthoặc xsel -b >file.txt. Điều này loại bỏ sự cần thiết phải dán các hành động + EOF riêng biệt và tránh in toàn bộ bộ đệm sao chép trong thiết bị đầu cuối.

Nếu bạn không có xsel nhưng xclip, các lệnh tương ứng xclip -outdành cho lựa chọn chính hoặc xclip -out -selection clipboardcho bộ đệm clipboard.


1
Cảm ơn, ít nhất là hoạt động mà không cần phải quay lại chuột và chèn tệp vào vim (ví dụ: khi tôi không bắt đầu với một tệp trống) là đủ nhanh chóng.
Anthon

Tôi không hiểu tại sao điều này không thể được liên kết với ctrl + shift + v hoàn toàn không có ý nghĩa gì trong tất cả những điều này.
mchid

2

Đây là một vấn đề bộ đệm xả vào đĩa. Vim cố gắng giữ công việc của bạn an toàn và không cho rằng bạn có thể nhập vài nghìn ký tự mỗi giây. Đọc :help swap-fileđể biết một số chi tiết về bộ đệm. Giải pháp cho vấn đề của bạn là:

Tắt hoán đổi của vim với:

vim -n <your file>

hoặc từ bên trong vim trước khi dán:

:set noswapfile

Xem :help swapfileđể biết thêm chi tiết.

Một tùy chọn khác là chỉ cần tắt đồng bộ hóa vào đĩa của tệp hoán đổi với :set swapsync=nhưng tùy chọn này cần thêm tổ hợp phím để hoàn tác và tôi lười biếng. :)

Tắt trao đổi không an toàn cho các hoạt động bình thường! Ngay sau khi dán, sử dụng :set swapfilehoặc :set swapsync=fsyncđể trở lại hành vi bình thường (mặc dù về mặt kỹ thuật, hành vi bình thường có thể đã được đồng bộ hóa và không phải là fsync , hãy kiểm tra :set swapsync?trước nếu bạn muốn đi tuyến đường này).


1
điều này không tăng tốc mọi thứ cho tôi ...
elig

1

Nếu bạn có xterm_clipboardtính năng, bạn có thể sử dụng *+đăng ký. Các thanh ghi này giao diện với bộ đệm lựa chọn chính X11 và bảng tạm (tương ứng).

Do đó, nếu bạn đã sao chép một cái gì đó qua CTRL+ c, bạn có thể dán nó vào vim với "+p.

Nếu bạn chỉ cần tô sáng nó mà không cần sao chép, bạn có thể dán nó vào "*p.
Bạn cũng có thể làm cho *bộ đệm thành bộ đệm mặc định bằng cách thực hiện :set clipboard=unnamed. Sau đó, bất kỳ yank ( y), paste ( p), v.v., không chỉ định một thanh ghi sẽ sử dụng thanh *ghi. Vim 7.3.74 cũng được thêm vào clipboard=unnamedplus, sẽ sử dụng thanh +ghi theo mặc định.

Bạn cũng có thể sao chép mọi thứ vào bộ đệm chính & bộ đệm clipboard bằng cách kéo dài, ví dụ : "+yy.

 

Lưu ý, như đã đề cập, tất cả các khả năng này đều cần xterm_clipboardtính năng này. Bạn có thể xem nếu bạn có tính năng này bằng cách thực hiện :versionbên trong vim hoặc vim --versiontừ trình bao và tìm kiếm +xterm_clipboard. Nếu nó nói -xterm_clipboard, bạn không có nó và sẽ phải biên dịch lại vim.


Tôi không có tính năng đó. Sẽ biên dịch lại trợ giúp ngay cả vim không chạy dưới xterm? (Tôi đang sử dụng gnome-terminal).
Anthon

@Anthon Nếu bạn đang sử dụng GUI VIM, thì tôi tin rằng các thanh ghi cũng được bật. xterm_clipboardchỉ khi chạy vim từ thiết bị đầu cuối.
Patrick

Đây chỉ là văn bản, không có GUI VIM, nhưng không chạy từ đó xterm.
Anthon

Ồ, xin lỗi tôi đã đọc sai. Có xterm_clipboardáp dụng cho bất kỳ trình giả lập thiết bị đầu cuối, không chỉ xterm. Bản thân tôi sử dụng urxvt.
Patrick
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.