Câu hỏi Thụt lề nhiều dòng một cách nhanh chóng trong vi


Nên là tầm thường, và nó thậm chí có thể được 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 một cách nhanh chóng trong vi?


1969
2017-10-25 03:27


gốc




Các câu trả lời:


Sử dụng > chỉ huy. Để thụt lề 5 dòng, 5>>. Để đánh dấu một khối đường và thụt lề nó, Vjj> để thụt lề 3 dòng (chỉ vim). Để thụt lề một khối dấu ngoặc nhọn, hãy đặt con trỏ của bạn vào một trong các dấu ngoặc nhọn và sử dụng >%.

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 của nó, hãy sử dụng ]p Thay vì chỉ p. Điều này căn chỉnh khối được dán với văn bản xung quanh.

Ngoài ra, shiftwidth cài đặt cho phép bạn kiểm soát số lượng dấu cách để thụt lề.


2324
2017-10-25 03:28



<shift> -v cũng hoạt động để chọn một dòng trong Vim. - akdom
Tôi sử dụng> i} (khối indent bên trong {}). Hoạt động trong vim. Không chắc chắn nó hoạt động trong vi. - R. Martinho Fernandes
Vấn đề của tôi (trong gVim) là lệnh> indents 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ì đó giống như 5 khoảng trống) - Kamran Bigdely
@Kamran: Xem shiftwidth thiết lập cho cách để thay đổi điều đó. - Greg Hewgill
@ MattStevens: Bạn có thể tìm thấy các cuộc thảo luận mở rộng về hiện tượng này tại đây: meta.stackexchange.com/questions/9731/… - Greg Hewgill


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à thêm thông tin bổ sung dựa trên Tài liệu Vim và Wiki Vim. Đối với conciseness, câu trả lời này không phân biệt giữa Vi và Vim-cụ thể lệnh.

Trong các lệnh bên dưới, "thụt lề lại" có nghĩa là "các đường thụt lề theo của bạn cài đặt thụt đầu dòng. " shiftwidth là biến chính kiểm soát thụt đầu dòng.

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ế { với } hoặc là B, ví dụ. =iB là một lệnh thụt lề khối hợp lệ. Hãy xem "Thụt lề khối mã" cho mộ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.

Đang thụt lề lại các tệp hoàn chỉnh

Một tình huống phổ biến khác là yêu cầu thụt đầu dòng được cố định trong suốt 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

Trong chế độ trực quan

Vjj> Visually mark and then indent 3 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à những hữu ích khi bạn muốn thụt lề một phạm vi cụ thể của các dòng, mà không cần di chuyển của bạn con trỏ.

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

Thụt lề bằng cách sử dụng điểm đánh dấu

Một cách tiếp cận khác là thông qua điểm đánh dấ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 điều chỉnh thụt đầu dòng

Bạn có thể đặt những thứ này trong .vimrc tệp.

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 đầu dòng thông minh dựa trên filetype. Hãy thử thêm điều này vào .vimrc của bạn:

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

Tài liệu tham khảo


