Làm cách nào để giữ mã được định dạng là nguồn ban đầu khi tôi dán chúng vào vim?


37

Khi tôi sao chép một số mã từ các trang web và dán nó vào VIM, tôi thấy nó trở thành một kiểu lộn xộn như một cái thang như sau

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

Vì nó thường xuyên bị rối nên tôi nghĩ có lẽ có gì đó không ổn với tôi .vimrcnhư sau:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

Thông thường tôi viết python trong VIM. Và sự giúp đỡ sẽ được đánh giá cao.


1
Cảm ơn. Điều này làm tôi khó chịu trong nhiều năm và tôi không bao giờ có thể hỏi ai về điều đó. +1.
DevSolar

Câu trả lời:


50

Làm điều này trước:

:set paste

Sau đó:

:set nopaste

Không cần thiết cho gvim; nó tự động bật và tắt khi dán.
Benjamin Bannier

bất cứ ý tưởng tại sao đó là?
Nathan Fellman

1
Chỉ cần đoán: Plain vim chỉ là dòng lệnh và không "biết" về bảng tạm. Nó lấy "dán" làm một chuỗi ký tự đầu vào và áp dụng tự động thụt lề. Gvim nhận biết GUI có thể "biết" rằng dữ liệu đến là từ bảng ghi tạm và do đó vô hiệu hóa tính năng tự động cho mục đích.
DevSolar

Đúng rồi. Thiết bị đầu cuối coi hoạt động "dán" là đầu vào ký tự thô.
Ignacio Vazquez-Abrams

Đây không hoàn toàn là một vấn đề vim - bạn có thể có một ảnh hưởng tương tự dán vào trình soạn thảo DOS cũ trong một dấu nhắc lệnh. Chương trình này dường như bị thiếu trong Windows 7 64 bit - có lẽ vì đây thực sự là một ứng dụng DOS 16 bit cũ và nó không đáng để cập nhật. Mặc dù vậy, trong Windows XP, và việc dán vào đó (1) hoạt động rất chậm, diễn ra đầu vào theo từng ký tự và (2) tạo ra một mớ hỗn độn thực sự.
Steve314

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

Chuyển đổi tự động thụt lề để dán mã

Lý lịch

Nếu bạn sử dụng các lệnh Vim để dán văn bản, không có gì bất ngờ xảy ra. Vấn đề chỉ phát sinh khi dán từ một ứng dụng khác và chỉ khi bạn không sử dụng phiên bản GUI của Vim. Trong phiên bản console hoặc terminal của Vim, không có quy trình chuẩn để dán văn bản từ ứng dụng khác. Thay vào đó, thiết bị đầu cuối có thể giả lập dán bằng cách chèn văn bản vào bộ đệm bàn phím, vì vậy Vim nghĩ rằng văn bản đã được người dùng gõ. Sau khi mỗi dòng kết thúc, Vim có thể di chuyển con trỏ để dòng tiếp theo bắt đầu với cùng thụt lề như cuối cùng. Tuy nhiên, điều đó sẽ thay đổi thụt lề đã có trong văn bản đã dán.

Dán chuyển đổi

Đặt phần sau vào vimrc của bạn (thay đổi thành bất kỳ khóa nào bạn muốn):

set pastetoggle=<F2>

Để dán từ ứng dụng khác:

  • Bắt đầu chế độ chèn.
  • Nhấn F2 (bật tùy chọn 'dán').
  • Sử dụng thiết bị đầu cuối của bạn để dán văn bản từ bảng ghi tạm.
  • Nhấn F2 (tắt tùy chọn 'dán').

Sau đó, thụt lề hiện có của văn bản dán sẽ được giữ lại.

Bạn không phải bắt đầu chế độ chèn trước, nhưng nếu bạn ở chế độ bình thường và có ánh xạ cho F2, ánh xạ đó sẽ được áp dụng và chức năng 'pastetoggle' sẽ không hoạt động.

Một số người thích phản hồi trực quan được hiển thị trong dòng trạng thái bằng cách thay thế sau cho vimrc của bạn:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

Dòng đầu tiên thiết lập ánh xạ để nhấn F2 ở chế độ bình thường sẽ đảo ngược tùy chọn 'dán' và sau đó sẽ hiển thị giá trị của tùy chọn đó. Dòng thứ hai cho phép bạn nhấn F2 khi ở chế độ chèn, để bật và tắt 'dán'. Dòng thứ ba cho phép hiển thị liệu 'dán' có được bật trong chế độ chèn hay không.


1
+1 cho giải pháp phím nóng. Đối với người không quá vững trong VIM (như tôi), người đã ánh xạ các phím F sang một thứ khác (như tôi), <C-F2> sẽ là Ctrl-F2 ...
DevSolar

tuyệt vời - Bây giờ tôi đang sử dụng cái này
hoju

tại sao không chỉ ánh xạ các phím dán để thực hiện việc này một cách tự động, như <S-Chèn> hoặc <Ctrl + V>, cùng với các chức năng ban đầu của chúng? Hoặc, viết một chức năng vô hiệu hóa dán khi có nhiều hơn một vài ký tự đầu vào được ghi vào bộ đệm trong một giây, đó chỉ là một ý tưởng, tất nhiên đối với tôi, tôi gần như TẤT CẢ các phím của mình được ánh xạ tới các thứ khác vì vậy nó rất đau , Tôi thậm chí còn có một bàn phím với 12 phím F và hơn 15 phím F (phím G), và với điều đó, ba cấp độ, vẫn chưa đủ :) nhưng đó chỉ là tôi. Vấn đề duy nhất là, menu chuột phải, không có esc seqs nào được gửi để báo hiệu bắt đầu dán ...
osirisgothra

2

Đó là autoindent đang gây rối với bạn.

set autoindent
set smartindent

Cố gắng vô hiệu hóa chúng khi bạn cắt và dán mã của mình, sau đó kích hoạt lại chúng khi bạn hoàn thành.


-2

Lượng nỗ lực thấp nhất để đạt được điều này là (có thể đưa vào .vimrc):

:set paste

Sau đó dán mã của bạn.


3
Các 'paste'tùy chọn không bao giờ có nghĩa là để được thiết lập vĩnh viễn. Nó vô hiệu hóa rất nhiều thứ, bao gồm cả ánh xạ và viết tắt. Bên cạnh đó, một câu trả lời trước đã bao gồm các 'paste'tùy chọn.
Heptite

2
Chào mừng bạn đến với Siêu người dùng! Điều này trùng lặp một câu trả lời hiện có và không thêm nội dung mới. Vui lòng không đăng câu trả lời trừ khi bạn thực sự có điều gì đó mới để đóng góp.
Toby Speight
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.