টার্মিনালে ওপেন কমান্ডটি স্বয়ংক্রিয়ভাবে সম্পূর্ণ করার কোনও উপায় আছে?


16

আমি প্রায়শই open -a টার্মিনালে কমান্ডটি ssh এর মাধ্যমে অ্যাপ্লিকেশনগুলি খুলতে ব্যবহার করি । আমি কীভাবে এটি কোনও অ্যাপ্লিকেশনটির নাম স্বয়ংক্রিয়ভাবে পূর্ণ করব?


আপনি কোন শেল ব্যবহার করছেন?
ড্যানিয়েল বেক

2
আমি অনুমান করি যে একটি প্রান্তিক দ্রুততম উপায়টি পুরো পথটি টাইপ করা (কেবলমাত্র এখানে আমার জন্য কিছুক্ষণের জন্য যেতে হবে), যেমন open -a /Applications/Textedit.app foo.txt(আমি ধরে নিচ্ছি আপনি কী করতে চেষ্টা করছেন)। তোমার পরে ট্যাব টিপলে /Aএর /Applicationsপর আবার এবং তারপর ট্যাব /Teএর /Textedit.appতারপর যে আপনার জন্য দুটি অংশে স্বয়ংসম্পূর্ণ উচিত আপনি যান। আদর্শ নয়, আমি স্বীকার করি তবে সম্ভবত এটি তবে আরও ভাল। এটি ব্যাশ ব্যবহার করছিল।
বাইনারিবব

আপনি এই পোস্টের শেষে নির্দেশাবলী অনুসরণ করার চেষ্টা করতে পারেন: brettterpstra.com/grabbing-a-mac-apps-icon-advanced-bash-usage-2
ল্রি

পুনঃটুইট
ডেভিজেক

উত্তর:


9
_complete_open() {
        COMPREPLY=()
        local cur="${COMP_WORDS[$COMP_CWORD]}"
        local prev="${COMP_WORDS[COMP_CWORD-1]}"
        [[ "$cur" == -* || "$prev" != '-a' ]] && return
        apps="$(mdfind kMDItemKind==Application -onlyin /Applications -onlyin ~/Applications -onlyin /Developer -onlyin ~/Developer | grep -v '/.*/.*/.*/.*/' | sed -E 's|.*/||g;s|\.app$||g' | uniq)"$'Finder\nArchive Utility\nCharacterPalette\nKeyboardViewer'
        local IFS=$'\n'
        if [[ "${cur:0:1}" = '"' || "${cur:0:1}" = "'" ]]; then
            quote="${cur:0:1}"
            cur="${cur:1}"
        fi
        local found="$(grep -i "^$cur" <<< "$apps")"
        if [[ "$quote" == '"' ]]; then
            found="$(sed "s|^|\"|g;s|$|\"|g" <<< "$found")"
        elif [[ "$quote" == "'" ]]; then
            found="$(sed "s|^|'|g;s|$|'|g" <<< "$found")"
        else
            found="$(sed 's| |\\ |g' <<< "$found")"
        fi
        COMPREPLY=($found)
}

complete -o default -F _complete_open open

তৃতীয় সংস্করণ, যা এখন উভয় ক্ষেত্রে সংবেদনশীল হওয়া উচিত এবং উদ্ধৃতিগুলির মধ্যে কাজ করা উচিত।


আমি এই কাজ করতে পারে না DVD Player। কোন ধারণা কি ভুল? কোনও জায়গার পরিবর্তে একটি ট্যাব মনে হচ্ছে ...
ড্যানিয়েল বেক

@DanielBeck এটা অনুপস্থিত ছিল IFS=$'\n'। যাইহোক, আমি আবার উত্তর সম্পাদনা করেছি।
ল্রি

