Thụt nhiều dòng nhanh chóng trong vi


2158

Nó là tầm thường, và thậm chí có thể giúp đỡ, nhưng tôi không thể tìm ra cách điều hướng nó. Làm thế nào để tôi thụt lề nhiều dòng nhanh chóng trong vi?

Câu trả lời:


2552

Sử dụng >lệnh. Để thụt lề năm dòng , 5>>. Để đánh dấu một khối các dòng và thụt lề nó, Vjj>để thụt ba dòng (chỉ Vim). Để thụt một khối niềng răng xoăn, đặt con trỏ của bạn vào một trong các dấu ngoặc nhọn và sử dụng >%hoặc từ bất kỳ nơi nào trong khối sử dụng >iB.

Nếu bạn đang sao chép các khối văn bản xung quanh và cần căn chỉnh thụt lề của một khối ở vị trí mới, hãy sử dụng ]pthay vì chỉ p. Điều này căn chỉnh khối dán với văn bản xung quanh.

Ngoài ra, shiftwidthcài đặt cho phép bạn kiểm soát số lượng không gian thụt lề.


77
Tôi sử dụng> i} (khối thụt vào trong {}). Hoạt động trong vim. Không chắc nó hoạt động trong vi.
R. Martinho Fernandes

11
Vấn đề của tôi (trong gVim) là lệnh> thụt nhiều hơn 2 khoảng trống (tôi chỉ muốn hai khoảng trống nhưng> thụt vào một cái gì đó như 5 khoảng trống)
Kamran Bigdely

28
@Kamran: Xem shiftwidthcài đặt để biết cách thay đổi điều đó.
Greg Hewgill

4
@MattStevens: Bạn có thể tìm thấy cuộc thảo luận mở rộng về hiện tượng này tại đây: meta.stackexchange.com/questions/9731/ợi
Greg Hewgill

5
Tôi thường thụt các khối trực quan nhiều lần liên tiếp, chẳng hạn như sửa một số thẻ được dán vào tệp XML. Thay vì chọn lại khối trong chế độ trực quan mỗi lần, người ta có thể sử dụng 'gv' để sử dụng lại khối hình ảnh cuối cùng. Tham khảo superuser.com/questions/220666/ trộm
David Mann

958

Câu trả lời này tóm tắt các câu trả lời và nhận xét khác của câu hỏi này và nó bổ sung thêm thông tin dựa trên tài liệu Vimwiki Vim . Để đơn giản, câu trả lời này không phân biệt giữa các lệnh cụ thể của Vi và Vim.

Trong các lệnh bên dưới, "re-indent" có nghĩa là "các dòng thụt theo cài đặt thụt lề của bạn ." shiftwidthlà biến chính điều khiển thụt đầu dòng.

Các lệnh chung

>>   Indent line by shiftwidth spaces
<<   De-indent line by shiftwidth spaces
5>>  Indent 5 lines
5==  Re-indent 5 lines

>%   Increase indent of a braced or bracketed block (place cursor on brace first)
=%   Reindent a braced or bracketed block (cursor on brace)
<%   Decrease indent of a braced or bracketed block (cursor on brace)
]p   Paste text, aligning indentation with surroundings