887
2018-03-06 17:29



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ử 'dấu chấm', lặp lại lệnh cuối cùng. Đây là vô cùng hữu ích khi cần thụt lề toàn bộ một số khối thay đổi (hoặc thụt lề) mà không cần phải tiếp tục nhấn >}. Cảm ơn một thời gian dài - Amit
5 >> Thụt lề 5 dòng: Lệnh này thụt lề thứ năm dòng, không phải 5 dòng. Điều này có thể là do cài đặt VIM của tôi hay từ ngữ của bạn không chính xác? - Wipqozn
@ Wipqozn - Thật lạ lùng. Nó chắc chắn thụt vào năm dòng tiếp theo cho tôi, thử nghiệm trên Vim 7.2.330. - ire_and_curses
> 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 "indent inside block" và "indent all block" (<i {> a {etc.) cũng hoạt động với dấu ngoặc đơn và dấu ngoặc đơn:> a (<i] v.v. (Và trong khi tôi ở đó, trong thêm vào <> 's, họ cũng làm việc với d, c, y, vv) - aqn


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

gg=G

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


116
2018-01-20 21:11



Tôi đã có một tập tin XML và bật tô sáng cú pháp. Đánh máy gg=G chỉ cần đặt mọi dòng bắt đầu từ vị trí 1. Tất cả các khoảng trắng đã bị xóa. Có điều gì khác cụ thể cho XML không? - asgs
stackoverflow.com/questions/7600860/… - Johan
Tôi nghĩ set cindent nên trong vimrc hoặc nên chạy :set cindenttrước khi chạy lệnh đó - Amanuel Nega
Tôi nghĩ rằng cindent phải được thiết lập đầu tiên. và @ tôi nghĩ rằng điều này chỉ hoạt động đối với các ngôn ngữ lập trình cstyle. - Amanuel Nega


Ngoài ra hãy thử điều này cho C-indenting thụt lề, làm :help = để biết thêm thông tin:

={

Điều đó sẽ tự động thụt lề khối mã hiện tại bạn đang sử dụng.

Hoặc chỉ:

==

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


105
2017-10-25 04:21



không làm việc cho tôi, chỉ cần đổ con trỏ của tôi vào dòng phía trên dấu ngoặc mở của 'khối mã hiện tại tôi đang ở'. - underscore_d


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

  1. Nhập Chế độ Lệnh:
    Bỏ trốn 

  2. Di chuyển xung quanh để bắt đầu 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ố lượng mức thụt lề mà bạn muốn
    0,9

  6. Thực hiện thụt đầu dòng trên khối:
    >


73
2017-10-25 09:16



Đ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ể để sửa lỗi này? - Shane Reustle
Nếu nó sử dụng không gian thay vì các tab, sau đó nó có thể bởi vì bạn đã thụt lề đặt để sử dụng không gian. =). - Kent Fredric
Khi tùy chọn 'expandtab' bị tắt (đây là mặc định), Vim sử dụng <Tab> s càng nhiều càng tốt để thực hiện thụt lề. (: help:>) - Kent Fredric
Cài đặt vim liên quan đến tab / không gian duy nhất mà tôi đã thay đổi là: đặt tabstop = 3. Nó thực sự chèn điều này mỗi khi tôi sử dụng >>: "<tab> <khoảng cách> <dấu cách>". Cùng với thụt lề một khối. Ý tưởng nào? - Shane Reustle
Ba cài đặt bạn muốn xem xét cho "dấu cách so với tab" là 1. tabstop 2. shiftwidth 3. expandtab. Bạn có thể có "shiftwidth = 5 noexpandtab", do đó, "tab" là 3 dấu cách và mức thụt đầu dòng là "5", do đó, nó tạo nên tab 5 với 1 và 2 dấu cách. - Kent Fredric


Ngoài câu trả lời đã được đưa ra và chấp nhận, nó cũng có thể đặt một điểm đánh dấu và sau đó thụt lề tất cả mọi thứ từ con trỏ hiện tại đến điểm đánh dấu. Do đó, hãy nhập ma nơi bạn muốn phần trên cùng của khối thụt lề, hãy di chuyển xuống đến mức 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 điểm đánh dấu hợp lệ nào). Điều này đôi khi dễ hơn 5>> hoặc là vjjj>.


62
2017-10-25 04:00



Điều này thực sự hữu ích. Tôi sẽ phải tìm kiếm tất cả những gì làm việc với điều này. Tôi biết d'a và y'a, còn gì nữa? - user606723
Điều này rất hữu ích vì nó tránh sự cần thiết phải đếm bao nhiêu dòng bạn muốn thụt lề. - ziggy


Thạc sĩ của tất cả các lệnh là
gg=G

Điều này thụt vào 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 lề 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 lề n dòng bên dưới dòng hiện tại

n==

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

4==

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

=%

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


60
2018-04-18 18:41



Đây chỉ là trong vim, không phải vi. - rojomoke
@rojomoke: Không, nó cũng hoạt động ở vi - Sagar Jain
Không phải trên hộp Solaris hoặc AIX của tôi. Khóa bằng luôn luôn là một trong những bài tập vĩ mô tiêu chuẩn của tôi. Bạn có chắc là bạn không nhìn vào vim được liên kết với vi? - rojomoke
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
Tôi thích loại câu trả lời này: rõ ràng, chính xác và ngắn gọn. Làm việc cho tôi trong Debian Jessie. Cảm ơn, @SJain - datelligence


Chuyển đến phần đầu của văn bản

  • nhấn v cho chế độ trực quan.
  • sử dụng lên/xuống mũi tên để đánh dấu văn bản.
  • nhấn = để thụt lề tất cả các dòng bạn đã đánh dấu.

29
2017-11-04 22:57