ভাল লাগছে। mdfindধারণার জন্য দেরী +1 । অপ্টিমাইজেশন এবং সংশোধন উপর দুর্দান্ত কাজ। CoreServicesযদিও সম্ভবত ব্যক্তিগত পছন্দ। nospaceযদিও কারণ কি ? যদি কেবল 1 টি প্রোগ্রাম থাকে তবে আমি খোলার জন্য ফাইলটি সঙ্গে সঙ্গেই চালিয়ে যেতে চাই। শুধু ব্যক্তিগত পছন্দ? বাকী উদ্ধৃতি ইস্যু সম্পর্কে কোন ধারণা? আফিক্স, সঠিক সমাধানের জন্য এটাই একমাত্র জিনিস।
ড্যানিয়েল বেক

@ ড্যানিয়েলবেক আমি সর্বদা -aপতাকাটি শেষে রেখেছি, তাই আমার ধারণা -o nospaceকেবল ব্যক্তিগত পছন্দ। সম্ভবত আমাদের ব্রেট টেরপস্ট্রার বা এই নার্ফেস্ট শেষ করার জন্য কিছু পিং করা উচিত ...
ল্রি

তোমাকে অনেক ধন্যবাদ!! @ ড্যানিয়েলবেক আপনিও আমি গতির কারণে লির সংস্করণটি বেছে নিয়েছি। দুর্ভাগ্যক্রমে, আপনার কিছুটা ধীর ছিল। আপনাকে উভয় ধন্যবাদ! আপনি আমাকে অনেক সাহায্য করেছেন এবং আমার টার্মিনাল গতি বৃদ্ধি করেছেন।
ডেভিজেক

7

আপনার টু নিম্নলিখিত যোগ করুন .bash_profileবা .bashrcএকটি নতুন অধিবেশন আরম্ভ:

function _complete_open {
    cur=$2
    COMPREPLY=( );

    [[ "$COMP_WORDS" = "open" ]] || return
    [[ "${COMP_WORDS[ $(( $COMP_CWORD - 1 )) ]}" = "-a" ]] || return

    OLDIFS="$IFS"
    IFS=$'\n'
    local _part="${COMP_WORDS[$COMP_CWORD]}"

    if [[ "${_part:0:1}" = '"' || "${_part:0:1}" = "'" ]] ; then
        COMPREPLY=( $( compgen -W "$( mdfind kMDItemKind==Application | sed -e 's|.*/||g' -e 's|.app$||' | sort -u )" -- $cur ) )
    else
        COMPREPLY=( $( compgen -W "$( mdfind kMDItemKind==Application | sed -e 's|.*/||g' -e 's|.app$||' -e 's| |\\\\ |g' | sort -u )" -- $cur ) )
    fi
    IFS="$OLDIFS"
}

complete -o default -F _complete_open open

কিছু ইনস্টল করার প্রয়োজন নেই। এটি bashবক্সের বাইরে কাজ করে ।


পূর্ববর্তী বিকল্পটি -aহলে এবং অন্যথায় পূর্বনির্ধারিত আচরণ প্রদর্শন করা হলে এটি কেবলমাত্র স্বয়ংক্রিয়রূপে প্রোগ্রামের নামগুলি বন্টন করবে , উদাহরণস্বরূপ বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের একটি তালিকা ফেরত দিন বা বর্তমান পথের উপসর্গটি সম্পূর্ণ করুন।

ফলাফলগুলি উত্পন্ন হয়েছে system_profiler SPApplicationsDataType, যা আপনার সিস্টেমে এইভাবে চালু করা যেতে পারে এমন সমস্ত অ্যাপ্লিকেশন পাওয়ার সহজতম উপায় । তালিকাটি কেবলমাত্র প্রোগ্রামের নামগুলি ফিরিয়ে আনতে প্রক্রিয়া করা হয়, এতে স্পেস থাকতে পারে এবং বান্ডিলের নামগুলি থেকে পৃথক হতে পারে ( .appপ্রত্যয় উপেক্ষা করার পরেও )

