2015-11-17 26 views
5

Mục tiêu của Makefile có sẵn bằng cách hoàn thành trên Linux nhưng, AFAICS, không phải trên Mac OS (10.8.5).Tự động hoàn thành Makefile trên Mac

Có thể hoàn thành công việc với hệ điều hành này không?

+1

Bạn cần phải nhìn thấy nếu bạn có thể tìm thấy (cài đặt và/hoặc cho phép) hoàn thành bash approprate trên máy của bạn. Tôi không biết nếu những con tàu với OS X hoặc có sẵn thông qua brew hoặc bất cứ điều gì như thế mặc dù. –

+0

@EtanReisner Tôi đã đề cập đến việc hoàn thành trên Mac OS 10.8, ví dụ: 'cd'. Do đó tôi đoán một số hoàn thành bash đã có sẵn trên máy tính. –

Trả lời

13

này dường như để đạt được sự hoàn tất bash đơn giản đối với tôi trên El Capitan:

# .bashrc 
function _makefile_targets { 
    local curr_arg; 
    local targets; 

    # Find makefile targets available in the current directory 
    targets='' 
    if [[ -e "$(pwd)/Makefile" ]]; then 
     targets=$(\ 
      grep -oE '^[a-zA-Z0-9_-]+:' Makefile \ 
      | sed 's/://' \ 
      | tr '\n' ' ' \ 
     ) 
    fi 

    # Filter targets based on user input to the bash completion 
    curr_arg=${COMP_WORDS[COMP_CWORD]} 
    COMPREPLY=($(compgen -W "${targets[@]}" -- $curr_arg)); 
} 
complete -F _makefile_targets make 

Dưới đây là cách hoạt động:

  • hoàn -F [tên hàm] [lệnh name] - - nội trang bash này đăng ký hoàn thành mới cho [tên lệnh] được tạo bởi hàm bash [tên hàm]. Vì vậy, trong mã của tôi ở trên, nếu bạn nhập make [TAB][TAB] vào trình bao, bạn sẽ kích hoạt hàm _makefile_targets().

  • nếu [[-e "$ (pwd)/Makefile"]]; sau đó - đảm bảo có một Makefile trong thư mục hiện tại, nếu không, đừng thử hoàn thành bash.

  • grep -oE '^ [a-zA-Z0-9 _-] +:' Makefile - lọc mỗi dòng của Makefile sử dụng regex cho một tên mục tiêu như "thử nghiệm:". -o có nghĩa là chỉ trả lại một phần của dòng phù hợp. Ví dụ: với mục tiêu Makefile như "test: build package", chỉ "test:" sẽ được trả lại

  • | sed 's /: //' - lấy kết quả grep, xóa dấu hai chấm từ cuối dòng

  • | tr '\ n' '' - Smoosh tất cả các mục tiêu trên một dòng, ngăn cách bởi một không gian

Bên trong một chức năng hoàn bash, complete bộ một số biến môi trường cho bạn. COMP_WORDS là một danh sách các bash hoàn thành có sẵn dựa trên những gì người dùng đã nhập. COMP_CWORD là chỉ mục của từ được chọn hiện tại.

Một nội trang dựng sẵn rất huyền diệu compgen sẽ lấy danh sách các khoảng trống riêng biệt và lọc chúng bằng từ hiện được chọn. Tôi không hiểu rõ cách thức hoạt động. Vì vậy, dòng dưới cùng là hai dòng cuối cùng trong hàm lọc danh sách các mục tiêu makefile của chúng tôi (được lưu trữ bên trong $targets) và đẩy chúng vào một mảng COMPREPLY. Hoàn thành bash đọc và hiển thị COMPREPLY làm lựa chọn trong trình bao.


Lấy cảm hứng từ:

  1. https://gist.github.com/tlrobinson/1073865
  2. http://www.thegeekstuff.com/2013/12/bash-completion-complete/ (Esp 9.)
+0

Tôi đoán việc thêm '.bashrc' vào một dòng tương tự với' makefile' thay vì 'Makefile' là đủ để tính các tệp makefiles với tên viết thường (ngay cả khi tên viết hoa là thực hành tốt hơn). –

+1

@ DenisBitouzé yes! Có khá nhiều tiềm năng làm cho makefiles tùy thuộc vào hệ điều hành của bạn. – Rustavore

Các vấn đề liên quan