Tại sao Vim thụt lề mã không chính xác?


100

Trong Vim, nếu tôi dán tập lệnh này:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

Tôi nhận được những kết quả kỳ lạ:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

Dấu hiệu băm (#) và các tab đã xuất hiện. Tại sao?


31
Đây có thể là một câu hỏi tốt hơn cho vi.stackexchange.com
Eric Renouf

@EricRenouf tại sao? (câu hỏi trung thực)
Qix

3
@qix tôi nghĩ đây là một câu hỏi về cách thức hoạt động của vim, đây là một công cụ phổ biến được sử dụng trên * nix, nhưng * nix không phải là một yêu cầu để sử dụng vim
Eric Renouf

1
@JaredBurrows Tôi chắc chắn hy vọng nó làm được
Eric Renouf

1
Làm thế nào bạn đang kích hoạt dán? Với chuột?
Ben Voigt

Câu trả lời:


122

Có hai lý do:

Để dán trong vimkhi tự động thụt lề được bật, bạn phải thay đổi sang chế độ dán bằng cách nhập:

:set paste

Sau đó, bạn có thể thay đổi để chèn chế độ và dán mã của bạn. Sau khi dán xong, gõ:

:set nopaste

để tắt chế độ dán. Vì đây là hành động phổ biến và thường xuyên, vimcung cấp chế độ dán bật tắt:

set pastetoggle=<F2>

Bạn có thể thay đổi F2thành bất kỳ khóa nào bạn muốn, và bây giờ bạn có thể bật và tắt dễ dàng.


Để tắt tự động chèn nhận xét, bạn có thể thêm các dòng này vào vimrc của mình :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimcũng cung cấp một thanh ghi dán để bạn dán văn bản từ bảng tạm hệ thống. Bạn có thể sử dụng "*phoặc "+ptùy thuộc vào hệ thống của bạn. Trên hệ thống không có X11, chẳng hạn như OSX hoặc Windows, bạn phải sử dụng thanh *ghi. Trên hệ thống X11, như Linux, bạn có thể sử dụng cả hai.

đọc thêm


2
Tôi đã sử dụng Vim mãi mãi và không bao giờ biết về điều này. Cảm ơn nhiều.
Caja

Hầu hết các trình giả lập thiết bị đầu cuối đồ họa hiện đại đều hỗ trợ một tính năng gọi là "chế độ dán khung". Vim có thể yêu cầu thiết bị đầu cuối kích hoạt chế độ này, do đó sẽ bao quanh văn bản được dán với các chuỗi thoát nhất định. Vim có thể nhận ra điều này và tắt gói / thụt trong thời gian dán. Câu chuyện dài: dán sẽ "làm việc như mong đợi". Tôi không phải là người dùng vim, nhưng tìm kiếm web nhanh sẽ chắc chắn cho bạn biết cách định cấu hình chế độ này.
egmont

2
@MichaelDurrant set pastekhông bao giờ nên có trong vimrc của bạn. Nó vô hiệu hóa hoặc đặt lại rất nhiều thứ, bao gồm ánh xạ chế độ chèn, ánh xạ dòng lệnh, chữ viết tắt, độ rộng văn bản, Wramargin, autoindent, smartindent, softtabstop, formatoptions, indentexpr và một vài thứ khác. :h pastecó toàn bộ danh sách. Hầu hết mọi người sử dụng một số hoặc tất cả những điều này và tự hỏi tại sao có các cài đặt bị bỏ qua.
FDinoff

4
Tôi thường sử dụng :r!catđể dán nguyên văn.
Simon Richter

1
Có thể đáng để thảo luận về sự tương tác với set mouse, có thể tự động vào và thoát khỏi chế độ dán khi dán bằng nhấp chuột.
Ben Voigt

36

Sử dụng dán vim. Những gì bạn muốn là dán những gì trên bộ đệm clipboard "+p

Điều này chọn +và dán nó vào vị trí.

Nếu bạn đang sử dụng Linux, *là bộ đệm X / middle-click (văn bản được chọn cuối cùng).

Sau đó, vim biết đó là một dán.

Mặt khác, vim nghĩ rằng bạn đã gõ các phím được dán và thực hiện tự động thụt lề (trên đầu thụt sao chép của bạn) cho đến hết phần dán.

Lưu ý rằng điều này sẽ hoạt động trên SSH, bạn cần đặt tùy chọn cho bảng tạm của mình được chia sẻ -Y

Xem man sshđể biết thêm chi tiết.


4
Đây thực sự là câu trả lời đúng
imho

Có vẻ như điều này chỉ hoạt động cho đồ họa vim ( gvim); vim chạy trong trình giả lập thiết bị đầu cuối sẽ dán văn bản đã xóa cuối cùng với "* p, không phải là lựa chọn hiện tại.
wurtel

Tôi không sử dụng gvim, chỉ thiết bị đầu cuối vim. cài đặt chuột của bạn là gì? cài đặt chuột của tôi là c. Không chắc chắn làm thế nào nó hoạt động khi lựa chọn chuột được cho phép. set mouse?
exussum

2
đồng thời kiểm tra vim --versionxem nó có được biên dịch với hỗ trợ clipboard +xterm_clipboardkhông trong đầu ra
exussum

@wurtel: Có thể bạn đã đặt clipboard với unnamedchuỗi.
cuonglm

8

Các tab được chèn vì bạn đã bật autoindent và bạn có thể vô hiệu hóa hành vi đó bằng cách tắt autoindent ( :set noai) trước khi bạn dán vào thiết bị đầu cuối.

Các dòng nhận xét được tạo ra bằng cách tự động nhận xét và có thể được tắt bằng cách tắt nó.

Thay thế cho những người bạn sẽ có được hành vi mong muốn bằng cách sử dụng các toggles :set paste, dán mã được định dạng của bạn và :set nopasteđể khôi phục hành vi bình thường.

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.