Thay đổi hành vi thụt lề Vim theo loại tệp


379

Ai đó có thể giải thích cho tôi bằng những thuật ngữ đơn giản để dễ dàng thay đổi hành vi thụt đầu dòng của Vim dựa trên loại tệp không? Chẳng hạn, nếu tôi mở tệp Python thì nó sẽ thụt vào với 2 khoảng trắng, nhưng nếu tôi mở tập lệnh Powershell thì nó sẽ sử dụng 4 khoảng trắng.


9
Quy ước BTW - PEP8 cho Python nói rằng tabstop phải là 4 khoảng trắng và các tab phải là 4 khoảng trắng. ref: stackoverflow.com/questions/120926/ từ
csseller

Câu trả lời:


304

Bạn có thể thêm .vimcác tệp sẽ được thực thi bất cứ khi nào vim chuyển sang một kiểu tệp cụ thể.

Ví dụ: tôi có một tệp ~/.vim/after/ftplugin/html.vim có nội dung này:

setlocal shiftwidth=2
setlocal tabstop=2

Điều này khiến vim sử dụng các tab có chiều rộng 2 ký tự để thụt lề ( noexpandtabtùy chọn này được đặt trên toàn cầu ở nơi khác trong cấu hình của tôi).

Điều này được mô tả ở đây: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 , cuộn xuống phần trên các plugin filetype.


229
Bạn nên đặt nó vào ~/.vim/after/ftplugin/html.vimthay thế. Nhưng như những người khác đã chỉ ra dưới đây, sẽ tốt hơn nếu chỉ thêm autocmd FileType html setlocal shiftwidth=2 tabstop=2vào của bạn .vimrc.
Aristotle Pagaltzis

10
Rất tiếc, thực sự, đó là / nơi / tôi có tập tin đó. Tôi sẽ sửa câu trả lời. Mặc dù vậy, tôi không đồng ý, tôi nghĩ việc tách các lệnh cho các loại tệp khác nhau thành các tệp riêng biệt giúp mọi thứ dễ dàng hơn nhiều, đặc biệt nếu bạn có yêu cầu đối với nhiều loại tệp hoặc nhiều tùy chọn cho một số loại tệp.
SpoonMeiser

3
Trên thực tế, không có nhiều lý do để sử dụng thư mục sau cho ftplugins. Vim sẽ tải tất cả chúng mà nó tìm thấy trong runtimepath của bạn, không chỉ giống như lần đầu tiên cho các tệp cú pháp.
Graywh

36
FYI: không sử dụng js cho kiểu tệp javascript. Sử dụng javascript thay thế. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo

13
Bạn cũng cần thêm filetype plugin onvào vimrc của mình.
gatoatigrado

191

Sử dụng ftplugins hoặc autocommands để đặt tùy chọn.

ftplugin

Trong ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

Và đừng quên bật chúng lên ~/.vimrc:

filetype plugin indent on

( :h ftpluginđể biết thêm thông tin)

tự động

Trong ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

Bạn có thể thay thế bất kỳ các lệnh dài hoặc cài đặt với các phiên bản ngắn của họ:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

Tôi cũng sẽ đề nghị học sự khác biệt giữa tabstopsofttabstop. Rất nhiều người không biết về softtabstop.


1
Cảm ơn! Cũng cảm ơn vì điều đó về 'ts' và 'sts'. Có bất kỳ trang cụ thể nào mà bạn đề nghị thảo luận về sự khác biệt này và cách sử dụng nó không?
jvriesem

11
@jvriesem Không có gì nhiều: 'ts' là cách các ký tự tab được hiển thị; 'sts' là có bao nhiêu "khoảng trắng" để chèn khi nhấn phím tab; 'Sw' là số lượng "khoảng trắng" được sử dụng cho mỗi mức thụt lề; 'Et' là sử dụng dấu cách hoặc tab; 'sta' cho phép bạn chèn 'sw' "khoảng trắng" khi nhấn tab ở đầu dòng.
Graywh

10
Tôi tự hỏi nếu các hình thức đầy đủ sẽ tốt hơn để sử dụng, cho rõ ràng, hơn là câu cộc lốc ở cuối.
đá

23
swlà viết tắt của softwidth, stsviết tắt của softtabstop, etviết tắt expandtab, setlviết tắt setlocalauviết tắt autocmd. Bạn có thể sử dụng các hình thức dài thay vì các hình thức ngắn.
Flimm

13
Tôi tin rằng swmở rộng để shiftwidthhơn là softwidth.
johncip

83

chỉnh sửa của bạn ~/.vimrcvà thêm các loại tệp khác nhau cho các thụt lề khác nhau, ví dụ: tôi muốn html/rbthụt lề cho 2 khoảng trắng và js/coffeecác tệp thụt lề cho 4 khoảng trắng:

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

