2008-12-09 26 views
46

Khi tôi thêm # ở chế độ chèn trên dòng trống trong Vim trong khi chỉnh sửa tệp python, vim sẽ di chuyển dấu # đến đầu dòng, nhưng tôi muốn # được chèn ở cấp độ tab nơi tôi đã nhập.Cách cấu hình vim để không đặt chú thích ở đầu dòng khi chỉnh sửa tệp python

Ví dụ, khi viết những dòng này trong vim

for i in range(10): 
    # 

cáC# không ở lại đó nơi tôi bước vào nó.

Nó được di chuyển như vậy, bởi vim.

for i in range(10): 
# 

Có ai biết mục cấu hình trong vim sẽ thay đổi điều này không?

Nếu được, tôi đang sử dụng Ubuntu 8.10.

+0

Xem thêm: http://stackoverflow.com/questions/191201/indenting-comments-to-match-code-in-vim – Dan

Trả lời

31

Tôi tìm thấy một câu trả lời ở đây http://vim.wikia.com/wiki/Restoring_indent_after_typing_hash

Có vẻ như rằng tùy chọn smartindent vim là nguyên nhân của vấn đề. Trang được tham chiếu ở trên mô tả công việc-a-round nhưng sau khi đọc trợ giúp trong smartindent trong vim chính nó (: help smartindent), tôi quyết định thử cindent thay vì smartindent.

tôi thay

set smartindent 

với

set cindent 

trong tập tin vimrc của tôi

và cho đến nay nó đang làm việc một cách hoàn hảo.

Thay đổi này cũng đã khắc phục hành vi của '< <' và '>>' cho các khối hình ảnh thụt lề bao gồm nhận xét python.

Có nhiều tùy chọn cấu hình và thông tin về thụt đầu dòng trong trợ giúp vim cho smartindent và cindent (: help smartindent và: help cindent).

+2

Ah, tôi có "filetype plugin indent on" trong .vimrc của tôi, có lẽ đó là trách nhiệm cho nó hoạt động chính xác cho tôi. http://vimdoc.sourceforge.net/htmldoc/filetype.html – m0j0

+0

Đã lưu ngày của tôi. +1! :) –

+0

có bất kỳ cài đặt cấu hình được khuyến cáo/phổ biến nào cho 'cindent' không? –

1

Cấu hình Vim của tôi không làm điều đó. Bạn có thể thử kịch bản python.vim sẵn từ liên kết này: http://www.vim.org/scripts/script.php?script_id=790

+0

Thật không may, điều đó không hoạt động trong trường hợp của tôi, sự cố vẫn tiếp diễn khi sử dụng nó. Tôi đã sử dụng phiên bản 2.6.3 vì tôi chưa nâng cấp lên python 3.0. Có lẽ sự cố nằm trong tệp /usr/share/vim/vim71/indent/python.vim được cài đặt từ gói vim-runtime Ubuntu? –

2

Nó do tính năng 'smartindent' gây ra. Nếu bạn có :set smartindent trong .vimrc, bạn cần phải xóa nó.

9

tôi có những dòng sau trong vimrc của tôi, dường như được cài đặt theo mặc định với tôi Ubuntu 8,10

set smartindent 
inoremap # X^H# 
set autoindent 

Và tôi không quan sát vấn đề. Có lẽ bạn có thể thử điều này. (Lưu ý rằng^H nên được nhập bởi Ctrl-V Ctrl-H)

19

@PolyThinker Mặc dù tôi thấy phản hồi rất nhiều cho câu hỏi này, theo ý kiến ​​của tôi, đó không phải là giải pháp tốt. Trình soạn thảo vẫn nghĩ rằng nó nên được thụt lề tất cả các con đường bên trái - kiểm tra điều này bằng cách đẩy == trên một dòng bắt đầu bằng một băm, hoặc đẩy = trong khi một khối mã với các chú thích trong nó được đánh dấu để reindent.

