Loại bỏ đầu ra từ autocomand vim


13

Tôi có một autocommand được định nghĩa trong vimrc của tôi:

au BufWritePost * !./make.sh

Kịch bản make.shbiên dịch một .textệp 3 lần và tôi không muốn đầu ra được hiển thị.

Có cách nào để triệt tiêu đầu ra không?

Tôi đã cố gắng thêm silentmột dòng trước aulệnh, nhưng nó không hoạt động. Tôi cũng đã thử cách này nhưng không thành công.

Câu trả lời:


20

Im lặng nên đi trước !./make.shchứ không phải trước au. Đặt silenttrước auchỉ có nghĩa là nó sẽ đăng ký tự động âm thầm. Nó sẽ trông như thế này thay vào đó:

au BufWritePost * silent! !./make.sh

Một vấn đề với việc chạy một lệnh bên ngoài như thế này với :silentlệnh là màn hình không vẽ lại, khiến bạn có một màn hình trống. Tuy nhiên, vim có một lệnh vẽ lại màn hình, có thể được sử dụng như vậy:

au BufWritePost * silent! execute "!./make.sh >/dev/null 2>&1" | redraw!

Lý do tôi cần sử dụng lệnh thực thi là vì :!lệnh sử dụng bất kỳ ký tự nào được tìm thấy sau nó, điều đó có nghĩa là tôi không thể làm được silent! !./make.sh | redraw!vì bash sẽ cố gắng diễn giải tất cả các ký tự sau đó !.

Ghi chú

Lưu ý rằng :silent!bỏ qua các thông báo lỗi, trong khi :silentkhông. Ngoài ra, các >/dev/null 2>&1bộ phận chuyển hướng tất cả các sản phẩm của !./make.shđể /dev/null. Bạn có thể đọc thêm về chuyển hướng i / o trong bash tại đây .

Chủ đề trợ giúp có liên quan

  • :help :execute
  • :help :silent
  • :help :!
  • :help :bar

Lệnh thứ hai hoạt động, mặc dù nó vẫn in đầu ra trên màn hình. Ngoài ra, tôi không cần nhấn Enter khi kịch bản kết thúc nữa, điều này tốt. Nhưng tôi tự hỏi nếu có bất kỳ cách nào để triệt tiêu hoàn toàn đầu ra.
Andre Herman Bezerra

1
Có thay thế execute "!./make.sh"với execute "!./make.sh >/dev/null 2>&1"sự giúp đỡ? Điều này chuyển hướng tất cả đầu ra của lệnh đến /dev/null. Đọc tldp.org/LDP/abs/html/io-redirection.html để biết thêm thông tin về chuyển hướng trong bash.
EvergreenTree

Tôi cần phải có suy nghĩ về điều đó! Nó hoạt động. Cảm ơn!
Andre Herman Bezerra

7

Câu trả lời cho câu hỏi trực tiếp của bạn giống như @EvergreenTree đã đăng. Tuy nhiên tôi cảm thấy như bạn đang thiếu một số công cụ tích hợp Vim để xây dựng / biên dịch / linting dự án. Đáng chú ý nhất :makevà danh sách quickfix.

Những gì sử dụng :makecó được chúng tôi?

Việc sử dụng :makecho phép bạn thu thập các lỗi của mình vào một danh sách được gọi là danh sách quickfix. Sử dụng quickfix, bạn có thể điều hướng giữa các lỗi trong tệp của mình, vì vậy bạn sẽ chuyển ngay đến nơi trình biên dịch nói lỗi là (tiện dụng phải không?).

:làm

Chạy :makesẽ thực hiện chương trình make 'makeprg'. Sau đó phân tích đầu ra với 'errorformat'và đặt từng mục vào danh sách quickfix.

Thông thường 'makeprg'mặc định cho makelệnh chạy a Makefile. Tuy nhiên, bạn có thể thay đổi 'makeprg'thông qua :compilerlệnh hoặc đặt trực tiếp.

