Làm cách nào để tôi hoàn thành bash cho các bí danh lệnh?


57

Tôi đang tìm cách để hoàn thành tab trên các bí danh dòng lệnh của mình, ví dụ, nói rằng tôi đã xác định các bí danh sau:

alias apt-inst='sudo aptitude install'

Có cách nào để có được sự hoàn thành được cung cấp bởi năng khiếu khi tôi nhấn phím tab không? tức là khi tôi viết 'sudo aptitude install gnumer' và nhấn tab, aptitude hoàn thành việc này cho gnumeric hoặc nếu có sự không chắc chắn liệt kê tất cả các gói có sẵn bắt đầu bằng gnumer. Nếu tôi làm điều đó bằng bí danh của mình, không có gì - không hoàn thành.


Câu trả lời:


30

một chủ đề tuyệt vời về điều này trên các diễn đàn Ubuntu . Ole J đề xuất hàm định nghĩa hoàn thành bí danh sau:

function make-completion-wrapper () {
  local function_name="$2"
  local arg_count=$(($#-3))
  local comp_function_name="$1"
  shift 2
  local function="
    function $function_name {
      ((COMP_CWORD+=$arg_count))
      COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
      "$comp_function_name"
      return 0
    }"
  eval "$function"
  echo $function_name
  echo "$function"
}

Sử dụng nó để xác định hàm hoàn thành cho bí danh của bạn, sau đó chỉ định hàm đó làm hàm hoàn thành cho bí danh:

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst

Tôi thích sử dụng các bí danh để thêm các đối số luôn được sử dụng vào các chương trình hiện có. Chẳng hạn, với grep, tôi luôn muốn bỏ qua các thiết bị và tệp nhị phân, vì vậy tôi tạo bí danh cho grep. Để thêm các lệnh mới, chẳng hạn như grepbin, tôi sử dụng tập lệnh shell trong ~/binthư mục của mình . Nếu thư mục đó nằm trong đường dẫn của bạn, nó sẽ tự động hoàn thành.


2
Tuyệt vời, tôi sợ nó sẽ không thể.
levesque

Lưu ý mã này có một số vấn đề. Xem câu trả lời của tôi cho lời giải thích và giải quyết của họ.
Tom Hale

Lưu ý: Tôi đã sử dụng kỹ thuật này cho một lệnh khác và tôi phải sử dụng complete -o default -F ...thay vì complete -F ...để những thứ như tự động hoàn thành tên tệp hoạt động chính xác khi truyền args (Bash 4.3.46).
joelittlejohn

28

Hãy thử hoàn toàn bí danh , giải quyết chính xác vấn đề này.

Sau khi cài đặt, bạn có thể sử dụng một hàm chung để hoàn thành nhiều bí danh như thế này:

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>

Bạn có thể muốn tìm nguồn tệp Complete_alias trong mọi trường hợp bash thông qua .bash_profilehoặc tương tự.

cài đặt

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/bash_completion.sh \
     > ~/.bash_completion.d/complete_alias

ứng dụng

source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container

containerbây giờ có thể được tự động hoàn thành bởi _docker()trình xử lý hoàn thành ban đầu ;

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   

2
Cho rằng phần mềm này dường như là của bạn, bạn có thể làm tốt hơn thế này. Thêm hướng dẫn cài đặt nó. Mô tả những gì nó làm và làm thế nào để sử dụng nó. Nếu không thì đây chỉ là thư rác.
muru

@muru Tôi đã nghĩ đến việc dán một số mã ở đây nhưng có lẽ lâu hơn được chấp nhận ở đây. Tôi cho rằng mọi người không gặp vấn đề gì khi đọc phần Cài đặt trong tệp README và trong trường hợp này chỉ là một vài dòng.
Cyker

2
vấn đề là có thể đánh giá xem việc truy cập README có đáng hay không, chỉ từ câu trả lời.
muru

Đây là một câu trả lời đầy đủ và nó giải quyết vấn đề chính xác.
Ярослав Рахматуллин

1
Đây là một câu trả lời tuyệt vời và rất toàn diện hoạt động hoàn hảo, cảm ơn!. Có lẽ nó đã được cập nhật vì @muru có vấn đề với nó.
Brian đứng đầu

3

Câu trả lời năm 2018

Bạn phải thêm bí danh của mình vào chương trình 'hoàn thành'. Tùy thuộc vào loại tự động hoàn thành mà bạn muốn đạt được, bạn phải sử dụng -c hoặc -F.

Đối với gói tự động hoàn thành:

complete -c name_of_your_alias

Đối với tự động hoàn thành lệnh:

complete -F name_of_your_alias

Để kiểm tra xem bí danh của bạn đã được thêm chính xác chưa:

complete | grep name_of_your_alias

Cuối cùng, để xóa bí danh khỏi 'hoàn thành':

complete -r name_of_your_alias

Trong trường hợp của bạn:

complete -c apt-inst

1
Xin đừng tiếp tục câu trả lời của bạn trong ý kiến. Nếu bạn có điều muốn nói, hãy chỉnh sửa chúng thành câu trả lời.
G-Man nói 'Phục hồi Monica'

2
complete -F xxxkhông hoạt động trên OSX (Nó chỉ hiển thị cách sử dụng complete: usage: complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...]). Bạn có con trỏ nào không? Cảm ơn.
Anthony Kong

Sử dụng cái này thay thế: unix.stackexchange.com/questions/224227/ khăn
Giàu

2

Đây là mã từ câu trả lời của Shawn J. Goff với một số cải tiến:

  • Lỗi cú pháp cố định nhấn mạnh bởi shell-check, ví dụ như là người đầu tiên "của "$@"thực sự kết thúc chuỗi định nghĩa hàm.
  • Đã xóa return 0để giá trị trả về của hàm bên dưới có thể được trả lại cho người gọi.

.

# Wraps a completion function, eg for use with an alias.
# Usage:
# make-completion-wrapper <actual completion function> <name of new func.>
#                         <command name> <list supplied arguments>
# eg.
#   alias agi='apt-get install'
#   make-completion-wrapper _apt_get _apt_get_install apt-get install
#     # defines a function called _apt_get_install (that's $2) that will
#     # complete the 'agi' alias. 
#   complete -F _apt_get_install agi
function make-completion-wrapper {
  local function_name="$2"
  local arg_count=$(( $#-3 ))
  local comp_function_name="$1"
  shift 2
  local function="function $function_name {
      (( COMP_CWORD += $arg_count ))
      COMP_WORDS=( \"\$@\" \${COMP_WORDS[@]:1} )
      \"$comp_function_name\"
    }"
  eval "$function"
  # echo "$function"
}
export -f make-completion-wrapper

Không làm việc cho tôi trong Bash 4.3.46 Tôi sợ. Câu trả lời của Shaun J. Goff tác dụng.
joelittlejohn

1
"Kết thúc" chuỗi định nghĩa hàm là có chủ đích; điểm quan trọng là bao gồm các đối số từ hàm ngoài vào COMP_WORDSmảng. Nếu chúng ta sử dụng make-completion-wrapper _apt_get _apt_get_install apt-get installnhư một ví dụ, sau shift 2, $@có chứa apt-get install. Định nghĩa hàm bao gồm apt-get install(hai từ theo nghĩa đen) khi gán COMP_WORDS.
Jeffery đến

0

Là một phần mở rộng cho câu trả lời @Giles, chức năng tiện lợi sau đây tự động đặt tên cho trình bao bọc được tạo bởi make-completion-wrapperđể có thể xác định hoàn thành trong một dòng:

function complete-alias  {
    # uses make-completion-wrapper: https://unix.stackexchange.com/a/4220/50978
    # example usage
    # complete-alias _pass pshow pass show
    # complete-alias _pass pgen pass generate

    EXISTING_COMPLETION_FN=${1} && shift
    ALIAS=${1} && shift
    AUTOGEN_COMPLETION_FN="__autogen_completion_${ALIAS}"
    make-completion-wrapper ${EXISTING_COMPLETION_FN} ${AUTOGEN_COMPLETION_FN} ${*}
    complete -F ${AUTOGEN_COMPLETION_FN} ${ALIAS}
}
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.