Phím tab == 4 dấu cách và tự động thụt lề sau dấu ngoặc nhọn trong Vim


1265

Làm cách nào để tôi tạo vi - Vim không bao giờ sử dụng các tab (chuyển đổi khoảng trắng thành tab, xấu!), Làm cho phím tab == 4 khoảng trắng và tự động thụt mã sau các khối dấu ngoặc nhọn như Emacs ?

Ngoài ra, làm cách nào để lưu các cài đặt này để tôi không bao giờ phải nhập lại chúng?

Tôi đã thấy những câu hỏi khác liên quan đến vấn đề này, nhưng dường như nó luôn có một chút khác biệt so với những gì tôi muốn.


Câu trả lời:


1882

Như đã được chỉ ra trong một vài câu trả lời dưới đây, phương pháp ưa thích bây giờ KHÔNG phải là sử dụng smartindent, mà thay vào đó sử dụng cách sau (trong .vimrc của bạn ):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

Trong tệp .vimrc: của bạn :

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

Các tệp trợ giúp mất một chút thời gian để làm quen, nhưng bạn càng đọc nhiều, Vim càng nhận được nhiều:

:help smartindent

Thậm chí tốt hơn, bạn có thể nhúng các cài đặt này vào nguồn của mình để có tính di động:

:help auto-setting

Để xem các cài đặt hiện tại của bạn:

:set all

Như Graywh chỉ ra trong các bình luận, smartindent đã được thay thế bằng cindent "Hoạt động thông minh hơn", mặc dù vẫn chủ yếu dành cho các ngôn ngữ có cú pháp giống C:

:help C-indenting


4
Nếu bạn có bộ mở rộng thì nên sử dụng khoảng trắng. Bạn cũng "thiết lập tương thích"? Điều đó có các tác dụng phụ khác nhau, bao gồm đặt lại mở rộng về mặc định là "tắt"
Ken

60
Xin lỗi, nhưng smartindent đã được thay thế bằng cindent, bản thân nó chỉ phù hợp với cú pháp kiểu C. Bật hoặc trong vimrc của bạn có thể là một vấn đề khi làm việc với các ngôn ngữ khác. Chỉ cần sử dụng "filetype thụt vào" thay thế.
Graywh

2
Chà, smartindent cũng chỉ dành cho cú pháp kiểu C và về cơ bản không được dùng nữa.
Graywh

4
Nếu tôi kích hoạt Expandtab, có cách nào để thực sự nhập ký tự tab trong văn bản không?
Daniele Segato

3
@DanieleSegato <ctrl v> <tab> nên hoạt động ở chế độ chèn: stackoverflow.com/questions/4781070/
Ken

236

Liên quan, nếu bạn mở một tệp sử dụng cả tab và dấu cách, giả sử bạn đã có

set expandtab ts=4 sw=4 ai

Bạn có thể thay thế tất cả các tab bằng khoảng trắng trong toàn bộ tệp bằng

:%retab

10
FYI, nếu bạn không muốn tab của mình bị thay thế bởi dấu cách, hãy xóa dòng extendtab.
Eno

6
Không có các khoảng trắng? ;-)
Rob Wells

11
@ Rob-Wells: Tôi đã thay đổi "khoảng trắng" thành "khoảng trắng". Bây giờ bạn có vui không ;-)
netjeff

Bạn có thể giải thích dòng đầu tiên có nghĩa là gì?
Vụ kiện của Quỹ Monica

2
Expandtab xác định nếu các tab được mở rộng vào không gian. ts = tabstop = Số lượng khoảng trống mà <Tab> trong tệp được tính. sw = shift thong = Số lượng khoảng trống để sử dụng cho mỗi bước thụt lề (tự động). ai = autoindent = Sao chép thụt lề từ dòng hiện tại khi bắt đầu một dòng mới.
mcmacerson

89

Cách tốt nhất để có được thụt đầu dòng cụ thể filetype là sử dụng filetype plugin indent ontrong vimrc của bạn. Sau đó, bạn có thể chỉ định những thứ như set sw=4 sts=4 ettrong .vim / ftplugin / c.vim, chẳng hạn, mà không phải tạo các toàn cục đó cho tất cả các tệp được chỉnh sửa và các cú pháp loại không C khác cũng sẽ được thụt lề chính xác (thậm chí cả lisps) .