tham khảo: Đặt tùy chọn khoảng trắng Vim theo filetype


Nhận xét cho vimrc là độc thân ":)
sdkks

@sdkks Tôi không nghĩ vậy. trích dẫn kép là nhận xét, trích dẫn đơn 'đưa ra lỗi trên tất cả vim Linux của tôi. (7.3+, 8.0 ...)
Siwei Shen ngày

Vâng. Nhận xét của tôi nói rằng hãy sử dụng một từ duy nhất ", nghĩa là đừng đóng nó với cái khác ". Không chắc chắn tại sao tôi nhận xét rằng mặc dù.
sdkks

ok, tôi hiểu lầm bạn Tôi mặc dù trích dẫn duy nhất có nghĩa 'nhưng không trái "mà không có quyền " @. @
Siwei Shen

60

Đặt các lệnh autocmd dựa trên hậu tố tệp trong ~ / .vimrc của bạn

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

Các lệnh bạn đang tìm kiếm có lẽ là ts = và sw =


18
Lợi thế của việc này là FileTypegì?
Casey Chow

3
Có cách nào để đảo ngược trận đấu?
SystemParadox

7
Tôi đã gặp vấn đề khi để các kiểu tệp hoạt động với các tệp html (vì tệp .html không thực sự là HTML, mà là tệp HTML mẫu có ngôn ngữ tạo khuôn mẫu). Filetypes dường như không nhận ra nó là html, nhưng phương pháp này sẽ.
Đánh dấu Hildreth

3
@digitxp - lợi thế là khi tiện ích mở rộng của bạn được sử dụng không khớp với "Loại tệp" được xác định. Ví dụ: trong phần cài đặt của tôi, * .md có nghĩa là một kiểu tệp của Modula2 trong khi tôi đang sử dụng nó để đánh dấu. Tôi có thể (a) thay đổi cài đặt FileType mặc định (b) thay đổi cài đặt filetype bằng cấu hình tùy chỉnh hoặc (c) nhanh chóng nhận được những gì tôi muốn bằng cách sử dụng cài đặt này trong tệp 1 .vimrc mà tôi đã đi với (c).
pdwalker

Sẽ đáng để chỉ ra rằng - giả sử việc đọc nhanh các tài liệu của tôi là chính xác - bạn có thể thêm nhiều lệnh cho mỗi kiểu tệp theo cách này và chúng được đảm bảo được thực hiện theo thứ tự đã cho.
gạch dưới

23

Tôi thường làm việc với expandtabset, nhưng điều đó không tốt cho makefiles. Gần đây tôi đã thêm:

:autocmd FileType make set noexpandtab

đến cuối tệp .vimrc của tôi và nó nhận ra Makefile, makefile và * .mk là tệp tạo tệp và không mở rộng các tab. Có lẽ, bạn có thể mở rộng này.


Tùy chọn tốt hơn là bật: plugin filetype. Cái mặc định cho Vim bao gồm: setl noet, vì vậy bạn thậm chí không cần aucmd đó trong vimrc của mình.
Graywh

ĐỒNG Ý. Bạn có thể giải thích những lợi ích của điều đó, và những gì liên quan đến việc làm nó? Tại sao các plugin filetype tốt hơn autocmd? Khi nào nên sử dụng autocmd? Không được sử dụng?
Jonathan Leffler

5
Các plugin filetype đi kèm với Vim sẽ làm những việc hữu ích như "setlocal noExandtab" cho makefiles chẳng hạn. Autocommands vs ftplugins cho những thứ cá nhân như dịch chuyển không quan trọng - đó chỉ là cách bạn chọn để cấu trúc cấu hình vim của mình.
Graywh

17

Cá nhân, tôi sử dụng các cài đặt này trong .vimrc:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab

22
Nhiều ngôn ngữ đã được thành lập từ lâu, cũng như các công ty nhất định. Lấy NodeJS làm ví dụ trước đây. Tab nên là hai khoảng trắng. Nhức đầu, và khá ngớ ngẩn, nhưng quan trọng.
Paul Hazen

3
Tại sao các tab phải giống nhau cho tất cả các trường hợp? Đối với một tệp cấu hình, 8 tab không gian hoạt động tốt, nhưng đối với mã có nhiều điểm thụt lề, 2 sẽ dễ quản lý hơn nhiều. Và sau đó, có các quy ước cố định: node.js nên có 2 tab không gian và python thực sự không hợp lệ về mặt cú pháp với bất kỳ thứ gì ngoài 4 tab không gian.
felixphew

1
@felixphew Python hoàn toàn chính xác với bất kỳ số lượng khoảng trắng (hoặc thậm chí các tab) miễn là nó vẫn giữ nguyên cho đến hết.
James

@DJMcMayhem Bạn nói đúng - Tôi nên nói "rất khuyến khích".
felixphew

