Xác định lại tab là 4 khoảng trắng


1094

Cài đặt hiện tại của tôi giả định 8 khoảng trắng; Làm thế nào tôi có thể xác định lại nó?


4
Tốt hơn nữa, hãy đặt nó thành bốn khoảng trắng và bật tự động thụt lề cùng một lúc: Tự động thụt lề với băng thông được đặt thành 4 khoảng trắng
solid_liq

7
@ heinrich5991 Tôi không hiểu. Tôi không cần 8 khoảng trắng để nhận ra rằng một dòng được thụt vào và hơn mức cần thiết có nghĩa là giới hạn các ký tự bạn có thể xem trên một dòng văn bản dài (ít nhất là trước khi gói). Nhưng để mỗi riêng của mình. :)
weberc2

40
@ heinrich5991 Đối số của tôi là "sử dụng càng ít càng tốt để dễ dàng xác định một dòng thụt lề". Theo ước tính của tôi, khả năng của một người dễ dàng xác định một vết lõm giảm xuống nhanh chóng ở <3 không gian và nó ngừng tăng ở 4 không gian. Do đó, thụt lề vượt quá 4 không gian là một sự lãng phí, theo kinh nghiệm của tôi.
weberc2

7
@ weberc2 Không thể đồng ý nhiều hơn, anh bạn. Đó là lý do tại sao tôi cảm thấy rất ngột ngạt khi đọc Ruby hoặc "JavaScript hiện đại", mỗi cái sử dụng 2 không gian để thụt lề. Nó hợp pháp cho tôi mỏi mắt khi cố gắng làm theo các cấu trúc được lồng rất nhiều. Tab cứng cho chiến thắng chết tiệt.

Câu trả lời:


1616

Nó phụ thuộc vào ý bạn là gì. Bạn có muốn các ký tự tab thực tế trong tệp của mình xuất hiện rộng 4 khoảng trắng hoặc bằng "tab" bạn thực sự có nghĩa là một thụt lề , được tạo bằng cách nhấn phím tab, điều này sẽ dẫn đến tệp có chứa (tối đa) 4 ký tự khoảng trắng cho mỗi "tab" bạn gõ?

Tùy thuộc vào câu trả lời của bạn, một trong các bộ cài đặt sau sẽ phù hợp với bạn:

  • Đối với các ký tự tab xuất hiện rộng 4 không gian :

    set tabstop=4
    

    Nếu bạn đang sử dụng ký tự tab thực tế trong mã nguồn của mình, có lẽ bạn cũng muốn các cài đặt này (đây thực sự là các mặc định, nhưng bạn có thể muốn đặt chúng một cách phòng thủ):

    set softtabstop=0 noexpandtab
    

    Cuối cùng, nếu bạn muốn thụt lề tương ứng với một tab, bạn cũng nên sử dụng:

    set shiftwidth=4
    
  • Đối với các thụt lề bao gồm 4 ký tự khoảng trắng nhưng được nhập bằng phím tab:

    set tabstop=8 softtabstop=0 expandtab shiftwidth=4 smarttab
    

Để làm cho các cài đặt ở trên vĩnh viễn, hãy thêm các dòng này vào vimrc của bạn .

Trong trường hợp bạn cần thực hiện điều chỉnh, hoặc đơn giản là muốn hiểu tất cả các tùy chọn này có nghĩa là gì, thì đây là một sự cố về ý nghĩa của từng tùy chọn:

tabstop

Độ rộng của một tabstop cứng được đo bằng "khoảng trắng" - hiệu quả là chiều rộng (tối đa) của một ký tự tab thực tế.

shiftwidth

Kích thước của một "thụt". Nó cũng được đo bằng khoảng trắng, vì vậy nếu mã cơ sở của bạn thụt lề với các ký tự tab thì bạn muốn shiftwidthbằng số lần ký tự tab tabstop. Điều này cũng được sử dụng bởi những thứ như =, ><các lệnh.

softtabstop

Đặt giá trị này thành giá trị khác không, tabstopsẽ làm cho phím tab (ở chế độ chèn) chèn một tổ hợp khoảng trắng (và có thể là các tab) để mô phỏng các điểm dừng của tab ở độ rộng này.

expandtab

Kích hoạt tính năng này sẽ làm cho phím tab (ở chế độ chèn) chèn khoảng trắng thay vì ký tự tab. Điều này cũng ảnh hưởng đến hành vi của retablệnh.

smarttab

Kích hoạt tính năng này sẽ làm cho phím tab (trong chế độ chèn) chèn khoảng trắng hoặc tab để đi đến điểm thụt tiếp theo của tabstop tiếp theo khi con trỏ ở đầu dòng (nghĩa là các ký tự trước duy nhất là khoảng trắng).

Để biết thêm chi tiết về bất kỳ trong số này xem trong vim (ví dụ ):help 'optionname':help 'tabstop'


