di chuyển lựa chọn sang một tệp riêng


11

Với vim, làm cách nào tôi có thể di chuyển một đoạn văn bản sang một tệp mới? Hiện tại, tôi làm điều này:

  • chọn văn bản
  • sử dụng :w new_file
  • chọn lại văn bản
  • xóa văn bản

Có cách nào hiệu quả hơn để làm điều này?

Trước

a.txt

sometext
some other text
some other other text
end

Sau

a.txt

sometext
end

b.txt

some other text
some other other text

Câu trả lời:


4

Làm thế nào về các lệnh tùy chỉnh:

:command! -bang -range -nargs=1 -complete=file MoveWrite  <line1>,<line2>write<bang> <args> | <line1>,<line2>delete _
:command! -bang -range -nargs=1 -complete=file MoveAppend <line1>,<line2>write<bang> >> <args> | <line1>,<line2>delete _

1
Điều này rất xấu, nhưng này, nó dường như làm trong một bước chính xác những gì tôi yêu cầu (tôi đã thử). +1 và được chấp nhận. Tôi đang tìm kiếm một cách bản địa để làm điều này một cách nhanh chóng nhưng vì dường như không có một cách nào, bạn sẽ làm tốt thôi. Cảm ơn!
greg0ire

Vẻ đẹp trong mắt của kẻ si tình. Tôi thấy điều này khá thanh lịch; bạn chỉ cần nhập một lần (vào .vimrc).
Ingo Karkat

Bạn nói đúng, "rất xấu" shoud đã "rất lạ". Lệnh của bạn rất tiện dụng và tôi nghĩ rằng tôi chắc chắn sẽ khắc nó trong .vimrc
greg0ire

7

Bằng cách "di chuyển một đoạn văn bản sang một tệp mới" Tôi giả sử bạn có nghĩa là cắt đoạn văn bản đó khỏi tệp hiện tại và tạo một tệp mới chỉ chứa văn bản đó.

Ví dụ khác nhau:

  • :1,1 w new_file để tạo một tệp mới chỉ chứa văn bản từ dòng số 1
  • :5,50 w newfile để tạo một tệp mới chứa văn bản từ dòng 5 đến dòng 50
  • :'a,'b w newfileđể tạo một tệp mới chứa văn bản từ đánh dấu ađến đánh dấub
    • đặt điểm của bạn bằng cách sử dụng mavà bất cứ mbnơi nào bạn thích

Ở trên chỉ sao chép văn bản và tạo một tệp mới chứa văn bản đó. Sau đó, bạn sẽ cần phải xóa sau đó.

Điều này có thể được thực hiện bằng cách sử dụng cùng một phạm vi và dlệnh:

  • :5,50 d để xóa văn bản từ dòng 5 đến dòng 50
  • :'a,'b dđể xóa văn bản từ đánh dấu ađể đánh dấub

Hoặc bằng cách sử dụng ddcho trường hợp dòng đơn.

Thay vào đó, nếu bạn chọn văn bản bằng chế độ trực quan, rồi nhấn :trong khi văn bản được chọn, bạn sẽ thấy phần sau trên dòng lệnh:

:'<,'>

Trong đó chỉ ra văn bản đã chọn. Sau đó, bạn có thể mở rộng lệnh thành:

:'<,'>w >> old_file

Mà sẽ nối văn bản vào một tập tin hiện có. Sau đó xóa như trên.


Lót:

:2,3 d | new +put! "

Sự phá vỡ:

  • :2,3 d - xóa các dòng 2 đến 3
  • | - về mặt kỹ thuật, điều này chuyển hướng đầu ra của lệnh đầu tiên sang lệnh thứ hai nhưng vì lệnh đầu tiên không xuất ra bất cứ thứ gì, chúng tôi chỉ kết nối các lệnh với nhau
  • new - mở một bộ đệm mới
  • +put! "- đặt nội dung của thanh ghi không tên ( ") vào bộ đệm
    • Bang ( !) ở đó để nội dung được đặt trước dòng hiện tại. Điều này gây ra và dòng trống ở cuối tập tin. Không có nó, có một dòng trống ở đầu tập tin.

Giả định của bạn là đúng. Điều này có vẻ tốt, tôi sẽ thử nghiệm. Bạn có thể giải thích 2. một chút nữa không? Tôi không quen thuộc lắm với phạm vi. EDIT: Nếu tôi thử điều này trên dòng thứ hai, nó sẽ ghi dòng đầu tiên vào tệp khác, không phải dòng thứ hai.
greg0ire

@ greg0ire tôi đã nhận rằng một chút lạc hậu, tôi sẽ chỉnh sửa để giải thích tốt hơn
embedded.kyle

Tôi đã thêm một ví dụ để làm cho câu hỏi của tôi rõ ràng hơn.
greg0ire

@ greg0ire Tôi đã sửa câu trả lời của mình. Vẫn còn hai bước. Các bản sao đầu tiên và viết. Việc xóa thứ hai.
nhúng.kyle

Ok, nếu tôi hiểu rõ, mẹo là sử dụng các phạm vi để chọn và viết trong cùng một lệnh. Điều đó rất giống với những gì tôi đã làm. +1 cho phần giải thích chi tiết, nhưng tôi không nghĩ rằng cách này hiệu quả hơn, vì mẹo đánh ':' là những gì tôi làm trong lúc này.
greg0ire

1

Dựa trên câu trả lời của @ embed.kyle và Hỏi & Đáp này , tôi đã kết thúc với một lớp lót này để nối thêm một lựa chọn vào một tệp và xóa khỏi tệp hiện tại. Sau khi chọn một số dòng với Shift+V, nhấn :và chạy:

'<,'>w >> test | normal gvd 

Phần đầu tiên nối các dòng được chọn. Lệnh thứ hai vào chế độ bình thường và chạy gvdđể chọn lựa chọn cuối cùng và sau đó xóa.


0

Chọn văn bản ở chế độ trực quan, sau đó nhấn yđể "kéo" nó vào bộ đệm (sao chép) hoặc d"xóa" nó vào bộ đệm (cắt).

Sau đó, bạn có thể :split <new file name>chia cửa sổ vim của bạn lên và nhấn pđể dán vào văn bản được kéo dài. Viết tệp như bình thường.

Để đóng lại phần tách, hãy vượt qua phần tách bạn muốn đóng :q.


1
Tôi có 4 bước cho thời điểm này: chọn, viết, chọn, xóa. Với phương pháp của bạn, tôi có 6 bước: chọn, xóa, chia, dán, viết, đóng. Tôi đã yêu cầu một cái gì đó hiệu quả hơn: P
greg0ire

Chà, nếu bạn vượt qua sự phân chia :xthay vào đó, bạn có thể kết hợp viết và đóng thành một và thực hiện năm bước. : P
Xyon

Điều đó tốt hơn, nhưng 5 vẫn> 4: P
greg0ire
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.