ব্যবহার: টাইপ করুন open -a, একটি স্থান অনুসরণ করুন, তারপরে টিপুন Tabবা Esc(আমার সিস্টেমে দু'বার, এটি সর্বত্র আছে কিনা তা নিশ্চিত নয়)।

আমার স্ক্যানারের জন্য সমস্ত সহায়ক অ্যাপ্লিকেশন দেখানোর উদাহরণ:

$ open -a Scan
Scan to E-mail          Scan to Excel           Scan to Folder          Scan to Print           Scan to Searchable PDF  Scan to Word            ScanSnap Manager

এই সমাধানের ত্রুটি এবং সমস্যাগুলি:

  • আপনার সিস্টেমে এমন অনেকগুলি প্রোগ্রাম রয়েছে যা আপনি হয়ত জানেন না, যেমন সমস্ত কিছুর মতো /System/Library/CoreServices। আপনি তাদের সমস্ত তালিকা করতে চান না। ওও, উদাহরণস্বরূপ CharacterPaletteবা KeyboardViewerএইভাবে দেখা এবং লঞ্চ করা সত্যিই সহজ । * যুক্তি mdfindদিয়ে কল (গুলি) যথাযথভাবে কনফিগার করুন -onlyin

  • এটা ধীর ধরণের, কারণে system_profiler SPApplicationsDataType। সম্পূর্ণ হওয়ার আগে আপনার দ্বিতীয় বা দুটি অপেক্ষা করতে হতে পারে। এখন mdfindদ্রুত প্রোগ্রামগুলি পেতে ব্যবহার করে। ধন্যবাদ @ লরি

  • এটি প্রয়োগের নাম এবং কোটেশনটি বদ্ধ প্রোগ্রামের নামগুলিতে ফাঁকা স্থান পরিচালনা করতে পারে, তবে এটি বরং হ্যাকি। এটিতে প্রথম চরিত্রটি হওয়া উচিত: এটিতে Scan" to "Pবৈধ থাকা অবস্থায় bash, এই প্রোগ্রামটি এটি সনাক্ত করবে না। সম্পূর্ণরূপে একটি পালানো স্থান পরে কাজ করে না (উদাহরণস্বরূপ Scan\ to), এই জাতীয় ক্ষেত্রে ( "Scan to) উদ্ধৃতি চিহ্ন ব্যবহার করুন । পলান শূণ্যস্থান জন্য সমর্থন সম্পূর্ণ করতে শুধুমাত্র ভাল DVDকরার DVD\ Player


mdfind 'kMDItemKind==Application'দ্রুত হবে না ? যদি completion-ignore-caseসেট করা থাকে, গ্রেপকে সম্ভবত কেসটিকেও উপেক্ষা করা উচিত।
Lri

@ লরি আপনি ঠিক বলেছেন এমন কোনও ফলাফল খুঁজে পাওয়া যায় নি যেখানে এই ফলাফলগুলির মধ্যে পার্থক্য হত।
ড্যানিয়েল বেক

3

প্রোগ্রামেবল অটোকম্প্লেশন থেকে উদ্ধার! যদিও বাশ কমপ্লিমেশন হোমপৃষ্ঠা থেকে প্রচুর অনুলিপি থাকা দরকার , যা প্রচুর পরিমাণে স্বয়ংক্রিয়-সমাপ্তির যাদুতে ইনস্টল করার পক্ষে উপযুক্ত। যদি আপনি এটি করেন তবে আপনার কেবলমাত্র শেষ ফাংশন ( _open) এবং নীচে থেকে প্রারম্ভিক কমান্ডের প্রয়োজন হবে ।

নিম্নলিখিতগুলিতে এতে যুক্ত করুন .bashrc:

# taken from http://bash-completion.alioth.debian.org/

_compopt_o_filenames()
{
    # We test for compopt availability first because directly invoking it on
    # bash < 4 at this point may cause terminal echo to be turned off for some
    # reason, see https://bugzilla.redhat.com/653669 for more info.
    type compopt &>/dev/null && compopt -o filenames 2>/dev/null || \
        compgen -f /non-existing-dir/ >/dev/null
}

_tilde() {
    local result=0
    # Does $1 start with tilde (~) and doesn't contain slash (/)?
    if [[ ${1:0:1} == "~" && $1 == ${1//\/} ]]; then
        _compopt_o_filenames
        # Try generate username completions
        COMPREPLY=( $( compgen -P '~' -u "${1#\~}" ) )
        result=${#COMPREPLY[@]}
    fi
    return $result
}

_quote_readline_by_ref()
{
    if [[ ${1:0:1} == "'" ]]; then
        if [[ ${BASH_VERSINFO[0]} -ge 4 ]]; then
            # Leave out first character
            printf -v $2 %s "${1:1}"
        else
            # Quote word, leaving out first character
            printf -v $2 %q "${1:1}"
            # Double-quote word (bash-3)
            printf -v $2 %q ${!2}
        fi
    elif [[ ${BASH_VERSINFO[0]} -le 3 && ${1:0:1} == '"' ]]; then
        printf -v $2 %q "${1:1}"
    else
        printf -v $2 %q "$1"
    fi

    # If result becomes quoted like this: $'string', re-evaluate in order to
    # drop the additional quoting.  See also: http://www.mail-archive.com/
    # bash-completion-devel@lists.alioth.debian.org/msg01942.html
    [[ ${!2:0:1} == '$' ]] && eval $2=${!2}
} # _quote_readline_by_ref()

_filedir()
{
    local i IFS=$'\n' xspec

    _tilde "$cur" || return 0

    local -a toks
    local quoted tmp

    _quote_readline_by_ref "$cur" quoted
    toks=( ${toks[@]-} $(
        compgen -d -- "$quoted" | {
            while read -r tmp; do
                printf '%s\n' $tmp
            done
        }
    ))

    if [[ "$1" != -d ]]; then
        # Munge xspec to contain uppercase version too
        [[ ${BASH_VERSINFO[0]} -ge 4 ]] && \
            xspec=${1:+"!*.@($1|${1^^})"} || \
            xspec=${1:+"!*.@($1|$(printf %s $1 | tr '[:lower:]' '[:upper:]'))"}
        toks=( ${toks[@]-} $( compgen -f -X "$xspec" -- $quoted) )
    fi
    [ ${#toks[@]} -ne 0 ] && _compopt_o_filenames

    COMPREPLY=( "${COMPREPLY[@]}" "${toks[@]}" )
} # _filedir()

# only the following is needed if bash-autocompletion is already installed
_open ()
{
    local cur;

    cur=$2;

    COMPREPLY=();
    if [ $COMP_CWORD -eq 2 ]; then
        COMPREPLY=($(compgen -W "$(/bin/ls /Applications)" -- $cur ));
        return 0
    fi

    _filedir
}

complete -F _open open

সুতরাং আমি ইনস্টল নির্দেশাবলী অনুসরণ এবং কোড যুক্ত .bashrc। এখন আমি কীভাবে এটি স্বতঃপূরণ করব? আমি স্বতঃপূরণে কী চাপ দিই? (দুঃখিত, আমি কোডটি পড়তে পারি না)
ডেভিজেক

1
স্পেস (যেমন DVD Player.app) এর সাথে প্রোগ্রামের নামগুলি পরিচালনা করে না । ডিরেক্টরিগুলিও /Applicationsপাশাপাশি তালিকাভুক্ত করে ( iWork 09যেমন পৃথক এন্ট্রি হিসাবে iWorkএবং 09) তবে এতে থাকা প্রোগ্রামগুলি নয়।
ড্যানিয়েল বেক

1

এটি অবশ্যই Zsh শেলের সাথে ডিফল্টরূপে সক্ষম হয় , যতক্ষণ না আপনি নিজেরাই সম্পূর্ণ করার পরে অবশ্যই সক্ষম হন। জেডএস ওএস এক্স-এ অন্তর্ভুক্ত রয়েছে

আপনাকে যা করতে হবে তা autoload -Uz compinit; compinitআপনার ~ / .zshrc এ স্থাপন করতে হবে, বা প্রথম রান কনফিগারেশন মেনুয়ের মাধ্যমে সম্পূর্ণকরণ সক্ষম করতে হবে।

Zsh আসলে বেশিরভাগই বাশের সুপারস্টার, তাই আপনাকে নতুন কিছু শিখতে হবে না। এমনকি আপনার স্ক্রিপ্টগুলি সম্ভবত কাজ করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.