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?
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:
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, shiftwidth
cài đặt cho phép bạn kiểm soát số lượng không gian thụt lề.
shiftwidth
cài đặt để biết cách thay đổi điều đó.
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 Vim và wiki 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 ." shiftwidth
là 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ư =iB
mộ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
>}
. Cảm ơn rất lâu
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 ;-)
gg=G
chỉ đặ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?
set cindent
nên ở trong vimrc hoặc nên chạy :set cindent
trước khi chạy lệnh đó
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.
Bấm phím cho nhiều người trực quan hơn:
Vào chế độ lệnh:
Escape
Di chuyển xung quanh đến điểm bắt đầu của khu vực để thụt lề:
hjkl↑↓←→
Bắt đầu một khối:
v
Di chuyển đến cuối khu vực để thụt lề:
hjkl↑↓←→
(Tùy chọn) Nhập số cấp độ thụt đầu dòng bạn muốn
0..9
Thực hiện thụt vào khối:
>
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 n
dò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.
vim
, không phải vi
.
vim
được liên kết đến như vi
?
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 ma
nơ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>
.
Đi đến đầu văn bản
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 >}
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.
Giả sử bạn sử dụng 2 khoảng trắng để thụt mã. Kiểu:
:set shiftwidth=2
Sau đó:
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).
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:
'
.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.
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 ...
Bạn có thể sử dụng norm i
lệ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
Một cách nhanh chóng để làm điều này bằng cách VISUAL MODE
sử 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 shiftwidth
hoặc sử dụng bất kỳ set
chỉ 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.
-- VISUAL MODE --
:
để chuyển sang dấu nhắcThay thế bằng 3 không gian hàng đầu:
:'<,'>s/^/ /g
Hoặc thay thế bằng các tab hàng đầu:
:'<,'>s/^/\t/g
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 Tab
vào đầu mỗi dòng trong toàn bộ phạm vi
Tôi thích đánh dấu văn bản để thụt lề:
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 %.
:help left
Trong ex mode
bạn có thể sử dụng :left
hoặc :le
để căn chỉnh một số lượng cụ thể. Cụ thể, :left
sẽ để 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).
:%le3
hay :%le 3
hay :%left3
hay :%left 3
sẽ 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.
:le
không có bất kỳ giá trị nào hoặc :le 0
sẽ để 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.
:'<,'>le4
chèn các khoảng trắng. Cảm ơn!
Đố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.
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.
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):
Điều này hữu ích khi bạn không muốn thay đổi cài đặt thụt lề / tab trong vimrc
hoặ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.
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:
.vimrc
tậ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)
: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
:set number
để chuyển đổi số dòng (chúng bị tắt theo mặc định) hoặc đặt set number
vào vimrc của bạn.
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ề.
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:
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.
Sau đây sẽ xuất hiện trong dòng lệnh: :'<,'>
Để đặt thụt lề thành ba khoảng trắng, nhập le 3
và nhấn enter. Đây là những gì xuất hiện::'<,'>le 3
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:
Ở 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ề:
Ở 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.
Tôi sử dụng lựa chọn trực quan chế độ khối:
I
( Shift+I ) để vào chế độ chèn.Đây không phải là một uni-tasker. Nó hoạt động:
c
thay vì I
).vim-prettier
thay 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.
Nguồn: https://www.fir3net.com/UNIX/General/how-do-i-tab-multipl-lines-within-vi.html