open C# scripts on Linux in native monodevelop

Linux? Did I read it right?

Hell yeah! I have been using Unity on arch linux for some time and there’s a great script available that automates the installation and handles workarounds for errors.

But, I couldn’t get C# autocompletion in any text editor the way I was used to in monodevelop so I wrote the script below that formats parameters (*-csharp.sln, filename.cs, fileline) in a way monodevelop can handle.

Test and let me know how it goes, good luck!

~Radivarig

Once you install your Unity on Linux:

  • save this script as unity3d_native_monodevelop.sh
  • this is a bash script, give it execution permission with chmod +x unity3d_native_monodevelop.sh
  • open Unity and go to Edit>Preferences>ExternalEditor and select this script
  • put "$(File)" $(Line) as parameters

That’s it!

#!/bin/bash
if [ -z "$1" ]; then exit 1; fi

if [ "$1" == "--nologo" ]
then
    WIN_FILE_PATH="${3%;*}"
    FILE_LINE="${3##*;}"
else
    WIN_FILE_PATH="$1"
    FILE_LINE="$2"
fi
if [ "$FILE_LINE" == "-1" ]; then FILE_LINE="0"; fi

FILE_PATH=$(winepath -u "$WIN_FILE_PATH")
if [[ "$WIN_FILE_PATH" == *.sln ]]; then FILE_PATH=$(dirname "$FILE_PATH"); fi
SLN_DIR="${FILE_PATH%%/Assets/*}"
SLN_PATH=$(find "$SLN_DIR" -maxdepth 1 -name "*-csharp.sln")
SLN_NAME="${SLN_PATH#${SLN_DIR}/}"
SLN_NAME="${SLN_NAME#$?}"
LOCAL_FILE_PATH="${FILE_PATH#$SLN_DIR}"
LOCAL_FILE_DIR=$(dirname "$LOCAL_FILE_PATH")
FILE_NAME="${LOCAL_FILE_PATH#${LOCAL_FILE_DIR}/}"

export WINEPREFIX="${SLN_DIR%%/dosdevices/z*}/"
if [[ $FILE_PATH == *".js" ]]
then
	SLN_NAME="${SLN_NAME/-csharp/}"
	PREV_SLN_NAME=$(head -n 1 "${SLN_DIR}/sln_name_of_last_monodevelop_call_js")
	
	WIN_SLN_DIR="$(winepath -w "$SLN_DIR")"

	MD_PATH="${WINEPREFIX}drive_c/Program Files/Unity/MonoDevelop/bin/MonoDevelop.exe"
	
	if [ "$(pidof MonoDevelop.exe)" ] && [ $PREV_SLN_NAME == $SLN_NAME ]
	then wine "$MD_PATH" "$WIN_FILE_PATH;$FILE_LINE"
	else wine "$MD_PATH" "${WIN_SLN_DIR}\\$SLN_NAME $WIN_FILE_PATH;$FILE_LINE"
	fi
	echo "$SLN_NAME" > "${SLN_DIR}/sln_name_of_last_monodevelop_call_js"
	exit 0
fi

COUNT="${LOCAL_FILE_PATH//[^\/]}"
COUNT="${#COUNT}"
COUNT="$((COUNT - 2))"

BACKWARD_SLN_DIR=""
for i in $(seq 0 $COUNT); do BACKWARD_SLN_DIR="${BACKWARD_SLN_DIR}../"; done

ln -s "/" "${SLN_DIR}/Z:"
ln -s "${WINEPREFIX}dosdevices/c:" "${SLN_DIR}/C:"

cd "${SLN_DIR}$LOCAL_FILE_DIR"
PREV_SLN_NAME=$(head -n 1 "${SLN_DIR}/sln_name_of_last_monodevelop_call")
echo "$SLN_NAME" > "${SLN_DIR}/sln_name_of_last_monodevelop_call"

MD_PATH="$(which monodevelop)"
if [[ "$WIN_FILE_PATH" == *".sln" ]]
then
	if [ -z "$(pidof monodevelop)" ]
	then "$MD_PATH" "$SLN_NAME"
	fi
else
	if [ "$(pidof monodevelop)" ] && [ $PREV_SLN_NAME == $SLN_NAME ]
	then "$MD_PATH" "$FILE_NAME;$FILE_LINE"
	else "$MD_PATH" "${BACKWARD_SLN_DIR}$SLN_NAME $FILE_NAME;$FILE_LINE"
	fi
fi
exit 0

~Radivarig