Làm cách nào để đảo ngược thứ tự được chọn trong Vim?


94

Ví dụ: nếu tôi có bốn dòng như sau:

dòng
thứ nhất dòng thứ hai dòng
thứ ba dòng
thứ tư

Tôi muốn đảo ngược chúng để

dòng thứ tư dòng
thứ ba dòng
thứ hai dòng thứ
nhất

Làm thế nào tôi có thể làm điều này trong Vim?




1
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1 vi.stackexchange.com/a/2107/10254
qeatzy

Câu trả lời:


86

Để đảo ngược tất cả các dòng trong một tập tin,

:g/^/m0

Để được giải thích, xem

:help 12.4

trong đó cũng cho thấy làm thế nào để đảo ngược chỉ một loạt các dòng.


12
Mẹo tuyệt vời trên phần trợ giúp chính xác! Để tóm tắt: 1. đặt điểm đánh dấu ở dòng cuối cùng bạn muốn đảo ngược (tôi đặt tên cho điểm đánh dấu 'a' bằng cách sử dụng ma), 2. di chuyển con trỏ đến dòng đầu tiên của khối, 3. gõ:'a,.g/^/m 'a
Brent Faust

68

Chọn các dòng mong muốn, nhấn !và trong đường dẫn kết quả, các dòng thông qua tacmột la :'<,'>!tac. Xem man tacđể biết thêm chi tiết.


4
Để chọn các dòng, sử dụng shift+vđể vào chế độ dòng trực quan, sau đó jthêm các dòng vào lựa chọn.
wvducky

Tôi có thể xác nhận rằng điều này cũng hoạt động trong windows với gvim! Mặt khác, bạn phải sử dụng số dòng tuyệt đối (có thể bạn có thể sử dụng tương đối, nhưng bạn phải cẩn thận) với :g/^/m0(điều này cũng thực sự khó nhớ) ... Vì vậy, về cơ bản, tac nên với vim cho dù là nền tảng nào bạn đang ở đó, NHƯNG nó không phải là 100% vimscript, NHƯNG ai quan tâm: P
dylnmc

tac không phải là xử lý vim hoàn toàn tự nhiên, nhưng, lệnh 'm'ove lấy số dòng và không phải lúc nào cũng hợp lý. Tôi thường sử dụng một nhãn hiệu như là một phần của phạm vi, vì vậy :.,'a!tachoạt động với nỗ lực tối thiểu.
studog

Sau khi sử dụng shift+v, bạn có thể sử dụng }để tiếp cận đoạn tiếp theo hoặc không gian dọc trống. Ngoài ra, man tac: concatenate and print files in reverse.
nilon

33

Trên Mac OS X, tackhông tồn tại, nhưng bạn có thể sử dụng tail -rcùng một hiệu ứng:

:%!tail -r

Điều này cũng hoạt động độc đáo cho chế độ trực quan:

:'<,'>!tail -r

Trích từ tail(1)trang của:

Tùy chọn -r làm cho đầu vào được hiển thị theo thứ tự ngược lại, theo dòng. Ngoài ra, tùy chọn này thay đổi ý nghĩa của các tùy chọn -b, -c và -n. Khi tùy chọn -r được chỉ định, các tùy chọn này chỉ định số lượng byte, dòng hoặc khối 512 byte sẽ hiển thị, thay vì các byte, dòng hoặc khối từ đầu hoặc cuối của đầu vào để bắt đầu hiển thị. Mặc định cho tùy chọn -r là hiển thị tất cả các đầu vào.


3
Xuất sắc! Vì vậy, để cung cấp 'tac' trong OS X:alias tac='tail -r'
Brent Faust

4
Bạn cũng có thể brew install coreutilsvà sử dụng gtac.
Andrew Marshall

1
Thiên tài. Không bao giờ nghĩ đến việc sử dụng! lệnh cho loại thao tác dòng trực quan này.
Charlie Dalsass

3

Đối với những người thoải mái hơn với chế độ Trực quan:
1. Xác định số dòng phía trên lựa chọn bạn muốn lật bằng cách sử dụng :set nu.
2. Shift-Vđể làm nổi bật lựa chọn bạn muốn lật (chế độ trực quan).
3 :g/^/m <Line number from step 1>..

Lưu ý rằng trong chế độ trực quan, nó sẽ tự động hiển thị như :'<,'>g/^/m <Line number>khi bạn nhập lệnh từ 3.

Lệnh này hoạt động bằng cách di chuyển lựa chọn từng dòng một vào số dòng mà bạn cung cấp. Khi mục thứ hai được đẩy vào số dòng đã cho, nó sẽ đẩy số thứ nhất xuống số thứ tự + 1. Sau đó, mục thứ ba đẩy thứ nhất và thứ hai xuống và tiếp tục cho đến khi toàn bộ danh sách được đẩy vào số dòng duy nhất dẫn đến danh sách đặt hàng ngược.


4
Bạn có thể sử dụng '<thay vì nhập số dòng bằng tay. Chỉ cần bắt đầu lựa chọn một dòng trước đó và thực hiện :'<,'>g/^/m'<.
Palec

3

Một lệnh :Rev[erse]và ánh xạ tùy chọn cho bạn vimrc, vì vậy bạn không cần phải nhớ và thực hiện các bước không rõ ràng của công thức này:

" Reverse the lines of the whole file or a visually highlighted block.
    " :Rev is a shorter prefix you can use.
    " Adapted from http://tech.groups.yahoo.com/group/vim/message/34305
command! -nargs=0 -bar -range=% Reverse
    \       let save_mark_t = getpos("'t")
    \<bar>      <line2>kt
    \<bar>      exe "<line1>,<line2>g/^/m't"
    \<bar>  call setpos("'t", save_mark_t)

nmap <Leader>r :Reverse<CR>
xmap <Leader>r :Reverse<CR>

( :xmapbản đồ cho Visual nhưng không chọn chế độ, như :help mapmode-xlời khuyên cho ánh xạ các ký tự có thể in.)

(Dựa trên: http://tech.groups.yahoo.com/group/vim/message 432305 )


Đây phải là câu trả lời được chấp nhận IMO. Nói chung là hữu ích nhất và tôi không cần phải nhớ :'<,'>g/^/m'<:)
Eliot

1
@Eliot, cảm ơn! :) (Tôi đã thêm một chút 'nội dung phần thưởng' .;))
Aaron Thoma

Làm thế nào tôi có thể nói lựa chọn bắt đầu -1 trong trường hợp này? Bởi vì việc di chuyển bắt đầu vào thời điểm này.
SergioAraujo

@SergioAraujo: Có phải cái gì đó giống như :-1,+1Revnhững gì bạn đang tìm kiếm? Biết rằng bạn có thể chọn trực quan phạm vi bạn muốn đảo ngược, ví dụ : V7j:Rev. Nếu điều đó không trả lời câu hỏi của bạn, tôi đã không hiểu nó, vì vậy bạn cần phải giải thích hoặc viết lại nó cho tôi.
Aaron Thoma

1

Giả sử bạn đang ở dòng 3, do đó chúng tôi có phạm vi từ 3 đến 6. Chỉ cần gõ.

:3,6g/^/m2

1
Bạn có thể để ẩn số của dòng hiện tại: Với con trỏ trên dòng đầu tiên trong phạm vi của bạn, bạn có thể rút ngắn xuống :,6g/^/m2; hoặc khi trên dòng cuối cùng của phạm vi : :3,g/^/m2; và :3,6g/^/m2làm việc từ bất cứ nơi nào trong tập tin.
Aaron Thoma
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.