1
+1 cho Nello. Ký tự tab có truyền thống lâu đời có nghĩa là nhảy sang vị trí tiếp theo với bội số 8 ký tự. Chỉ vì mọi người muốn sử dụng tab cho "thụt lề tiếp theo có vẻ tốt trong ngôn ngữ của tôi" và vì một số trình soạn thảo văn bản không bận tâm tạo ra sự khác biệt giữa "thêm ký tự tab" và "thêm khoảng trắng để thụt lề" và mọi người điều chỉnh trình soạn thảo của họ để có cách của họ, rằng bây giờ chúng ta có mớ hỗn độn này, nơi các tab không bao giờ hiển thị theo cách dự định. Mã nguồn là văn bản và tiêu chuẩn cho văn bản là các tab 8 ký tự.
Florian F

6

Điều này có thể được hầu hết chúng ta biết, nhưng dù sao (lần đầu tiên tôi đã bối rối): Làm :set et( :setmở rộng) không thay đổi các tab đã tồn tại trong tệp, người ta phải làm :retab. Ví dụ:

:set et
:retab

và các tab trong tệp được thay thế bằng đủ khoảng trắng. Để có các tab trở lại chỉ cần làm:

:set noet
:retab

4

Hôm nay, bạn có thể dùng thử Editorconfig , cũng có một plugin vim cho nó. Với điều này, bạn không chỉ có thể thay đổi kích thước thụt lề trong vim, mà trong nhiều trình soạn thảo khác, giữ các kiểu mã hóa nhất quán.

Dưới đây là một Editorconfig đơn giản, như bạn có thể thấy, các tệp python sẽ có 4 khoảng trắng để thụt lề và các tệp mẫu pug sẽ chỉ có 2.

# 4 space indentation for python files
[*.py]
indent_style = space
indent_size = 4

# 2 space indentation for pug templates
[*.pug]
indent_size = 2

3

Mặc dù bạn có thể định cấu hình thụt lề của Vim chỉ bằng cách sử dụng plugin thụt lề hoặc sử dụng cài đặt theo cách thủ công, tôi khuyên bạn nên sử dụng tập lệnh python có tên Vindect tự động đặt các cài đặt có liên quan cho bạn khi bạn mở tệp python. Sử dụng mẹo này để làm cho việc sử dụng Vindect thậm chí hiệu quả hơn. Khi tôi lần đầu tiên bắt đầu chỉnh sửa các tệp python được tạo bởi những người khác với các kiểu thụt lề khác nhau (tab so với không gian và số lượng khoảng trống), điều đó thật khó chịu. Nhưng Vindect cùng với tập tin thụt lề này

Cũng đề nghị:


2

Đối với những người sử dụng autocmd, đó là một thực hành tốt nhất để nhóm những người lại với nhau. Nếu một nhóm có liên quan đến phát hiện loại tệp, bạn có thể có một cái gì đó như thế này:

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

Các nhóm giúp giữ cho .vimrctổ chức đặc biệt là một khi filetype có nhiều quy tắc liên quan đến nó. Trong ví dụ trên, một phím tắt nhận xét dành riêng cho các tệp .c được xác định.

Cuộc gọi ban đầu để báo autocmd!cho vim xóa bất kỳ autocommands nào được xác định trước đó trong nhóm đã nói. Điều này sẽ ngăn định nghĩa trùng lặp nếu .vimrccó nguồn gốc một lần nữa. Xem :help augroupđể biết thêm.


1

Tôi sử dụng một tiện ích mà tôi đã viết trong C được gọi autotab. Nó phân tích đầu tiên vài ngàn dòng của một tập tin mà bạn tải và xác định giá trị cho các thông số Vim shiftwidth, tabstopexpandtab.

Điều này được biên dịch bằng cách sử dụng, ví dụ , gcc -O autotab.c -o autotab. Hướng dẫn tích hợp với Vim nằm trong tiêu đề bình luận ở trên cùng.

Autotab khá thông minh, nhưng đôi khi có thể bị nhầm lẫn, đặc biệt bởi điều đó đã được duy trì không nhất quán bằng cách sử dụng các kiểu thụt đầu dòng khác nhau.

Nếu một tệp rõ ràng sử dụng các tab hoặc kết hợp các tab và khoảng trắng để thụt lề, Autotab sẽ tìm ra kích thước tab nào đang được sử dụng bằng cách xem xét các yếu tố như căn chỉnh các yếu tố bên trong qua các dòng liên tiếp, chẳng hạn như nhận xét.

Nó hoạt động với nhiều ngôn ngữ lập trình và tha thứ cho các phần tử "ngoài băng" không tuân theo gia tăng thụt lề, chẳng hạn như chỉ thị tiền xử lý C, nhãn câu lệnh C, không đề cập đến các dòng trống rõ rà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.