Bạn cũng có thể truyền thêm đối số cho :make. ví dụ:make clean

Lưu ý: chạy :makethường sẽ hiển thị đầu ra của lệnh ở dưới cùng của màn hình với lời nhắc yêu cầu nhấn enter. Chỉ cần nhấn enter là tất cả đầu ra sẽ có sẵn trong danh sách quickfix. Bạn có thể ngăn chặn điều này thông qua :silent, ví dụ :silent make.

Một lệnh tùy chỉnh phổ biến cho một chế độ im lặng là:

command -nargs=* -bar Smake silent make <args> <bar> cwindow

danh sách quickfix

Sau khi bạn chạy :makedanh sách quickfix của bạn sẽ giữ đầu ra của trình biên dịch.

Sử dụng lệnh sau để điều hướng danh sách quickfix.

  • :copen để mở cửa sổ quickfix
  • :cclose để đóng cửa sổ quickfix
  • :cnext/ :cprevđể chuyển sang mục tiếp theo / trước
  • :ccđể in ra ở phía dưới lỗi hiện tại hoặc :cc 3hiển thị một lỗi cụ thể trong ví dụ 3 này

Cá nhân tôi sử dụng Tim Pope không yếu đuối plugin để điều hướng các danh sách QuickFix.

Còn việc chạy :maketự động và âm thầm thì sao?

Bạn có thể làm điều này với một :autocmdgiống như bạn ở đâu.

augroup auto_make
    autocmd!
    autocmd BufWritePost * silent make
    autocmd QuickFixCmdPost *make* cwindow
augroup END

Như một phần thưởng tôi đã thêm vào khi mở cửa sổ quickfix thông qua :cwindownếu có bất kỳ lỗi nào.

Lưu ý: Nên cụ thể hơn với mẫu tệp đó trên BufWritePostautocmd để các tệp không liên quan không được xây dựng.

Có nhiều hơn nữa không?!

Điều này chỉ sử dụng một vài lệnh dựng sẵn của Vim cộng với một vài autocmd để thuyết phục. Tất nhiên có các plugin và công cụ có thể hỗ trợ bạn

  • Dispatch.vim có thể được sử dụng để chạy các :makecông việc không đồng bộ.
  • Syntastic kiểm tra cú pháp Plugin nộp sau :write.
  • Ale.vim (Công cụ Lint không đồng bộ) là một plugin để cung cấp linting trong NeoVim và Vim 8 trong khi bạn chỉnh sửa các tệp văn bản của mình.
  • Unimpaired.vim giúp quản lý danh sách quickfix dễ dàng.
  • Đồng bằng cũ Makefiles. Trừ khi bạn ./script.shrất phức tạp, bạn có thể muốn xem xét sử dụng make. Nó có thể mở rộng quy mô thực hiện nhiều nhiệm vụ sau này và là một công cụ xây dựng phổ biến.
  • Bạn có thể sử dụng Vim Awesome để tìm kiếm nhiều plugin có thể giúp ích.

Phần kết luận

Cá nhân tôi tích hợp :makevà quickfix vào quy trình làm việc của riêng tôi. Tôi tin rằng việc nắm bắt đầu ra của quá trình xây dựng của bạn và nắm bắt các lỗi sẽ rất đáng để đầu tư. Là một phần thưởng bổ sung, bạn có thể sẽ trở nên thoải mái hơn với danh sách quickfix và có thể sử dụng danh sách cho các ứng dụng khác như thế nào :grep.

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

:h :make
:h quickfix
:h 'makeprg'
:h 'errorformat'
:h :compiler
:h :copen
:h :cwindow
:h :cnext
:h :cc

Tôi đã nghĩ về việc :maketrong khi tôi trả lời, nhưng tôi không bao gồm nó. Đó là một ý tưởng tốt hơn để sử dụng make fore biên dịch mọi thứ.
EvergreenTree

Làm thế nào để thay đổi autocmd để chỉ chạy makeprg trên một tệp nhất định.
Ibn Saeed
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.