Tôi rất muốn giới thiệu filetype indent on và xóa các dòng set smartindentset autoindent (hoặc set cindent) khỏi vimrc của bạn. Một người khác (một cách thông minh là David Bustos) đã đủ tử tế để viết một trình phân tích cú pháp thụt đầu dòng đầy đủ cho chúng tôi; nó nằm ở $ VIMDIRECTORY/indent/python.vim.

(giải pháp cindent Paul lẽ làm việc cho trăn, nhưng filetype indent on là nhiều hơn nữa thường hữu ích.)

+0

Cảm ơn - điều này đã giúp tôi. Tôi đã có một trong những hitch, và đó là tôi đã cố gắng "filetype indent trên" trong gvim (MacVim) và thấy không có thay đổi hành vi. Khi tôi bắt đầu thử nghiệm nó bằng cách thêm nó vào .vimrc, sau đó khởi động lại, tôi thấy thay đổi hành vi. – finity

+0

Cùng một vấn đề, đã thử các giải pháp được chấp nhận (và hoán vị), đặt 'filetye thụt vào' ở cuối .vimrc, và bây giờ # comment'ing python không de/outdent. Nhưng bây giờ điều autoindents cho tôi. Thở dài. – ChuckCottrill

+0

Tắt smartindent không hoạt động đối với tôi (trên cả ubuntu vim và osx mac-vim). Thêm "filetype indent on" vào $ HOME/.vimrc của tôi và khởi động lại [g] vim giải quyết vấn đề của tôi (trên cả chỉnh sửa kịch bản lệnh python và bash). –

4

Giải pháp của tôi đến unindenting của #:

Nếu bạn sử dụng cindent, nhận ra rằng nó được thiết kế cho C và mã hóa C++. Ở đây, # có nghĩa là bạn đang tạo #DEFINE hoặC#MACRO(), vì vậy hành vi là chính xác. Nhưng đối với các ngôn ngữ khác trong đó # là nhận xét, điều đó thật khó chịu.

Sau đây làm việc cho tôi:

" cindent  enable specific indenting for C code 
" set cin  nocin 
set cin 

" cinkeys  The default cinkeys causes leading # to unindent to column 0. 
"    To prevent this, remove the 0# from the definition. 
" set cinkeys=0{,0},0),:,0#,!^F,o,O,e - default 
set cinkeys=0{,0},0),:,!^F,o,O,e 
0

Tôi đã gỡ bỏ set smartindent từ ~/.vimrc nhưng nó vẫn không vô hiệu hóa smartindent. Khi tôi mở tệp .py và chạy :set smartindent?, nó hiển thị smartindent.

Hóa ra đó tiếp tục xuống trong ~/.vimrc là dòng này:

autocmd BufRead *.py set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class 
         ^^^^^^^^^^^ 

Một khi tôi đã xóa "smartindent" từ dòng đó, sau đó smartindent là cuối cùng người khuyết tật và ý kiến ​​của tôi đã thụt vào đúng một lần nữa.

2

Một số câu trả lời khác là hữu ích, nhưng không có câu trả lời nào đủ để ngăn chặn Vim khỏi reindenting một dòng khi '#' là ký tự đầu tiên. Câu trả lời của PolyThinker đã không làm việc cho tôi, nhưng nó đưa ra một đầu mối rằng '#' có thể được ánh xạ lại để "chèn một ký tự, sau đó #, sau đó xóa ký tự thừa và đặt con trỏ ở vị trí cần đặt". Đây là bản đồ thực hiện điều đó:

inoremap # X#<left><backspace><right> 

Điều này là cần thiết vì gói cú pháp của vim dường như coi '#' là ký tự đặc biệt, bất kể tùy chọn được đặt như thế nào. Tôi muốn một dòng bắt đầu bằng '#' giống như một dòng bắt đầu với bất kỳ ký tự nào khác. Giải pháp đáng tin cậy nhất mà tôi đã tìm thấy là bản đồ trên, điều này thực sự làm thay đổi ký tự đầu tiên của dòng.

Lưu ý: Tôi đã tìm thấy ánh xạ này gây ra sự cố sau khi chạy I#<esc> rồi nhấn "." để làm lại việc chèn trước đó. Tôi chưa tìm được giải pháp nào.

Các vấn đề liên quan