Mở tệp được cung cấp bởi kết quả của lệnh trong vim


34

Tôi thấy mình làm như vậy gần như mỗi ngày

  1. Chạy tìm ( find -name somefile.txt)
  2. Mở kết quả trong vim

Vấn đề là tôi phải sao chép và dán kết quả của sự findvào vimlệnh. Có cách nào để tránh phải làm điều này? Tôi đã thử nghiệm một chút ( find -name somefile.txt | vim) nhưng không tìm thấy bất cứ điều gì hoạt động.

Cảm ơn trước

Câu trả lời:


31

Bạn có thể sử dụng lệnh thay thế:

vim $(find -name somefile.txt)

hoặc là

find -name somefile.txt -exec vim {} \;

1
được. Nếu đó là những gì cần thiết, thì hãy tìm -name somefile.txt | xargs vim
balki

3
Không, điều đó không hoạt động đúng và thậm chí có thể gây rối thiết bị đầu cuối của bạn! Bạn không thể chuyển sang xargs vim, vì vim hy vọng đầu vào đến từ một thiết bị đầu cuối tương tác.
dogbane


4
Một lựa chọn khác sẽ là vim `find -name somefile.txt`. @StuartPowers Ngoài ra, bạn có thể sử dụng vim `!-1`nếu bạn đã sử dụng lệnh tìm kiếm này là lệnh trước đó của bạn
Bernhard

1
@balki để sử dụng xargs trong kịch bản này, bạn phải sử dụng cờ -o, đó là trong man: -o Reopen stdin as / 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.
davidmh

7

Thử đi:

  1. bắt đầu vim
  2. trong vim, sử dụng như sau:

:r!find /<path> -name 'expression'

Kết quả sẽ xuất hiện trong vim khi tìm kiếm hoàn tất.

Hoặc là

Thử:

find /<path> -name > results.txt
vim results.txt 

Giải pháp của tôi làm chính xác như vậy nhưng tại sao nó lại bỏ phiếu?
balki

5

Nếu bạn không ngại chạy lại lệnh: nhấn Upvà nối một xargslệnh. Hoặc sử dụng thay thế lịch sử và chạy

!! | xargs vim          # won't work with file names containing \'" or whitespace
!! | xargs -d \\n vim   # GNU only (Linux, Cygwin)

Có một cách nhẹ nhàng để lưu đầu ra của lệnh hoạt động trong ksh và zsh nhưng không phải trong bash (nó yêu cầu phía đầu ra của một đường ống phải được thực thi trong vỏ cha). Đưa lệnh vào hàm K(định nghĩa zsh bên dưới), mà k xuất ra đầu ra của nó trong biến $K.

function K {
    K=("${(@f)$(tee /dev/fd/3)}") 3>&1;
}
find  |K
vim $K

Tự động lưu đầu ra của mỗi lệnh là không thực sự có thể với vỏ, bạn cần chạy lệnh trong một thiết bị đầu cuối mô phỏng. Bạn có thể làm điều đó bằng cách chạy bên trong script(một tiện ích BSD, nhưng có sẵn trên hầu hết các thông báo bao gồm cả Linux và Solaris), giúp lưu tất cả đầu ra của phiên của bạn thông qua một tệp (vẫn còn một chút nỗ lực để phát hiện dấu nhắc cuối cùng trong bản in ).


2

Tôi thích sử dụng các dấu tick phía sau `(Nó nằm trên cùng một phím với ~)

> vim `find . -name somefile.txt`

Các tick phía sau thực thi lệnh bên trong các tick và đầu ra sau đó có thể được sử dụng bởi lệnh. Ở trên sẽ tìm thấy tất cả các tệp somefile.txt do đó cho phép bạn sử dụng :nextđể di chuyển qua tất cả các tệp.

Sẽ rất hữu ích nếu bạn dành một vài lần thử tinh chỉnh lệnh, bởi vì sau đó bạn có thể sử dụng thay thế lịch sử để lặp lại lệnh cho trình soạn thảo.

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`

2

Tôi đã phải bỏ lỡ điểm ở đây, bởi vì tôi sẽ sử dụng:

:find **/somefile.txt

(nếu tôi biết chỉ có một người trong tôi :echo &path ) hoặc, nếu tôi muốn tất cả:

:args **/somefile.txt

Chỉnh sửa: Whoa! Ok, vì vậy tôi đã bỏ lỡ điểm - bạn muốn danh sách tìm kiếm, không phải các tập tin thực tế được mở? Hãy thử (một lần nữa, từ bên trong Vim):

!!find . -name somefile.txt

-- lỗi của tôi :)


1

Như @davidmh đã chỉ ra trong các bình luận, bạn có thể sử dụng xargsvới cờ -onếu bạn muốn sử dụng một ứng dụng tương tác.

find . -name somefile.txt | xargs -o vim

Nếu bạn không sử dụng -o, có thể bạn sẽ làm rối loạn trạng thái thiết bị đầu cuối sau khi rời vim. Nếu bạn đã thực hiện nó, bạn sẽ có thể đặt lại thiết bị đầu cuối của mình bằng lệnh sau:

reset

0

Tôi đã viết một chức năng pvimmà làm những gì bạn muốn. Nếu nhiều dòng được dẫn đến pvimnó bỏ qua tất cả trừ dòng đầu tiên, nó có thể được mở rộng mặc dù để mở nhiều tệp trong vim.

stu@sente ~ $ function pvim() { read -r somefile; exec < /dev/fd/1; vim "$somefile"; }
stu@sente ~ $ type pvim
pvim is a function
pvim ()
{
    read -r somefile;
    exec < /dev/fd/1;
    vi "$somefile"
}

Sử dụng nó như:

stu@sente ~ $ find . -name "foo.txt" | pvim

sẽ tải "foo.txt" đầu tiên vào vim giống như bạn đã gõ:

vim $(find . -name "foo.txt | head -n1")


0

Đây là một xargsgiải pháp đơn giản hơn những giải pháp đã được đề cập:

find -name somefile.txt | xargs vim -p

Các -ptùy chọn cho vimmở từng tập tin trong một tab riêng biệt. Tôi thấy điều này thuận tiện hơn so với sử dụng bộ đệm.


0

Tôi thấy rằng việc mở một tập tin với sự giúp đỡ của locate in vim cực kỳ tiện lợi và nhanh hơn nhiều find.

Lệnh sau tìm kiếm một tệp được gọi app.pytrong đường dẫn chứa thư mục MyPythonProject.

:args `locate '*MyPythonProject*app.py'`
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.