18
Điều quan trọng nữa là phải đảm bảo rằng Makefiles luôn sử dụng các ký tự tab cứng, nếu không các bản dựng sẽ thất bại! Tôi đã chỉ cho bạn cách, tại stackoverflow.com/questions/234564/ từ
Shervin Emami

29
@Und xác định Đó là cài đặt vim hệ thống. ~/.vimrclà cài đặt vim của người dùng. Hầu hết mọi người để lại các cài đặt hệ thống một mình và chỉ cần chỉnh sửa cài đặt người dùng. Lưu ý rằng ~/.vimrcsẽ không tồn tại cho đến khi bạn tạo nó trên hầu hết các hệ thống.
Laurence Gonsalves

4
Người dùng Vim lưu ý về set softtabstop=4tính năng! Tôi mệt mỏi khi cố gắng đọc mã của bạn với less, hoặc bất kỳ trình soạn thảo nào khác ngoại trừ vim, chỉ thấy sự thụt lề lập dị vì bạn đã xác định lại tab là một số khoảng trắng tùy ý (mặc dù phần còn lại của hệ thống nghĩ khác)! :-)
Ogre Psalm33

6
Ai đó có thể giúp tôi hiểu lý do tại sao câu trả lời này nói để sử dụng tabstop=8cho các vết lõm bao gồm 4 khoảng trắng không? Tôi không thể có được lý do sau khi đọc các mô tả của các cài đặt khác nhau. Một câu trả lời khác nói rằng sử dụng tabstop=4nó có ý nghĩa hơn đối với tôi.
Kodos Johnson

5
@KodosJohnson tabstopTùy chọn kiểm soát độ rộng của ký tự tab cứng. Nếu bạn muốn thụt lề của mình bao gồm 4 ký tự khoảng trắng, thay vì các ký tự tab đơn có chiều rộng 4, thì chiều rộng của ký tự tab của bạn không thành vấn đề - sắp xếp . Trong thực tế, bạn có thể muốn chiều rộng ký tự tab của bạn khác với chiều rộng của vết lõm của bạn, để giảm cơ hội các ký tự tab giả mạo như là vết lõm thích hợp. ( list+ expandtabcũng có thể trợ giúp ở đây) Ngoài ra, các tab rộng 8 char là "tiêu chuẩn" - thiết bị đầu cuối của bạn, Python và nhiều công cụ khác mặc định là các tab rộng 8 char.
Laurence Gonsalves

745

Để xác định điều này trên cơ sở vĩnh viễn cho người dùng hiện tại, hãy tạo (hoặc chỉnh sửa) .vimrctệp:

$ vim ~/.vimrc

Sau đó, dán cấu hình bên dưới vào tập tin. Khi vim được khởi động lại, cài đặt tab sẽ được áp dụng.

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

Nếu bạn không có ~ / .vimrc, hãy thử với / etc / vim / vimrc. Trong trường hợp của tôi trên Ubuntu 16.04, tập tin cấu hình là có. Nhưng hãy nhớ rằng việc thay đổi tệp này sẽ khiến cấu hình được sử dụng trên toàn cầu.
Todor Todorov

4
Một điều nữa, sử dụng :retabđể chuyển đổi hiện có tabsang spaces. vim.wikia.com/wiki/Converting_tabs_to_spaces
DawnSong


28

Có một vài cài đặt xác định nên sử dụng dấu cách hay tab.

Vì vậy, đây là các chức năng tiện dụng có thể được xác định trong ~/.vimrctệp của bạn :

function! UseTabs()
  set tabstop=4     " Size of a hard tabstop (ts).
  set shiftwidth=4  " Size of an indentation (sw).
  set noexpandtab   " Always uses tabs instead of space characters (noet).
  set autoindent    " Copy indent from current line when starting a new line (ai).
endfunction

function! UseSpaces()
  set tabstop=2     " Size of a hard tabstop (ts).
  set shiftwidth=2  " Size of an indentation (sw).
  set expandtab     " Always uses spaces instead of tab characters (et).
  set softtabstop=0 " Number of spaces a <Tab> counts for. When 0, featuer is off (sts).
  set autoindent    " Copy indent from current line when starting a new line.
  set smarttab      " Inserts blanks on a <Tab> key (as per sw, ts and sts).
endfunction

Sử dụng:

:call UseTabs()
:call UseSpaces()

Để sử dụng nó cho mỗi phần mở rộng tệp, có thể sử dụng cú pháp sau (thêm vào .vimrc):

au! BufWrite,FileWritePre *.module,*.install call UseSpaces()

Xem thêm: Chuyển đổi các tab thành không gian .


Đây là một đoạn khác từ Wikia có thể được sử dụng để chuyển đổi giữa các tab và khoảng trắng :

" virtual tabstops using spaces
set shiftwidth=4
set softtabstop=4
set expandtab
" allow toggling between local and default mode
function TabToggle()
  if &expandtab
    set shiftwidth=8
    set softtabstop=0
    set noexpandtab
  else
    set shiftwidth=4
    set softtabstop=4
    set expandtab
  endif