9
IMHO, tốt hơn so với câu trả lời đã được đánh dấu chính xác. filetype thụt vào thay thế cindent và smartindent.
0fnt

62

Để có các tab 4 không gian trong hầu hết các tệp, char tab rộng 8 thực trong Makefiles và tự động thụt lề trong các tệp khác nhau bao gồm C / C ++, hãy đặt ~/.vimrctệp này vào tệp của bạn :

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.

Tại sao bạn không cần else? Dường như đối với tôi, những dòng cuối cùng ghi đè lên đặc thù của makefile trong mọi trường hợp
lucidbrot

6
Xin chào @lucidbrot, câu lệnh "autocmd FileType make" về cơ bản cho vim biết một số cài đặt để sử dụng bất cứ khi nào nó mở Makefile. Trong khi đó các dòng bên dưới nó đang đặt mặc định. Nói cách khác, cài đặt "tabstop = 8 ..." sẽ được áp dụng sau khi tệp được mở và sẽ ghi đè cài đặt "tabstop = 4 ..." áp dụng khi khởi tạo.
Shervin Emami

56

Trên nhiều hệ thống Linux, như Ubuntu, .vimrctệp không tồn tại theo mặc định, vì vậy bạn nên tạo nó trước.

Không sử dụng .viminfotệp tồn tại trong thư mục chính. Nó được sử dụng cho một mục đích khác nhau.

Bước 1: Chuyển đến thư mục nhà của bạn

cd ~

Bước 2: Tạo tập tin

vim .vimrc

Bước 3: Thêm cấu hình đã nêu ở trên

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

Bước 3: Lưu tệp, bằng cách nhấn Shift+ ZZ.


11
Không sử dụng Shift + ZZnó sẽ tạo tập tin .swp. sử dụng wq.
shas

6
@shas: "ZZ" tương đương với ": x" , giống như ": wq", ngoại trừ việc nó chỉ lưu nếu tệp đã bị thay đổi ... ( Ctrl-Zlà một câu chuyện khác ...)
Gert van den Berg

1
@shas Điều đó đơn giản là không đúng sự thật. Nếu bạn không muốn một tập tin trao đổi cho một chỉnh sửa, bạn phải chạy vim -n <file>. Một tập tin trao đổi không phải là một cái gì đó được tạo ra trong thời gian tiết kiệm; điều đó sẽ làm thất bại khá nhiều mục đích của nó, vì các tệp hoán đổi trở nên hữu ích trong việc khôi phục đột ngột các phiên chỉnh sửa.
Kaz

32

Cách được đề xuất là sử dụng thụt lề dựa trên filetype và chỉ sử dụng smartindent và cindent nếu điều đó không đủ.

Thêm phần sau vào .vimrc của bạn

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

Hy vọng nó sẽ giúp như là một câu trả lời khác nhau.


12

chỉnh sửa ~ / .vimrc của bạn

$ vim ~/.vimrc

thêm các dòng sau:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab


6

