シェルプロンプトの現在のディレクトリを短縮しますか?


23

vim 少し長いときにパスで利用する本当に素晴らしい機能があります:

ここに画像の説明を入力してください

上部のタブにあるドキュメントへのパスを短縮します。私のbashプロンプトがこのように見えないように、これに似た何かをする方法があります:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
だから、あなたが欲しいのはrfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ 何ですか?理想的には、最大プロンプト長のしきい値を使用しますか?
nicerobot

まさにそれが私が探しているものです。
ナフトゥリケイ

OK、答えを提供しました。
nicerobot

回答:


14

これを試してください:

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

または、純粋なbash:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

それから

PS1='\u@\h ${PS1X} $ '

~forに注意してください${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

@enzotibのおかげで答えを改善しました


1
これが後世のためのプロンプトとしてどのように見えるかの例を提供できますか?
ナフトゥリケイ

(0)githubリンクが壊れています。(1)$PWD~テストを詳しく調べてください。場合は、現在、HOMEある/home/edPWDされ/home/edwina、あなたが得る~winaPerlのバージョンでと~/inaシェルバージョンで。(2)現在のディレクトリにワイルドカード(パス名の展開)文字が含まれている場合、シェルコードは停止します。例えば、PWD= /abc/*/def。これを修正するには、set -o noglobまたはを追加しset -fます。…(続き)
G-Manは「Reinstate Monica」と言います

(続き)…(3)ほとんど中括弧は必要ありません。Perlコマンド$HOME(二重引用符内)で$PWD十分です。シェルコマンドでは、最後の3つのシェル変数の参照が細かいですが、最初の3つはすることができ"${PWD#$HOME}""$PWD""$p"。(4)mbentleyの回答とそのコメントも参照してください。
G-Manが「Reinstate Monica」と言う

15

@nicerobotの回答に似ていますが、やや短いです:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

これにより、次の出力例が表示されます。

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$

13

PROMPT_DIRTRIMはbashが好きです...

export PROMPT_DIRTRIM=2

例のプロンプトを...に変更します

rfkrocktk@work-laptop ../com/tkassembled/ $

わたしにはできる。


彼が尋ねたことはしませんが、機能を知らせてくれてありがとう。
nicerobot

3
@nicerobotええ、本当の答えがありました。:)私はそれが彼が求めていた略語を与えていないことを知っていますが、しばしば単純なオプションを見たとき、私たちの期待は変わります。また、それは標準であり、そのため、言及に値すると感じました。
BentFX

1
SEの機能の1つは、質問に対する完全な答えを提供するだけでなく、OPや検索を通じて質問を見つけた他の人に他のオプションを提供することでもあると感じています。私が提供した回答コンテキストに注目してください。それでも、一部の人は、それが反対票に値すると考えています。
BentFX

質問に直接回答しない回答が投票で下がっているのを見る傾向がありますが、選択肢を提供することは有効な回答または回答になり得ることに同意します。
nicerobot

BentFXの答えはOPの質問全体に答えるのではなく、正確に件名に答えます。シェルプロンプトの省略された現在のディレクトリ?これはおそらく、このトピックのほとんどの訪問者がまさに探しているものです。
TNT 14

4

enzotibの答えに追加すると、次のスニペットは次のようになります。

  1. に変換/Path/To/Your/Home/します~/(したがって、パスはの~/a/b/c代わりになります/P/T/Y/H/a/b/c
  2. ドットのみを表示する代わりに、「ドットファイル」の最初の文字を使用します(/a/./c/dになります/a/.b/c/d)。

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

必ず一重引用符を使用してください。そうしないと、bashは早まってそれを展開します。


3

で使用する形式PS1\W(manページのPROMPTINGセクションをbash参照)です。

PS1="\u@\h \W\$ "

そして、そこにある他のオプションを読みたいと思うかもしれません。あなたのコマンドラインでいくつかのクールなことができます。


2
\ Wは彼が何を求めているかではまったくないと思います。
nicerobot

1
@nicerobotパスのすべてのコンポーネントの最初のイニシャルは提供しませんが、現在の作業ディレクトリはより短い方法で提供します。各プロンプトを実行するかなりratherいスクリプトを使用せずに、そのようにディレクトリを短縮することは不可能だと確信しています。これについて彼が何と言っているか見ていきます。
ケビン

1

nicerobotの例の出力は気に入っていますが、1つの問題が見つかりました。ハイフンを含むディレクトリがあり、それが現在の作業ディレクトリだったときの引数としてA-E見てい-Eましたprintf。これを修正する--ために、最後printfに追加し、出力するものがない場合に備えて、出力の周りに引用符を追加しました。

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"

(1)-2番目の文字として含まれるディレクトリ名の問題をよくキャッチします。がで--始まる引数の問題の一般的な解決策であるのは事実ですが-、のより良い方法printfprintf "%s" "${q:1}"、を含む引数からも保護するためです%。(たとえば、してみてくださいPWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def(2)nicerobotの答えにも、私のコメントを参照してください。。
G-マンが「回復モニカ言う
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.