endfunction
nmap <F9> mz:execute TabToggle()<CR>'z

Nó cho phép sử dụng 4 khoảng trắng cho mỗi tab và ánh xạ F9để chuyển các cài đặt.


27

Tôi đã sao chép và dán tệp này vào tệp .vimrc của mình:

" size of a hard tabstop
set tabstop=4

" always uses spaces instead of tab characters
set expandtab

" size of an "indent"
set shiftwidth=4

2 cài đặt đầu tiên có nghĩa là khi tôi nhấn Tab, tôi nhận được 4 khoảng trắng. Cài đặt thứ ba có nghĩa là khi tôi làm V>(tức là trực quan và thụt lề) tôi cũng nhận được 4 khoảng trắng.

Không toàn diện như câu trả lời được chấp nhận nhưng nó có thể giúp những người chỉ muốn một cái gì đó sao chép và dán.


14

Đặt cài đặt mong muốn của bạn vào tệp ~ / .vimrc - Xem bên dưới để biết một số nguyên tắc và thực tiễn tốt nhất.

Có bốn cách chính để sử dụng các tab trong Vim:

  1. Luôn luôn giữ 'tabstop' ở mức 8, đặt 'softtabstop' và 'shift' thành 4 (hoặc 3 hoặc bất cứ điều gì bạn thích) và sử dụng 'noExandtab'. Sau đó, Vim sẽ sử dụng hỗn hợp các tab và dấu cách, nhưng gõ và sẽ hoạt động giống như một tab xuất hiện cứ sau 4 (hoặc 3) ký tự.

    Lưu ý: Đặt 'tabstop' thành bất kỳ giá trị nào khác ngoài 8 có thể làm cho tệp của bạn xuất hiện sai ở nhiều nơi (ví dụ: khi in nó).

  2. Đặt 'tabstop' và 'shift' thành bất cứ điều gì bạn thích và sử dụng 'extendtab'. Bằng cách này, bạn sẽ luôn chèn không gian. Định dạng sẽ không bao giờ bị rối khi thay đổi 'tabstop'.

  3. Đặt 'tabstop' và 'shift' thành bất cứ điều gì bạn thích và sử dụng | modeline | để đặt các giá trị này khi chỉnh sửa lại tệp. Chỉ hoạt động khi sử dụng Vim để chỉnh sửa tệp.

  4. Luôn đặt 'tabstop' và 'độ rộng băng thông' thành cùng một giá trị và 'noExandtab'. Điều này sau đó sẽ hoạt động (chỉ dành cho thụt lề ban đầu) cho bất kỳ cài đặt tabstop nào mà mọi người sử dụng. Có thể có các tab sau lần đầu tiên được chèn vào khoảng trắng nếu bạn thực hiện việc này. Nếu không, các nhận xét được căn chỉnh sẽ bị sai khi 'tabstop' được thay đổi.

Nguồn:


+1 để giải thích lý do tại sao cài đặt tabstop! = 8 có thể xấu!
Ogre Psalm33

3
Điều này thật tuyệt, nhưng bạn nên lưu ý rằng đây là nguyên văn từ vimdoc.sourceforge.net/htmldoc/options.html#'tabstop 'hoặc :help tabstoptrong vim.
belacqua



6

Thêm dòng
set ts=4
trong
~/.vimrctệp cho mỗi người dùng
hoặc
/etc/vimrctệp cho toàn hệ thống


2

Cơ bản của tôi ~ / .vimrc với nhận xét:

set number " show line number                                                                                           
set tabstop=2 " set display width of tab; 1 tab = x space with                                                           
set expandtab " transform tab to x space (x is tabstop)                                                               
set autoindent " auto indent; new line with number of space at the beginning same as previous                                                                      
set shiftwidth=2 " number of space append to lines when type >> 

0

Vĩnh viễn cho tất cả người dùng (khi bạn một mình trên máy chủ):

# echo "set tabstop=4" >> /etc/vim/vimrc

Thông thường trên máy chủ mới apt-get purge nano mcvà tất cả những thứ khác để tiết kiệm thời gian của bạn. Nếu không, bạn sẽ xác định lại trình soạn thảo git, crontabv.v.


1
Nếu bạn đặt EDITOR, hầu hết các chương trình sẽ tôn trọng nó.
D. Ben Knoble

@ D.BenKnoble bạn nói đúng. tôi đã thử bây giờ tôi thích tiết kiệm thời gian và thần kinh của tôi. không thể kiểm tra chính xác những gì chạy với F10trong nanonhưng tôi luôn luôn làm một số thủ thuật với tiết kiệm (có thể F10là một giải pháp). hoặc nó không hoạt động screen? Tôi không thể nhớ, chỉ ghét nó)
Vasilii Suricov

dù sao nó trong quá khứ ...
Vasilii Suricov
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.