=i{  Re-indent the 'inner block', i.e. the contents of the block
=a{  Re-indent 'a block', i.e. block and containing braces
=2a{ Re-indent '2 blocks', i.e. this block and containing block

>i{  Increase inner block indent
<i{  Decrease inner block indent

Bạn có thể thay thế {bằng }hoặc B, ví dụ như =iBmột lệnh thụt khối hợp lệ. Hãy xem "Indent a Code Block" để biết ví dụ hay để thử các lệnh này.

Ngoài ra, hãy nhớ rằng

.    Repeat last command

, vì vậy các lệnh thụt lề có thể được lặp lại dễ dàng và thuận tiện.

Xác nhận lại các tập tin hoàn chỉnh

Một tình huống phổ biến khác là yêu cầu thụt lề phải được sửa trong toàn bộ tệp nguồn:

gg=G  Re-indent entire buffer

Bạn có thể mở rộng ý tưởng này thành nhiều tệp:

" Re-indent all your C source code:
:args *.c
:argdo normal gg=G
:wall

Hoặc nhiều bộ đệm:

" Re-indent all open buffers:
:bufdo normal gg=G:wall

Ở chế độ trực quan

Vjj> Visually mark and then indent three lines

Ở chế độ chèn

Các lệnh này áp dụng cho dòng hiện tại:

CTRL-t   insert indent at start of line
CTRL-d   remove indent at start of line
0 CTRL-d remove all indentation from line

Các lệnh ex

Đây là hữu ích khi bạn muốn thụt lề một dòng cụ thể, mà không di chuyển con trỏ của bạn.

:< and :> Given a range, apply indentation e.g.
:4,8>   indent lines 4 to 8, inclusive

Ấn định bằng cách sử dụng các dấu

Một cách tiếp cận khác là thông qua các dấu hiệu :

ma     Mark top of block to indent as marker 'a'

... di chuyển con trỏ đến vị trí kết thúc

>'a    Indent from marker 'a' to current location

Các biến số chi phối thụt

Bạn có thể đặt chúng trong tệp .vimrc của bạn .

set expandtab       "Use softtabstop spaces instead of tab characters for indentation
set shiftwidth=4    "Indent by 4 spaces when using >>, <<, == etc.
set softtabstop=4   "Indent by 4 spaces when pressing <TAB>

set autoindent      "Keep indentation from previous line
set smartindent     "Automatically inserts indentation in some cases
set cindent         "Like smartindent, but stricter and more customisable

Vim có thụt thông minh dựa trên filetype. Hãy thử thêm nó vào .vimrc của bạn:

if has ("autocmd")
    " File type detection. Indent based on filetype. Recommended.
    filetype plugin indent on
endif

Người giới thiệu


13
Cả câu trả lời này và câu trả lời trên đều tuyệt vời. Nhưng tôi đã 1 điều này vì nó nhắc tôi về toán tử 'chấm', lặp lại lệnh cuối cùng. Điều này cực kỳ hữu ích khi cần thụt toàn bộ một số khối dịch chuyển (hoặc thụt lề) mà không cần phải nhấn >}. Cảm ơn rất lâu
Amit

1
5 >> Indent 5 dòng: Lệnh này thụt dòng thứ năm , không phải 5 dòng. Điều này có thể là do cài đặt VIM của tôi hoặc từ ngữ của bạn không chính xác?
Wipqozn

1
@Wipqozn - Thật lạ. Nó chắc chắn thụt lề năm dòng tiếp theo cho tôi, được thử nghiệm trên Vim 7.2.330.
ire_and_curses

8
> 42gg ​​thụt lề từ nơi bạn đến dòng 42.
Steve

Tóm tắt tuyệt vời! Cũng lưu ý rằng "khối thụt vào bên trong" và "khối thụt lề tất cả" (<i {> a {, v.v.) cũng hoạt động với dấu ngoặc đơn và ngoặc:> a (<i], v.v. (Và trong khi tôi ở đó, trong ngoài <>, họ cũng làm việc với d, c, y, v.v.)
aqn

123

Một lựa chọn lớn sẽ là:

gg=G

Nó thực sự nhanh, và mọi thứ được thụt vào ;-)


1
Tôi có một tệp XML và bật đánh dấu cú pháp. Gõ gg=Gchỉ đặt mỗi dòng bắt đầu từ vị trí 1. Tất cả các khoảng trắng đã được xóa. Có điều gì khác cụ thể đối với XML không?
vào

2
Tôi nghĩ set cindentnên ở trong vimrc hoặc nên chạy :set cindenttrước khi chạy lệnh đó
Amanuel Nega

3
Tôi nghĩ rằng cindent phải được đặt đầu tiên. và @sss tôi nghĩ rằng điều này chỉ hoạt động cho các ngôn ngữ lập trình cstyle.
Amanuel Nega

110

Cũng thử điều này cho thụt đầu dòng thụt C. Làm :help =để biết thêm thông tin:

={

Điều đó sẽ tự động thụt vào khối mã hiện tại bạn đang ở.

Hoặc chỉ:

==

để tự động thụt dòng hiện tại.


2
không hoạt động với tôi, chỉ đưa con trỏ của tôi đến dòng phía trên dấu ngoặc mở của 'khối mã hiện tại tôi đang ở'.
gạch dưới

79

Bấm phím cho nhiều người trực quan hơn:

  1. Vào chế độ lệnh:
    Escape

  2. Di chuyển xung quanh đến điểm bắt đầu của khu vực để thụt lề:
    hjkl

  3. Bắt đầu một khối:
    v

  4. Di chuyển đến cuối khu vực để thụt lề:
    hjkl

  5. (Tùy chọn) Nhập số cấp độ thụt đầu dòng bạn muốn
    0..9

  6. Thực hiện thụt vào khối:
    >


2
Điều này là tuyệt vời, nhưng nó sử dụng không gian và không phải tab. Bất kỳ cách nào có thể để khắc phục điều này?
Shane Reustle

12
Nếu nó sử dụng khoảng trắng thay vì các tab, thì có lẽ là do bạn đã đặt thụt lề để sử dụng khoảng trắng. =).
Kent Fredric

4
Khi tùy chọn 'Expandtab' tắt (đây là mặc định), Vim sử dụng <Tab> càng nhiều càng tốt để tạo ra vết lõm. (: trợ giúp:>)
Kent Fredric

1
Cài đặt vim liên quan đến tab / không gian duy nhất tôi đã thay đổi là: set tabstop = 3. Nó thực sự chèn cái này mỗi khi tôi sử dụng >>: "<tab> <dấu cách> <dấu cách>". Tương tự với thụt một khối. Có ý kiến ​​gì không?
Shane Reustle

3
Ba cài đặt bạn muốn xem xét cho "khoảng trắng so với tab" là 1. tabstop 2. shift thong 3. extendtab. Bạn có thể có "shift thong = 5 noExandtab", do đó, "tab" là 3 khoảng trắng và mức thụt là "5" khoảng trắng, do đó, nó tạo thành 5 với 1 tab và 2 khoảng trắng.
Kent Fredric

66

Bậc thầy của tất cả các lệnh là
gg=G

Điều này thụt lề toàn bộ tập tin!

Và dưới đây là một số lệnh đơn giản và thanh lịch được sử dụng để thụt dòng nhanh chóng trong Vim hoặc gVim.

Để thụt dòng hiện tại
==

Để thụt lề tất cả các dòng bên dưới dòng hiện tại

=G

Để thụt ndòng dưới dòng hiện tại

n==

Ví dụ: để thụt 4 dòng bên dưới dòng hiện tại

4==

Để thụt lề một khối mã, đi đến một trong các dấu ngoặc nhọn và sử dụng lệnh

=%

Đây là những lệnh đơn giản nhất nhưng mạnh mẽ để thụt lề nhiều dòng.


3
Đây chỉ là trong vim, không phải vi.
rojomoke

3
Không phải trên hộp Solaris hoặc AIX của tôi, nó không có. Khóa bằng luôn luôn là một trong những bài tập macro ad hoc tiêu chuẩn của tôi. Bạn có chắc là bạn không nhìn vào cái vimđược liên kết đến như vi?
rojomoke

3
Vâng, trên Linux, vi hầu như luôn là một liên kết đến vim. Hãy thử chạy lệnh: ve bên trong vi.
rojomoke

4
Tôi thích loại câu trả lời này: rõ ràng, chính xác và cô đọng. Làm việc cho tôi trong Debian Jessie. Cảm ơn, @SJain
Digitai

1
Vì tôi sử dụng vim, không vi, khá tâm lý câu trả lời này có ở đây. Cảm ơn.
Dan Nissenbaum

66

Ngoài câu trả lời đã được đưa ra và chấp nhận, cũng có thể đặt một điểm đánh dấu và sau đó thụt lề mọi thứ từ con trỏ hiện tại đến điểm đánh dấu.

Do đó, nhập manơi bạn muốn đỉnh của khối thụt lề, con trỏ xuống xa như bạn cần và sau đó nhập >'a(lưu ý rằng " a" có thể được thay thế cho bất kỳ tên đánh dấu hợp lệ nào). Điều này đôi khi dễ dàng hơn 5>>hoặc vjjj>.


1
Điều này thực sự hữu ích. Tôi sẽ phải tìm kiếm những gì tất cả hoạt động với điều này. Tôi biết d'a và y'a, còn gì nữa không?
dùng606723

2
Điều này rất hữu ích vì nó tránh được việc phải đếm bao nhiêu dòng bạn muốn thụt lề.
ngoằn ngoèo

29

Đi đến đầu văn bản

  • nhấn vcho chế độ trực quan.
  • sử dụng up/ downmũi tên để tô sáng văn bản.
  • nhấn =để thụt lề tất cả các dòng bạn tô sáng.

28

Cũng như các giải pháp được cung cấp, tôi muốn thực hiện một đoạn tại một thời điểm với >}


2
Yup, và đây là lý do tại sao một trong những đồng loại lớn của tôi là khoảng trắng trên một dòng trống khác: chúng làm rối tung khái niệm của vim về một "đoạn".
aqn

28

Khi bạn chọn một khối và sử dụng >để thụt lề, nó sẽ thụt lề trở lại chế độ bình thường. Tôi có cái này trong tệp .vimrc của tôi:

vnoremap < <gv

vnoremap > >gv

Nó cho phép bạn thụt lề lựa chọn của bạn nhiều lần như bạn muốn.


17
Để thụt lề lựa chọn nhiều lần, bạn chỉ cần nhấn. để lặp lại lệnh trước đó.
- Phục hồi Monica

2
Vấn đề với. trong tình huống này là bạn phải di chuyển ngón tay của bạn. Với giải pháp của @ mike (cùng một giải pháp tôi sử dụng), bạn đã có những ngón tay của mình trên phím thụt lề và chỉ có thể tiếp tục đập nó để tiếp tục thụt lề thay vì chuyển đổi và làm việc khác. Thời gian sử dụng mất nhiều thời gian hơn vì bạn phải di chuyển tay và nó đòi hỏi nhiều suy nghĩ hơn vì đó là hoạt động thứ hai, khác biệt.
masukomi

21

Giả sử bạn sử dụng 2 khoảng trắng để thụt mã. Kiểu:

:set shiftwidth=2
  • Nhập v(để vào chế độ chỉnh sửa khối trực quan)
  • Di chuyển con trỏ bằng các phím mũi tên (hoặc bằng h/ j/ k/ l) để tô sáng các dòng bạn muốn thụt lề hoặc không liên kết.

Sau đó:

  • Nhập >vào thụt một lần (2 dấu cách).
  • Nhập 2>để thụt hai lần (4 dấu cách).
  • 3>đến ba lần indent (6 chỗ).
  • ...
  • <để unindent một lần (2 chỗ).
  • 2<để unindent hai lần (4 dấu cách).
  • 3<vào ba lần không liên kết (6 dấu cách).
  • ...

Bạn có được ý tưởng.

(Các dòng trống sẽ không được thụt lề, mà tôi nghĩ là loại tốt. )


Tôi tìm thấy câu trả lời trong tài liệu (g) ​​vim cho các khối thụt lề:

:help visual-block
/indent

Nếu bạn muốn đếm số cho lệnh, hãy thực hiện việc này ngay trước khi nhập ký tự toán tử: "v {move-around} 3>" (di chuyển các dòng 3 thụt vào bên phải).


18

Cái hay của UI của Vim là tính nhất quán của nó. Các lệnh chỉnh sửa được tạo thành từ lệnh và di chuyển con trỏ. Các con trỏ di chuyển luôn giống nhau:

  • Hlên trên màn hình, Lxuống dưới, Mgiữa
  • nG để đi đến dòng n , Gmột mình đến cuối tập tin, gglên đầu
  • nđể di chuyển đến trận đấu tìm kiếm tiếp theo, Ntrước đó
  • } đến cuối đoạn
  • % đến dấu ngoặc phù hợp tiếp theo, một trong hai dấu ngoặc đơn hoặc loại thẻ
  • enter đến dòng tiếp theo
  • 'xđể đánh dấu x trong đó x là một chữ cái hoặc chữ cái khác '.
  • nhiều hơn nữa, bao gồm wWcho từ, $hoặc 0cho các mẹo của dòng, v.v., không áp dụng ở đây vì không phải là chuyển động của dòng .

Vì vậy, để sử dụng vim, bạn phải học cách di chuyển con trỏ và ghi nhớ một tiết mục của các lệnh như, ví dụ, >để thụt lề (và <"lỗi thời").

Do đó, để thụt dòng từ vị trí con trỏ lên trên cùng của màn hình bạn làm >H, >Gđể thụt xuống dưới cùng của tệp.

Nếu, thay vì gõ >H, bạn gõ dHthì bạn đang xóa cùng một dòng, cHđể thay thế nó, v.v.

Một số chuyển động con trỏ phù hợp hơn với các lệnh cụ thể. Đặc biệt, %lệnh này có ích để thụt toàn bộ khối HTML hoặc XML. Nếu tệp có cú pháp được tô sáng ( :syn on) thì đặt con trỏ trong văn bản của thẻ (như, trong "i" của <div> và nhập >%sẽ thụt vào thẻ đóng </ div>.

Đây là cách Vim hoạt động: người ta chỉ phải nhớ các chuyển động con trỏ và các lệnh và cách trộn chúng. Vì vậy, câu trả lời của tôi cho câu hỏi này sẽ là "đi đến một đầu của khối dòng bạn muốn thụt lề, sau đó nhập >lệnh và chuyển động đến đầu kia của khối" nếu thụt lề được hiểu là dịch chuyển các dòng, =nếu thụt lề được giải thích như trong in ấn đẹp.


2
Tôi sẽ nói rằng vi / vim chủ yếu là phù hợp. Chẳng hạn, D không hành xử giống như S và Y! :)
aqn

14

Làm cái này:

$vi .vimrc

Và thêm dòng này:

autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent

Điều này chỉ dành cho một tập tin cpp. Bạn có thể làm điều này cho một loại tệp khác, cũng chỉ bằng cách sửa đổi kiểu tệp ...


13

Bạn có thể sử dụng norm ilệnh để chèn văn bản đã cho ở đầu dòng. Để chèn 10 khoảng trắng trước dòng 2-10:

:2,10norm 10i 

Hãy nhớ rằng phải có một ký tự khoảng trắng ở cuối lệnh - đây sẽ là ký tự chúng ta muốn chèn. Chúng tôi cũng có thể thụt dòng một dòng với bất kỳ văn bản nào khác, ví dụ để thụt dòng mỗi dòng trong một tệp có năm ký tự gạch dưới:

:%norm 5i_

Hoặc một cái gì đó thậm chí còn lạ mắt hơn:

:%norm 2i[ ]

Ví dụ thực tế hơn là nhận xét mã Bash / Python / etc với # character:

:1,20norm i#

Để sử dụng lại thụt lề xthay vì i. Ví dụ: để xóa 5 ký tự đầu tiên khỏi mỗi dòng:

:%norm 5x

1
điều này bắt đầu từ phía bên trái của tệp ... không phải là vị trí hiện tại của khối
Eliethesaiyan

12

Một cách nhanh chóng để làm điều này bằng cách VISUAL MODEsử dụng quy trình tương tự như nhận xét một khối mã.

Điều này hữu ích nếu bạn không muốn thay đổi shiftwidthhoặc sử dụng bất kỳ setchỉ thị nào và đủ linh hoạt để làm việc với TABS hoặc SPACES hoặc bất kỳ ký tự nào khác.

  1. Con trỏ vị trí ở đầu khối
  2. v để chuyển sang -- VISUAL MODE --
  3. Chọn văn bản được thụt lề
  4. Nhập :để chuyển sang dấu nhắc
  5. Thay thế bằng 3 không gian hàng đầu:

    :'<,'>s/^/ /g

  6. Hoặc thay thế bằng các tab hàng đầu:

    :'<,'>s/^/\t/g

  7. Giải thích ngắn gọn:

    '<,'> - Trong phạm vi được chọn trực quan

    s/^/ /g - Chèn 3 khoảng trắng ở đầu mỗi dòng trong toàn phạm vi

    (hoặc là)

    s/^/\t/g- Chèn Tabvào đầu mỗi dòng trong toàn bộ phạm vi


12

>}hoặc >{thụt lề từ dòng hiện tại cho đến đoạn tiếp theo

<}hoặc <{không thụt lề


11

Tôi thích đánh dấu văn bản để thụt lề:

  1. đi đến đầu dòng văn bản rồi gõ ma( alà nhãn từ 'm'ark: nó có thể là bất kỳ chữ cái nào)
  2. đi đến cuối dòng văn bản và loại mz(một lần nữa, zcó thể là bất kỳ chữ cái nào)
  3. :'a,'z>hoặc :'a,'z<sẽ thụt lề hoặc lỗi thời (đây có phải là một từ không?)
  4. Voila! Văn bản được di chuyển (dòng trống vẫn trống không có khoảng trắng)

PS: bạn có thể sử dụng :'a,'zkỹ thuật để đánh dấu một phạm vi cho bất kỳ hoạt động nào (d, y, s ///, v.v.) trong đó bạn có thể sử dụng các dòng, số hoặc %.


10

:help left

Trong ex modebạn có thể sử dụng :lefthoặc :leđể căn chỉnh một số lượng cụ thể. Cụ thể, :leftsẽ để lại các dòng thẳng hàng trong [phạm vi]. Nó đặt thụt lề trong các dòng thành [thụt lề] (mặc định 0).

:%le3hay :%le 3 hay :%left3hay :%left 3sẽ sắp xếp toàn bộ tập tin bằng cách đệm với ba không gian.

:5,7 le 3 sẽ căn chỉnh các dòng 5 đến 7 bằng cách đệm chúng với ba khoảng trắng.

:lekhông có bất kỳ giá trị nào hoặc :le 0sẽ để lại căn chỉnh với phần đệm bằng 0.

Điều này hoạt động trong Vim và gVim.


1
Thật tuyệt vời, đúng như những gì tôi đang tìm kiếm (một cách để chèn một số lượng không gian cụ thể - 4 khoảng trắng cho mã đánh dấu - để ghi đè thụt lề bình thường của tôi). Trong trường hợp của tôi, tôi muốn thụt một số dòng cụ thể trong chế độ trực quan, vì vậy shift-v để làm nổi bật các dòng, sau đó :'<,'>le4chèn các khoảng trắng. Cảm ơn!
Subfuzion

9

Đối với tôi, giải pháp MacVim (Trực quan) là, chọn bằng chuột và nhấn ">", nhưng sau khi đặt các dòng sau vào "~ / .vimrc" vì tôi thích khoảng trắng thay vì tab:

set expandtab
set tabstop=2
set shiftwidth=2

Ngoài ra, thật hữu ích khi có thể gọi MacVim từ dòng lệnh (Terminal.app), vì vậy tôi có thư mục trợ giúp sau "~ / bin", trong đó tôi đặt một tập lệnh có tên là "macvim":

#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@

Và tất nhiên trong "~ / .bashrc":

export PATH=$PATH:$HOME/bin

MacPorts gây rối với "~ / .profile" rất nhiều, vì vậy biến môi trường PATH có thể khá lâu.


9

5== sẽ thụt năm dòng từ vị trí con trỏ hiện tại.

Vì vậy, bạn có thể gõ bất kỳ số trước ==. Nó sẽ thụt lề số lượng dòng. Đây là trong chế độ lệnh.

gg=G sẽ thụt toàn bộ tập tin từ trên xuống dưới.


9

Tôi đã không tìm thấy một phương pháp tôi sử dụng trong các bình luận, vì vậy tôi sẽ chia sẻ nó (tôi chỉ nghĩ Vim):

  1. Esc để vào chế độ lệnh
  2. Di chuyển đến ký tự đầu tiên của dòng cuối cùng bạn muốn thụt lề
  3. Ctrl+ Vđể bắt đầu chọn khối
  4. Di chuyển đến ký tự đầu tiên của dòng đầu tiên bạn muốn thụt lề
  5. Shift+ Iđể vào chế độ chèn đặc biệt
  6. Nhập nhiều không gian / tab mà bạn cần thụt vào (ví dụ hai
  7. Báo chí Escvà dấu cách sẽ xuất hiện trong tất cả các dòng

Điều này hữu ích khi bạn không muốn thay đổi cài đặt thụt lề / tab trong vimrchoặc ghi nhớ chúng để thay đổi nó trong khi chỉnh sửa.

Để hủy kết nối, tôi sử dụng cùng khối Ctrl+ Vchọn để chọn khoảng trắng và xóa nó bằng D.


9

Tôi không biết tại sao rất khó để tìm một câu trả lời đơn giản như thế này ...

Bản thân tôi đã phải đấu tranh rất nhiều để biết điều này. Nó rất đơn giản:

  • Chỉnh sửa .vimrctập tin của bạn dưới thư mục nhà.
  • Thêm dòng này

    set cindent
    

    trong tập tin của bạn, nơi bạn muốn thụt lề đúng cách.

  • Trong loại chế độ bình thường / lệnh

    10==   (This will indent 10 lines from the current cursor location)
    gg=G   (Complete file will be properly indented)
    

8
:line_num_start,line_num_end>

Ví dụ,

14,21> shifts line number 14 to 21 to one tab

Tăng biểu tượng '>' cho nhiều tab hơn.

Ví dụ,

14,21>>> for three tabs

1
Rõ ràng có rất nhiều cách để giải quyết vấn đề này, nhưng đây là cách dễ thực hiện nhất, vì số dòng hiển thị theo mặc định trong vim và nó không yêu cầu toán học.
Hold OfferHunger

@Hold OfferHunger Số dòng không hiển thị theo mặc định. Bạn cần sử dụng :set numberđể chuyển đổi số dòng (chúng bị tắt theo mặc định) hoặc đặt set numbervào vimrc của bạn.
DryLabRebel

7

Sử dụng Python rất nhiều, tôi thấy mình cần thường xuyên cần thay đổi các khối nhiều hơn một lần thụt lề. Bạn có thể làm điều này bằng cách sử dụng bất kỳ phương pháp chọn khối nào, sau đó chỉ cần nhập số lượng thụt lề bạn muốn nhảy ngay trước>

Ví dụ: V5j3>sẽ thụt lề năm dòng ba lần - tức là 12 khoảng trắng nếu bạn sử dụng bốn khoảng trắng cho thụt lề.


7

Để thụt lề mỗi dòng trong một loại tệp, Escvà sau đó G=gg.


6

Cách thụt lề mã được tô sáng trong vi ngay lập tức bằng một số khoảng trắng:

Tùy chọn 1: Ấn định một khối mã trong vi đến ba khoảng trắng với chế độ Visual Block:

  1. Chọn khối mã bạn muốn thụt lề. Làm điều này bằng cách sử dụng Ctrl+Vtrong chế độ bình thường và mũi tên xuống để chọn văn bản. Trong khi nó được chọn, hãy nhập :để đưa ra lệnh cho khối văn bản đã chọn.

  2. Sau đây sẽ xuất hiện trong dòng lệnh: :'<,'>

  3. Để đặt thụt lề thành ba khoảng trắng, nhập le 3và nhấn enter. Đây là những gì xuất hiện::'<,'>le 3

  4. Văn bản được chọn ngay lập tức được thụt vào ba khoảng trắng.

Tùy chọn 2: Ấn định một khối mã trong vi đến ba khoảng trắng với chế độ Visual Line:

  1. Mở tập tin của bạn trong vi.
  2. Đặt con trỏ lên một số mã
  3. Ở chế độ bình thường và nhấn các phím sau:

    Vjjjj:le 3
    

    Giải thích những gì bạn đã làm:

    V có nghĩa là bắt đầu chọn văn bản.

    jjjj mũi tên xuống bốn dòng, làm nổi bật bốn dòng.

    : nói với vi bạn sẽ nhập một hướng dẫn cho văn bản được tô sáng.

    le 3 có nghĩa là văn bản nổi bật ba dòng.

    Mã được chọn ngay lập tức tăng hoặc giảm xuống ba chỗ thụt lề.

Tùy chọn 3: sử dụng chế độ Visual Block và chế độ chèn đặc biệt để tăng thụt lề:

  1. Mở tập tin của bạn trong vi.
  2. Đặt con trỏ lên một số mã
  3. Ở chế độ bình thường, nhấn các phím sau:

    Ctrl+V

    jjjj
    

    (nhấn phím cách năm lần)

    Esc Shift+i

    Tất cả các văn bản được tô sáng được thụt vào năm chỗ trống.


6

Tôi sử dụng lựa chọn trực quan chế độ khối:

  • Đi đến phía trước của khối để di chuyển (ở trên cùng hoặc dưới cùng).
  • Nhấn Ctrl+V để vào chế độ khối trực quan.
  • Điều hướng để chọn một cột ở phía trước của dòng.
  • Nhấn I( Shift+I ) để vào chế độ chèn.
  • Nhập một số khoảng trắng.
  • Nhấn Esc. Tất cả các dòng sẽ thay đổi.

Đây không phải là một uni-tasker. Nó hoạt động:

  • Ở giữa dòng.
  • Để chèn bất kỳ chuỗi trên tất cả các dòng.
  • Để thay đổi một cột (sử dụng cthay vì I).
  • yank, xóa, thay thế, vv ...

Điều này là cồng kềnh, nhưng là cách để đi nếu bạn định dạng bên ngoài lõi VIM (ví dụ, sử dụng vim-prettierthay vì công cụ thụt lề mặc định). Việc sử dụng >sẽ thực sự giúp nâng cao định dạng được thực hiện bởi Prettier.
oligofren 27/03/18

Buồn cười, tôi thấy nó bất cứ điều gì nhưng cồng kềnh. Đây không phải là một uni-tasker! Học phương pháp này có nhiều công dụng ngoài việc thụt lề.
sqqqrly

Tôi thấy nó tốt hơn câu trả lời được chấp nhận, vì tôi có thể thấy những gì đang xảy ra, những dòng tôi đang chọn và hành động tôi đang làm, và không chỉ gõ một số câu thần chú vim.
dùng4052054

5
  • Đối với một khối mã, {}: =+%

  • Đối với một dòng được chọn: Shift+ vchọn sử dụng các phím mũi tên lên / xuống, rồi bấm =.

  • Đối với toàn bộ tệp: gg+ =+G

Lưu ý: 'gg' có nghĩa là đi đến dòng 1, '=' là lệnh thụt lề và 'G' di chuyển con trỏ đến cuối tệp .


4

Để thụt lề tất cả các tệp bằng bốn:

esc 4G=G

3
...gì? 'thụt lề bởi 4 khoảng trắng'? Không, điều này nhảy đến dòng 4 và sau đó thụt lề mọi thứ từ đó đến cuối tệp, sử dụng chế độ thụt lề hiện được chọn (nếu có).
gạch dưới

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.