bash_completion i java

Potrzebujesz pomocy z C, C++, perl, python, itp.
daro
Posty: 11
Rejestracja: 30 września 2007, 22:13
Lokalizacja: Miñsk Mazowiecki

bash_completion i java

Post autor: daro »

Może przedstawię jak działało uzupełnianie wcześniej:

Kod: Zaznacz cały

java p[tab]
java paczka.[tab]
java paczka.HelloWorld
Czyli bash uzupełniał mi ładnie i ułatwiał robienie czegokolwiek. Teraz jedyne co potrafi uzupełnić to polecenie java...

W ~/.bashrc jest

Kod: Zaznacz cały

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi
a po wydaniu

Kod: Zaznacz cały

complete|grep java
complete -o filenames -F _java java
complete -o filenames -F _javac javac
complete -o filenames -F _javadoc javadoc
Więc z tego co rozumiem powinno działać, ale niestety tak nie jest...

Kod: Zaznacz cały

cat /etc/debian_version
squeeze/sid
Jeśli wybrałem zły dział przepraszam :)
xenix_org
Posty: 69
Rejestracja: 03 maja 2009, 12:25
Lokalizacja: Siedlce

Post autor: xenix_org »

Wydaj polecenie jako root i powinno być po temacie:

Kod: Zaznacz cały

echo './etc/bash_completion' >> ~/.bashrc
Za uzupełnianie odpowiada plik /etc/bash_completion

[ Dodano: 2009-05-16, 10:38 ]
na końcu pliku /home/uzytkownik/.bashrc można jeszcze dodać:

Kod: Zaznacz cały

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi
Sprawdź czy masz w /etc/bash_completion:

Kod: Zaznacz cały

# Java completion
#

