prpsls
私はディレクトリにファイルを作成または編集するスクリプトを作成しました~/proposals
。
これで自動補完スクリプトを作成しており、クリックして次のように設定しようとしています。商標、現在の作業ディレクトリに関係なく、complete
ディレクトリ内のファイルとディレクトリを一覧表示する組み込み機能です。~/proposals
私が達成したい動作は私が行ったのとまったく同じですcomplete -f prpsls
が、現在のディレクトリのファイルとディレクトリを一覧表示するのではなく、常にディレクトリの内容を完了したいと思います~/proposals
。
たとえば、私が書くls
とき商標、次を示します。
$ pwd
/home/user/base_directory
$ ls
file_01 file_02 subdir_01/
私がsubd
書いた商標、次のように自動的に完了しますsubdir_01
。商標繰り返しますが、これが示すものですdir_01
:
$ ls subdir_01/
file_03 subdir_02/
私が探している行動は次のとおりです。
$ pwd
/home/user/any/directory/it/should/not/matter
$ prpsls # Tab here
proposal_01 proposal_02 job_01/
$ prpsls job_01/ # Tab again
proposal_03 proposal_draft
complete
私の質問は:組み込み機能でこの動作は可能ですか?そうでなければ、どのようにこの動作を達成できますか?
complete
デフォルトディレクトリとして使用するディレクトリをフラグで知ることができたらと思いますが、ディレクトリリストを生成する-d
whichと同じディレクトリ関連フラグのみが表示されます-A directory
。
興味深いことに、私がcompgen -f "~/proposals/"
使うならする次の場所のファイルとディレクトリのリスト~/proposals
:
$ pwd
/home/user/any/directory/it/should/not/matter
$ compgen -f "~/proposals/"
~/proposals/job_01
~/proposals/proposal_01
~/proposals/proposal_02
私は見たこれしかし、質問は次のとおりです。
- 許可された回答は、入れ子になったディレクトリでは機能しません。 (つまり商標ディレクトリの内容を表示します。)
- 答えは
CDPATH
他のコマンドにもっと混乱をもたらすでしょう。 - 答えは
compgen
ネストされたディレクトリでも機能しません。
答え1
に基づいてこの素晴らしい答えfoo
ファイルとディレクトリを再帰的に完成するコマンドに対して、次の完成を作成しました~/foodir
。
FOO_DIR=$HOME/foodir/
_foo_compgen_filenames() {
local cur="$1"
# Files, excluding directories:
grep -v -F -f <(compgen -d -P ^ -S '$' -- $FOO_DIR"$cur") \
<(compgen -f -P ^ -S '$' -- $FOO_DIR"$cur") |
sed -e 's|^\^'$FOO_DIR'||' -e 's/\$$/ /'
# Directories:
compgen -d -S / -- $FOO_DIR"$cur" | sed -e 's|'$FOO_DIR'||'
}
_foo_complete() {
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(_foo_compgen_filenames "$cur") )
}
complete -o nospace -F _foo_complete foo
秘密は、compgen
完成エンジンが完成からファイルへのフルパスを完了するようにしてFOO_DIR
から、FOO_DIR
完成からそのパスを送信する前に削除することですcomplete
。また、ディレクトリ名の末尾にスラッシュを追加する問題もあります。これは指定されておらず、compgen
ファイルのみを返す基本的な方法はありません(ただし、ディレクトリのみを返す方法は実際にはあります)。
答え2
私はそれを修正する方法についていくつかの方法とアイデアを試してみました。
専門家は私の方法を改善し、より良い/完璧なソリューションを作成できます。
私のシステムは、KDEとGNOMEを含むDebian GNU / Linux 10(buster)4.19.0-16-amd64です。
最初の部分:
新しいシェルの起動
作業ディレクトリを作成して
/home/user/ComBash
入力cd
します。mytab
コマンド全体にバインドするスクリプトを作成します。これで、
mytab
次のようになります。#!/bin/bash echo "MYTAB"
chmod +x mytab
px
完全なコマンド用の2番目のスクリプトの作成これで、
px
次のようになります。#/usr/bin/env bash echo "PX"
chmod +x px
px
それではスクリプトを始めましょう。source px
または
./px
または
. ./px
出力は「PX」でなければなりません(動作する)。
bin/
名前が次の新しいフォルダを作成します。/home/user/ComBash
mkdir bin
私たちのファイルは今
mytab | script px | script bin/ | folder
次に、workdirパス
mytab
にインストールして削除します。bin/
/home/user/ComBash/bin
mytab
/home/user/ComBash/
install mytab bin/mytab && rm mytab
次に、
bin/
workdir フォルダを追加します。$PATH
PATH="/home/user/ComBash/bin:${PATH}"
または
PATH="${PATH}:/home/user/ComBash/bin"
確認してください
echo $PATH
mytab
動作していることを確認してください。myt
+TABを押してEntermytab
~によるとEnter- 出力は「MYTAB」です(動作)。
フォルダ内にフォルダ、サブフォルダ、および空のファイルを作成します。TAB+が有効であることをTAB確認し、TAB | TABに表示される内容を確認するには、これらのフォルダとファイルが必要です。
これで、2番目の部分の構造が完成しました。ソリューションは現在のシェルでのみ機能します。
新しいシェルを閉じて起動すると/home/user/ComBash/bin
inが$PATH
削除され、bashはmytab
スクリプトを見つけることができません/home/user/ComBash/bin
。これにより、新しいシェルが起動するたびに手順9($ PATH設定)を繰り返す必要があります。
シェルを起動するたびに手順9を繰り返さない場合は、永久に追加できます/home/user/ComBash/bin
。$PATH
2番目の部分:
px
ファイルのオープンと編集私もこのコマンドをたくさん試しましたが、今は説明しません。結果を表示しようとします。試したい行のコメントを削除して編集します。
今pxは次のようになります:
#/usr/bin/env bash #complete -f mytab #complete -D -F "/home/user/ComBash" mytab #complete -W "$(find /home/user/ComBash/ -path "" -prune -o \( -type d -ls \) -o \( -type f -ls \) | cut -d/ -f 5-)" mytab #complete -W "$(find /home/user/ComBash/ -path "" -prune -o \( -type d -ls \) -o \( -type f -ls \) | cut -d/ -f 2- | sed 's/$/\//')" mytab #complete -W "$(find /home/user/ComBash/ -path "" -prune -o \( -ls \)))" mytab #complete -W "$(ls -R ${MYPATH} | grep /)" mytab MYPATH="/home/user/ComBash/" complete -W "$(ls -R ${MYPATH})" mytab
コマンド全体を
mytab
スクリプトにバインドします。-W
完全な単語リストを提供することを意味します。我々はとして単語のリストを取得します
ls -R
。ls -R
指定されたパスのすべてのファイル、サブファイル、ディレクトリ、およびサブディレクトリを一覧表示します。pxスクリプトを起動します
source px
スクリプト内に変更があるたびにスクリプトを再起動する必要があります(パート1のステップ6を参照)。
source px
今私たちが使うシェルから
mytab
+TAB/home/user/ComBash/
指定されたパス()内のすべてのファイル、サブファイル、ディレクトリ、およびサブディレクトリのリストを表示できます。すべてのファイル、サブファイル、ディレクトリ、およびサブディレクトリを選択し、[TAB]を使用してオートコンプリートできます。
有効なサブフォルダを選択して[TAB]を押します。
押すと、Enterスクリプトは
mytab
「MYTAB」をエコーします。mytab
でスクリプトを編集しましょう/home/user/ComBash/bin
。これで、
mytab
次のようになります。#!/bin/bash MYPATH=/home/user/ComBash # echo $MYPATH echo $1 DATA=$(find ${MYPATH} -name ${1}) echo $DATA ####### DO SOMETHING #######
$1
px
スクリプト検索で受け取ったフォルダやファイルを出力し、DATA
そのPATH
フォルダやファイルの内容を出力します。
これで、現在のファイルまたはフォルダに対して特定のタスクを実行できます。
mytab
+Tab押すEnter