Làm cách nào để xác định vị trí nhiều tệp và mở chúng trong vim?


10

Giả sử rằng tôi có một tệp có tên filename123.txtvà đó là tệp duy nhất được đặt tên như vậy và tôi có thể sử dụng locatenó bằng lệnh locate filename123. Và nó chỉ trả về tập tin này.

Bây giờ tôi muốn mở nó với vi/ vim. Nhưng tôi không muốn đến vị trí đó và gõ vilệnh theo sau là tên tệp. Ở đây tôi muốn kết quả của locate filename123việc được thêm vào lệnh vi. Làm thế nào tôi có thể làm như vậy? Tôi đã thử:

locate filename123 | vi

Nhưng điều này không hoạt động. Và lỗi này xuất hiện trong thiết bị đầu cuối:

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.

Câu trả lời:


12

Bạn có thể sử dụng xargs:

locate filename123 | xargs vi

Theo mặc định, xargssẽ thực thi càng ít phiên bản của lệnh được chỉ định càng tốt, truyền càng nhiều tham số càng tốt theo ARG_MAX của hệ thống . Để giới hạn số lượng tham số được truyền cho một thể hiện của vi, hãy sử dụng tùy chọn xargs' -n.

Để xử lý tên tệp chứa khoảng trắng, sử dụng tùy chọn xargs' -d:

locate filename123 | xargs -d '\n' vi

Để xử lý tên tệp chứa dòng mới, hãy sử dụng tùy chọn xargs' -0cùng với tùy chọn locate' -0:

locate -0 filename123 | xargs -0 vi

(Nếu -0không có sẵn trên bất kỳ ứng dụng nào trong số chúng, hãy kiểm tra --nullhoặc cách khác để chỉ định ký tự \000là dấu phân cách.)


Bạn có thể cho tôi biết những gì đã ngăn cản tôi trước khi mở tập tin này?
Santosh Kumar

1
@Santosh Bạn đã chuyển đầu ra của locatelệnh làm đầu vào cho vi. Vi, giống như bất kỳ chương trình nào khác, hy vọng tên của (các) tệp sẽ hoạt động như các đối số.
Gilles 'SO- ngừng trở nên xấu xa'

@manatwork Vấn đề là tôi không thể định vị và mở tên tệp có khoảng trắng trong đó. Ví dụ: lệnh này sẽ mở nhiều tệp trong vim: xác định vị trí I \ have \ to \ download | xargs vi
Santosh Kumar

3

Bạn có thể sử dụng mở rộng lệnh:

vi "$(locate filename123 | head -n1)"

Để vimđọc stdin của nó, bạn có thể làm vim -, nhưng điều đó sẽ chỉ cung cấp cho bạn đầu ra locatelà các đường dẫn tên tệp. Điều này có thể hoạt động mặc dù, sử dụng vim gflệnh bình thường sau đó sẽ mở đường dẫn con trỏ đang bật.

Biên tập

Trong trường hợp tên tệp có khoảng trắng trong đó, bạn nên sử dụng xargstùy chọn được đề cập hoặc vimgiải pháp được mô tả ở trên. Lưu ý để thực hiện gfcông việc bạn cần thêm không gian vào isfname:

set isfname+=32

Mẹo này và các lựa chọn thay thế được mô tả ở đây .

Chỉnh sửa 2

Đã thêm trích dẫn và headtheo đề xuất của PeterO trong các bình luận .


Đối với tệp có khoảng trắng trong chúng, khi tôi chèn \ vào tên tệp, như vi $ (định vị tệp \ khác). Vim mở nó dưới dạng hai tệp riêng biệt anotherfile:(.
Santosh Kumar

Câu trả lời của bạn chỉ hoạt động khi tôi không có khoảng trắng trong tệp mà tôi đang định vị.
Santosh Kumar

Trả lời cập nhật.
Thor

2
@Thor: Đối với một tệp duy nhất, như được đề cập trong câu hỏi, bạn chỉ cần bọc dấu ngoặc kép xung quanh quá trình thay thế: vi "$(locate filename123)"... Để đảm bảo rằng nó chỉ có một tên tệp để xử lý:vi "$(locate filename123 |head -n1)"
Peter.O

PeterO: Bạn nói đúng, tôi chỉ thử nghiệm với nhiều lần truy cập. Tôi đã thêm ý kiến ​​của bạn vào câu trả lời.
Thor

1

Cách đơn giản nhất là vượt qua locatenhư thay thế vỏ , như:

vim $(locate filename123)

Bạn cũng có thể xem xét sử dụng findthay vì locatechuyển tên tệp để chỉnh sửa, ví dụ:

find . -name 'filename123' -exec vim {} +

Trên Unix / OSX, bạn có thể sử dụng xargsvới -otham số, như:

locate filename123 | xargs -o vim

-oMở lại stdin dưới dạng / dev / tty trong tiến trình con trước khi thực hiện lệnh. Điều này rất hữu ích nếu bạn muốn xargs chạy một ứng dụng tương tác.

Hoặc trên Linux, hãy thử cách giải quyết sau bằng cách sử dụng:

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

Nếu bạn đang sử dụng các lệnh khác nhau, hãy sử dụng thay thế lệnh để đạt được điều đó, như:

vim $(locate filename123)
vim `locate filename123`

Hoặc sử dụng GNU parallelthay vì xargsbuộc phân bổ tty, ví dụ:

locate filename123 | parallel -X --tty vi

Lưu ý: paralleltrên Unix / OSX sẽ không hoạt động vì nó có các tham số khác nhau và nó không hỗ trợ tty.

Nhiều lệnh phổ biến khác cũng cung cấp phân bổ giả (như -ttrong ssh), vì vậy hãy kiểm tra trợ giúp.

Đề xuất khác là sử dụng vipe(một ống lệnh Vim) hoặc sử dụng tập lệnh đơn giản sau:

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

Liên quan:

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.