# available path elements completion
have java && {
_java_path()
{
	cur=${cur##*:}
	_filedir '@(jar|zip)'
}

# exact classpath determination
_java_find_classpath()
{
	local i

	# search first in current options
	for (( i=1; i < COMP_CWORD; i++ )); do
		if [[ "${COMP_WORDS[i]}" == -@(cp|classpath) ]]; then
			classpath=${COMP_WORDS[i+1]}
			break
		fi
	done

	# default to environment
	[ -z "$classpath" ] && classpath=$CLASSPATH

	# default to current directory
	[ -z "$classpath" ] && classpath=.
}

# exact sourcepath determination
_java_find_sourcepath()
{
	local i

	# search first in current options
	for (( i=1; i < COMP_CWORD; i++ )); do
		if [[ "${COMP_WORDS[i]}" == -sourcepath ]]; then
			sourcepath=${COMP_WORDS[i+1]}
			break
		fi
	done

	# default to classpath
	[ -z "$sourcepath" ] && _java_find_classpath
	sourcepath=$classpath
}

# available classes completion
_java_classes()
{
	local classpath i

	# find which classpath to use
	_java_find_classpath

	# convert package syntax to path syntax
	cur=${cur//.//}
	# parse each classpath element for classes
	for i in ${classpath//:/ }; do
		if [ -r $i ] && [[ "$i" == *.@(jar|zip) ]]; then
			if type zipinfo &> /dev/null; then
				COMPREPLY=( "${COMPREPLY[@]}" $( zipinfo -1 \
				"$i" | grep "^$cur" | grep '\.class$' | \
				grep -v "\\$" ) )
			else
				COMPREPLY=( "${COMPREPLY[@]}" $( jar tf "$i" \
				"$cur" | grep "\.class$" | grep -v "\\$" ) )
			fi

		elif [ -d $i ]; then
			i=${i%/}
			COMPREPLY=( "${COMPREPLY[@]}" $( find "$i" -type f \
			-path "$i/$cur*.class" 2>/dev/null | \
			grep -v "\\$" | sed -e "s|^$i/||" ) )
		fi
	done

	# remove class extension
	COMPREPLY=( ${COMPREPLY[@]%.class} )
	# convert path syntax to package syntax
	COMPREPLY=( ${COMPREPLY[@]//\//.} )
}

# available packages completion
_java_packages()
{
	local sourcepath i

	# find which sourcepath to use
	_java_find_sourcepath

	# convert package syntax to path syntax
	cur=${cur//.//}
	# parse each sourcepath element for packages
	for i in ${sourcepath//:/ }; do
		if [ -d $i ]; then
			COMPREPLY=( "${COMPREPLY[@]}" $( command ls -F -d \
				$i/$cur* 2>/dev/null | sed -e 's|^'$i'/||' ) )
		fi
	done
	# keep only packages
	COMPREPLY=( $( echo "${COMPREPLY[@]}" | tr " " "\n" | grep "/$" ) )
	# remove packages extension
	COMPREPLY=( ${COMPREPLY[@]%/} )
	# convert path syntax to package syntax
	cur=${COMPREPLY[@]//\//.}
}

# java completion
#
_java()
{
	local cur prev i

	COMPREPLY=()
	cur=`_get_cword`
	prev=${COMP_WORDS[COMP_CWORD-1]}

	for ((i=1; i < $COMP_CWORD; i++)); do
		case ${COMP_WORDS[$i]} in
		    -cp|-classpath)
			((i++))	# skip the classpath string.
			;;
		    -*)
			# this is an option, not a class/jarfile name.
			;;
		    *)
			# once we've seen a class, just do filename completion
			_filedir
			return 0
			;;
		esac
	done

	case $prev in
		-@(cp|classpath))
			_java_path
			return 0
			;;
	esac

	if [[ "$cur" == -* ]]; then
		# relevant options completion
		COMPREPLY=( $( compgen -W '-client -hotspot -server -classic \
				-cp -classpath -D -verbose -verbose:class \
				-verbose:gc -version:jni -version \
				-showversion -? -help -X -jar \
				-ea -enableassertions -da -disableassertions \
				-esa -enablesystemassertions \
				-dsa -disablesystemassertions ' -- $cur ) )
	else
		if [[ "$prev" == -jar ]]; then
			# jar file completion
			_filedir jar
		else
			# classes completion
			_java_classes
		fi
	fi
}
complete -F _java $filenames java
}

# javadoc completion
#
have javadoc &&
_javadoc()
{
	COMPREPLY=()
	local cur prev

	cur=`_get_cword`
	prev=${COMP_WORDS[COMP_CWORD-1]}

	case $prev in
		-@(overview|helpfile|stylesheetfile))
			_filedir
			return 0
			;;
		-d)
			_filedir -d
			return 0
			;;
		-@(classpath|bootclasspath|docletpath|sourcepath|extdirs))
			_java_path
			return 0
			;;
	esac

	if [[ "$cur" == -* ]]; then
		# relevant options completion
		COMPREPLY=( $( compgen -W '-overview -public -protected \
				-package -private -help -doclet -docletpath \
				-sourcepath -classpath -exclude -subpackages \
				-breakiterator -bootclasspath -source -extdirs \
				-verbose -locale -encoding -J -d -use -version \
				-author -docfilessubdirs -splitindex \
				-windowtitle -doctitle -header -footer -bottom \
				-link -linkoffline -excludedocfilessubdir \
				-group -nocomment -nodeprecated -noqualifier \
				-nosince -nodeprecatedlist -notree -noindex \
				-nohelp -nonavbar -quiet -serialwarn -tag \
				-taglet -tagletpath -charset -helpfile \
				-linksource -stylesheetfile -docencoding' -- \
				$cur ) )
	else
		# source files completion
		_filedir java
		# packages completion
		_java_packages
	fi
} &&
complete -F _javadoc $filenames javadoc
daro
Posty: 11
Rejestracja: 30 września 2007, 22:13
Lokalizacja: Miñsk Mazowiecki

Post autor: daro »

xenix_org pisze:Wydaj polecenie jako root i powinno być po temacie:

Kod: Zaznacz cały

echo './etc/bash_completion' >> ~/.bashrc
Za uzupełnianie odpowiada plik /etc/bash_completion
Wydawanie tego jako root? Rootowi to nie potrzebne tylko mnie, ale nieważne bo już mam:

Kod: Zaznacz cały

if [ -f /etc/bash_completion ]]
A w /etc/bash_completion mam wszystko tak jak powinno być bo nie dotykałem się do tego pliku i zgadza się z tym co wkleiłeś.
xenix_org
Posty: 69
Rejestracja: 03 maja 2009, 12:25
Lokalizacja: Siedlce

Post autor: xenix_org »

To zostaje tylko dodanie do bash_completion tego co Ci potrzeba.
daro
Posty: 11
Rejestracja: 30 września 2007, 22:13
Lokalizacja: Miñsk Mazowiecki

Post autor: daro »

xenix_org pisze:To zostaje tylko dodanie do bash_completion tego co Ci potrzeba.
Jakbym wiedział co potrzebuję żeby mi działało to bym nie zakładał tematu.
W ~/.bashrc mam tak jak być powinno, w /etc/bash_completion też jest to co powinno być.
ODPOWIEDZ