Thay thế lựa chọn bằng đầu ra của lệnh bên ngoài


10

Giả sử tôi có một dòng trong tệp với XXXXtư cách là người giữ chỗ tôi đã chọn qua vnhư sau:

XXXX Some other text

Làm thế nào tôi có thể thay đổi chỉXXXXvới đầu ra của một lệnh bên ngoài, chẳng hạn như date +%Y%m%d?

Tôi đã đi xa như

:'<,'>!date +\%Y\%m\%d 

nhưng điều đó đã thay thế toàn bộ dòng.


Câu hỏi liên quan về stackoverflow: stackoverflow.com/q/8403599/ từ
Hotschke

Câu trả lời:


15

Bạn có thể xóa văn bản và chèn đầu ra của lệnh bằng cách sử dụng CtrlR- =:

CTRL-R {0-9a-z"%#*+:.-=}                                        i_CTRL-R
                Insert the contents of a register.  Between typing CTRL-R and
                the second character, '"' will be displayed to indicate that
                you are expected to enter the name of a register.
 …
                                                        i_CTRL-R_=
                        '='     the expression register: you are prompted to
                                enter an expression (see expression)

Đối với biểu thức, bạn có thể sử dụng system()hàm để chạy các lệnh bên ngoài.

Sau khi chọn văn bản, nhấn c, sau đó <c-r>=và sử dụng system('date +%Y%m%d')như biểu thức.


1
Điều đó thêm một dòng mới giữa văn bản thay thế và phần còn lại của dòng, phải không?
muk.li

2
@ muk.li đó là một phần của đầu ra date. Nếu bạn thử một cái gì đó như system('printf %s foo'), mà không tạo ra một dòng mới, bạn sẽ thấy có một sự khác biệt.
muru

4
@ muk.li nếu bạn chỉ muốn ngày trong văn bản, có strftimechức năng mà bạn có thể sử dụng thay vì system('date …'). Chuỗi định dạng là như nhau.
muru

2
Bạn không cần phải xóa văn bản đã chọn. Bạn có thể sử dụng "=system('date +%Y%m%d')ptrên lựa chọn trực quan thay thế.
Hauleth

5

Nếu bạn đặt con trỏ trên một dòng như vậy, bạn có thể:

  • 0 để đặt con trỏ trong cột đầu tiên.
  • f Space để đặt con trỏ vào chỗ trống đầu tiên.
  • i Enter Esc để phân chia dòng.
  • l để di chuyển con trỏ lên một dòng.
  • :.!date +\%Y\%m\%d để thực hiện lệnh.
  • J để tham gia các dòng một lần nữa.

Từ :h :visual_example:

Hiện tại lệnh ":" chỉ hoạt động trên toàn bộ dòng. Khi bạn chọn một phần của một dòng, thực hiện một cái gì đó như ":! Date" sẽ thay thế toàn bộ dòng. Nếu bạn muốn chỉ một phần của dòng được thay thế, bạn sẽ phải tạo một ánh xạ cho nó. Trong bản phát hành trong tương lai ":" có thể hoạt động trên một phần dòng.

Xem thêm :h visual-operatorsđể biết chi tiết.

Từ nhận xét này : Bạn cũng có thể thử plugin vis hoặc NrrwRgn . Cả hai nên xử lý nó tốt. (Cảm ơn @ christian-brabandt cho tiền boa).


2

Tạo một bản đồ tạm thời cho các thay thế như vậy. Ví dụ:

:vnoremap qq c<C-R>=system('wc -c | perl -pe chomp', @")<CR><ESC>

Sau đó, trong chế độ trực quan, bạn có thể chọn văn bản, nhập qqvà nó sẽ được thay thế bằng đầu ra lệnh. Trong ví dụ wc -cnày sẽ xử lý lựa chọn của bạn, đó là @"tham số. perl -pe chomplà cần thiết để loại bỏ một dòng mới từ đầu ra.


1
Lưu ý rằng giải pháp này là một trình bao bọc xung quanh câu trả lời của muru, tạo ra ánh xạ cho việc sử dụng một lần có thể không phải là phương pháp hiệu quả nhất.
statox

1

Thử cái này:

:let @a = system('date +\%Y\%m\%d')[:-2]
:'<,'>g/XXXX/s/XXXX/\=@a/g
  • Dòng đầu tiên lưu đầu ra của datelệnh vào đăng ký a, với dòng mới kết thúc được loại bỏ.
  • Dòng thứ hai trên toàn cầu kiểm tra lựa chọn của bạn và đánh dấu các dòng có chứa XXXX( g/XXXX/) và
  • thay thế tất cả các thể hiện XXXXbằng nội dung đăng ký a ( s/XXXX/\=@a/g)

Xem :h let-@:h :globalcũng như phần "Danh sách phụ" trong:h list-index


0

Plugin: Lệnh Visual Block (vis) của DrChip

Cài đặt vis.vba.gzvà phụ thuộc cecutil.vba.gzvào packpath vim8

# shell brace expansion (bash >=3.0, zsh>=2.6)
$ mkdir -p ~/.vim/pack/manual/start/{vis,cecutil}
$ vim http://www.drchip.org/astronaut/vim/vbafiles/vis.vba.gz
:UseVimball ~/.vim/pack/manual/start/vis
:e http://www.drchip.org/astronaut/vim/vbafiles/cecutil.vba.gz
:UseVimball ~/.vim/pack/manual/start/cecutil

Ví dụ OP trở thành

:'<,'>B !date +\%Y\%m\%d 
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.