Có một đối tượng văn bản cho toàn bộ bộ đệm?


28

Tôi thường thấy mình gõ các lệnh như gg"+yGhoặc ggdGvà muốn một cách hiệu quả hơn để làm điều này mà không phải di chuyển con trỏ hai lần. Có lệnh nào tôi có thể sử dụng ví dụ y[movement]để sao chép toàn bộ bộ đệm mà không di chuyển con trỏ không?

Câu trả lời:


36

Vì vim sử dụng dấu phần trăm để tham chiếu bộ đệm hiện tại, bạn có thể sử dụng nó để nhận mọi thứ một cách nhanh chóng.

:%ysẽ kéo toàn bộ bộ đệm :%y+sẽ đưa nó vào thanh +ghi (và có lẽ là bảng tạm, với điều kiện vim được biên dịch với các tùy chọn thích hợp).

:%d:%d+sẽ làm tương tự để xóa.

Trong mỗi trường hợp này, con trỏ vẫn giữ nguyên vị trí.


Wow, tất cả thời gian này tôi đã sử dụng mmgg"+yG`mvà không bao giờ nghĩ về điều này. Cảm ơn, điều này sẽ xảy ra ngay trong .vimrc.
Doorknob 3/03/2015

@Doorknob thay vì cài đặt và sử dụng nhãn hiệu, bạn chỉ có thể sử dụng C-ohai lần để quay lại.
Ruslan

10

Một giải pháp khác là sử dụng một plugin có tên vim-textobj-whole . Theo mặc định, plugin này cung cấp đối tượng văn bản aecho toàn bộ bộ đệm, iecho toàn bộ bộ đệm ngoại trừ các dòng trống hàng đầu và dấu.

Plugin này phụ thuộc vào người dùng vim-textobj bởi cùng một tác giả, cho phép người dùng xác định bất kỳ đối tượng văn bản nào một cách thoải mái. Có rất nhiều plugin sử dụng tốt điều này.


8

Theo mặc định, không có đối tượng văn bản cho toàn bộ tệp, nhưng có thể tạo chúng bằng cách sử dụng omap. Trong trường hợp này, nó sẽ trông giống như thế này:

onoremap f :<c-u>normal! mzggVG<cr>`z

Đây là một sự cố về cách thức hoạt động của nó:

onoremap f " make 'f' the text object name
:<c-u> " use <c-u> to prevent vim from inserting visual selection marker at the beginning of the command automatically.
normal! " use normal to make key presses ignoring any user mappings
mzggVG<cr>`z " make a marker in register z, select the entire file in visual line mode and enter the normal command, and go back to the z marker

Ghi chú:

Ctrlucó thể được sử dụng trong chế độ dòng lệnh để xóa mọi thứ ở bên trái của vị trí con trỏ. Lý do tại sao điều này được thực hiện là bởi vì nếu bạn nhập dòng lệnh trực tiếp từ chế độ trực quan, nó sẽ tự động chèn '<,'>vào dòng lệnh và đó không phải là điều chúng ta muốn. Tôi cũng sẽ đề nghị bạn sử dụng một cái gì đó khác f, bởi vì fthường được sử dụng để di chuyển đến nhân vật được tìm kiếm tiếp theo trên dòng. Ví dụ, fisẽ đi đến dòng tiếp theo itrên dòng hiện tại.

Các chủ đề trợ giúp có liên quan:

:help omap-info
:help :normal
:help c_CTRL-U
:help v_:

Có cách nào để làm điều này trong khi để con trỏ một mình không?
Random832

@ Random832 Thêm một ``vào cuối sẽ trả con trỏ về vị trí trước đó.
SnoringFrog

Tôi lo ngại rằng điều này sẽ làm cho nó không áp dụng lựa chọn cho lệnh yank. Tôi sẽ thử nghiệm một số ngày hôm nay.
Random832

1
Tôi đã thêm một lệnh đánh dấu vào ánh xạ, nó sẽ để con trỏ ở vị trí hiện tại.
EvergreenTree

2

Dưới đây là một số ánh xạ bẩn nhanh để hoàn thành nhiệm vụ:

nnoremap yY :%yank <c-r>=v:register<cr><cr>
nnoremap dD :%delete <c-r>=v:register<cr><cr>

Bây giờ bạn có thể sử dụng yYdDđể yank / xóa tương ứng. Nó không đẹp như sử dụng một đối tượng văn bản đầy đủ, nhưng đôi khi các giải pháp đơn giản nhất là tốt nhất.

Để được trợ giúp thêm xem:

:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=
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.