bash completion leszedi a '\'-t

Fórumok

Hello,

azzal próbálkozom, hogy '#<ticket>-<leírás>' nevű git brancheket használjak egy új projektben. A branchet meg is tudom csinálni ezzel a paranccsal:


$ git checkout -b \#1431-gui_prototype

Viszont ha átváltok egy másik branchre és vissza akarok váltani így:


$ git checkout \#1431<TAB>

akkor a branch név kiegészül ugyan, de a '\' eltűnik, és ezt kapom:


$ git checkout #1431-gui_prototype

Ami természetesen nem vált át a branchre. Próbálkoztam az idézőjelekkel is (egyszeres és kettős), a tabra szépen kiegészítette a branch nevet, és le is zárta az idézőjelet, de a záró elé odabiggyesztett egy szóközt:


$ git checkout '#1431-gui_prototype '

ami persze tönkrevágta az egészet.

Van valakinek ötlete?

Köszi
Miklós

Hozzászólások

Ez egy eleg regi bugja a bash completion-nek, en leszoktam a specialis karaktert tartalmazo nevu branchekrol/fajlokrol/whateva.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Rövid válasz: ne csinálj ilyesmit ;)

A \-t a Bash, pontosabban a compgen nyeli le:

$ compgen -W '#1432-gui_prototype' -- "\#"
#1432-gui_prototype

Nem tudom, hogy ez bug-e vagy feature, se azt, hogy hogyan lehetne megkerülni.

A záró szóköz szándékos, mert a userek egy opció/ref/akármi kiegészítése után sokszor még folytatni akarják a parancssort további opciókkal/refekkel/akármikkel, amihez az automatikusan hozzáfűzött szóköz jól jön. Annyit mondjuk lehetne javítani a helyzeten, hogy ha a kiegészítendő szó egyszeres vagy kétszeres idézőjelekkel kezdődik, akkor ezt a záró szóközt el lehet hagyni, az idézőjelet meg majd a Bash bezárja.

Quick'n'dirty patch alant,

git checkout '#<TAB>

működni látszott, de fogalmam sincs, hogy milyen nem kívánt, feltehetően káros mellélhatása lehet. De továbbra is azt mondom, hogy ne csinálj ilyet.

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 9f56ec7a..790f684b 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -509,7 +509,13 @@ __gitcomp ()
 __gitcomp_nl ()
 {
 	local IFS=$'\n'
-	COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
+	local suffix="${4- }"
+	if [ "$suffix" = " " ]; then
+		if [ -z "${cur%%\'*}" -o -z "${cur%%\"*}" ]; then
+			suffix=""
+		fi
+	fi
+	COMPREPLY=($(compgen -P "${2-}" -S "$suffix" -W "$1" -- "${3-$cur}"))
 }
 
 __git_heads ()

Köszi a patchet!

Próbáltam módosítani egy picit, hogy a szóközt a záró idézőjel után rakja, de minden naiv próbálkozásom elbukott. Nagyon kínai ez nekem. :)

Az a furcsa, hogy ugyanez tökéletesen működik a fájlnevekre, pl. az ls paranccsal. Ha idézőjelet használok, lezárja és a szóközt a záró *után* teszi. Megy a backslash is, sőt, ha nem teszem ki, akkor a kiegészítés után odarakja. Ahogy azt kell.

Biztos voltam benne, hogy lesz nem kívánt káros mellékhatás... Dehát valamit valamiért ;)

A fenti patch által hozzáadott

suffix=""

után egy

compopt +o nospace

orvosolni látszik a problémát, feltéve, hogy olyan kellően új Bash-ed van, ami már tud compopt-ot (Linuxon jó eséllyel, ellenben msysgit nem tud).

Van egy tippem, de nem tudom kipróbálni:
A \ karakter ugye escape karakter, lehet, hogy valahol valaki azért nyeli le, mert úgy gondolja, hogy a \# az a #. Szóval ha így van, akkor \\-ből pedig \ lesz. Szóval én a helyedben kipróbálnám, hogy mi történik, ha \\#-ot írsz az elejére...