Tự động thụt lề dựa trên chế độ cú pháp hiện tại. Tôi biết rằng nếu bạn đang chỉnh sửa Foo.java, sau đó nhập a {và nhấn Enterthụt dòng sau.

Đối với các tab, có hai cài đặt. Trong Vim, nhập dấu hai chấm và sau đó "đặt tabstop = 4" sẽ đặt các tab hiển thị dưới dạng bốn khoảng trắng. Nhấn lại dấu hai chấm và gõ "set extendtab" sẽ chèn khoảng trắng cho các tab.

Bạn có thể đặt các cài đặt này trong .vimrc (hoặc _vimrc trên Windows) trong thư mục chính của bạn, vì vậy bạn chỉ phải nhập chúng một lần.


0

Thứ nhất, không sử dụng Tabphím trong Vim để thụt thủ công. Vim có một cặp lệnh trong chế độ chèn để tăng hoặc giảm số lượng thụt lề theo cách thủ công. Những lệnh đó là Ctrl-TCtrl-D. Các lệnh này quan sát các giá trị của tabstop, shiftwidthexpandtab , và duy trì hỗn hợp chính xác của khoảng trắng và tab (số lượng tab tối đa theo sau bởi bất kỳ số lượng khoảng trắng cần thiết nào).

Thứ hai, các phím thụt thủ công này dù sao cũng không được sử dụng nếu bạn sử dụng thụt lề tự động.

Nếu Ctrl-Tthay vì Tablàm phiền bạn, bạn có thể ánh xạ lại:

:imap <Tab> ^T

Bạn cũng có thể ánh xạ lại Shift-Tabđể thực hiện Ctrl-Ddeindent:

:imap <S-Tab> ^D

Ở đây ^ T và ^ D là các ký tự điều khiển theo nghĩa đen có thể được chèn dưới dạng Ctrl-VCtrl-T.

Với ánh xạ này tại chỗ, bạn vẫn có thể nhập Tab bằng chữ vào bộ đệm bằng cách sử dụng Ctrl-VTab. Lưu ý rằng nếu bạn làm điều này, ngay cả khi :set expandtabđang bật, bạn sẽ nhận được một ký tự tab chưa được mở rộng.

Một hiệu ứng tương tự với <Tab>bản đồ đạt được bằng cách sử dụng :set smarttab, điều này cũng gây ra khoảng lùi ở phía trước của một dòng để hành xử thông minh.

Trong smarttabchế độ, khi Tabđược sử dụng không ở đầu dòng, nó không có ý nghĩa đặc biệt. Đó là khác biệt so với bản đồ trên của tôi về Tabtới Ctrl-T, bởi vì mộtCtrl-T bất cứ nơi nào được sử dụng trong một dòng (trong chế độ chèn) sẽ làm tăng thụt đầu dòng của dòng đó.

Các ánh xạ hữu ích khác có thể là:

:map <Tab> >
:map <S-Tab> <

Bây giờ chúng ta có thể làm những việc như chọn một số dòng và nhấn Tabđể thụt lề chúng. Hoặc đánhTab hai lần trên một dòng (trong chế độ lệnh) để tăng thụt lề.

Nếu bạn sử dụng các lệnh quản lý thụt đầu dòng thích hợp, sau đó tất cả mọi thứ được điều khiển bởi ba thông số: shiftwidth, tabstopexpandtab.

Các shiftwidththông số kiểm soát kích thước thụt đầu dòng của bạn; nếu bạn muốn bốn dấu cách, sử dụng :set shiftwidth=4hoặc viết tắt :set sw=4.

Nếu chỉ điều này được thực hiện, thì thụt lề sẽ được tạo bằng cách sử dụng hỗn hợp các khoảng trắng và tab, vì noexpandtablà mặc định. Sử dụng :set expandtab. Điều này khiến các ký tự tab mà bạn nhập vào bộ đệm mở rộng thành khoảng trắng và để thụt lề do Vim quản lý chỉ sử dụng khoảng trắng.

Khi nào expandtabbật và nếu bạn quản lý thụt đầu dòng của mình thông qua tất cả các cơ chế Vim thích hợp, giá trị của tabstopsẽ trở nên không liên quan. Nó kiểm soát cách các tab xuất hiện nếu chúng xảy ra trong tệp. Nếu bạn có set tabstop=8 expandtabvà sau đó lẻn một tab cứng vào tệp bằng cách sử dụng Ctrl-VTab, nó sẽ tạo ra sự căn chỉnh cho vị trí tab dựa trên 8 cột tiếp theo, như thường lệ.


Tất cả các ánh xạ của bạn nên sử dụng các biến thể không đệ quy. Ánh xạ đi <C-t>có thể sử dụng cú pháp đó chứ không phải bằng chữ. Cuối cùng, ánh xạ <Tab>trong chế độ bình thường cũng sẽ ánh xạ <C-i>(chúng là cùng một ký tự), vì vậy tôi không khuyên bạn (bạn mất một phần tiện lợi của chức năng vim
D. Ben Knoble

@ D.BenKnoble Tôi không đề xuất bất kỳ thứ gì trong số này; Tôi sử dụng Ctrl-T, Ctrl-D và <> bản thân mình. Đó là sử dụng Vim như dự định. Mọi người thường sử dụng Tab trong các trình soạn thảo khác có thể không thích điều đó, chỉ vậy thôi.
Kaz
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.