最近更新: 2012-01-18

gedit 外掛程式 - 外部工具 - 執行或編譯程式碼

在 Linux 桌面中,我寫程式時慣用的文字編輯器是 gedit。 我寫了一個配合「外部工具」外掛的指令集,可以讓我直接在 gedit 的視窗中直接編譯或執行我正在編寫的程式碼。

#!/bin/sh
do_cc_cmd() {
  CC_CMD=`grep -m 1 "// $CC" $GEDIT_CURRENT_DOCUMENT_PATH | sed "s/\/\/ //"`
  OUTPUT_NAME=${GEDIT_CURRENT_DOCUMENT_NAME%.*}

  if [ -z "$CC_CMD" ]; then
    CC_CMD="$CC -o $OUTPUT_NAME $GEDIT_CURRENT_DOCUMENT_PATH"
  fi

  echo $CC_CMD
  `$CC_CMD`
  if [ $? -eq 0 ]; then
    ./$OUTPUT_NAME
  fi
}

case $GEDIT_CURRENT_DOCUMENT_TYPE in
"application/x-php")
  echo "$GEDIT_CURRENT_DOCUMENT_PATH" | grep "Test.php" > /dev/null
  if [ $? -eq 0 ]; then
    phpunit $GEDIT_CURRENT_DOCUMENT_NAME
  else
    php "$GEDIT_CURRENT_DOCUMENT_PATH"
  fi
  ;;
"text/x-python")
  python "$GEDIT_CURRENT_DOCUMENT_PATH";;
"application/x-ruby")
  ruby "$GEDIT_CURRENT_DOCUMENT_PATH";;
"application/x-perl")
  perl "$GEDIT_CURRENT_DOCUMENT_PATH";;
"application/javascript")
  gjs "$GEDIT_CURRENT_DOCUMENT_PATH";;
"application/x-shellscript")
  sh "$GEDIT_CURRENT_DOCUMENT_PATH";;

"text/x-csrc")
  CC=gcc
  do_cc_cmd
  ;;
"text/x-vala")
  CC=valac
  do_cc_cmd
  ;;

*)
  echo "[$GEDIT_CURRENT_DOCUMENT_TYPE]"
  echo "[$GEDIT_CURRENT_DOCUMENT_URI]"
  echo "[$GEDIT_CURRENT_DOCUMENT_NAME]"
  echo "[$GEDIT_CURRENT_DOCUMENT_PATH]"
  echo "[$GEDIT_CURRENT_DOCUMENT_DIR]"
  echo "[${GEDIT_CURRENT_DOCUMENT_NAME%.*}]"
esac

複製上列指令集的內容後,參考下圖,將這個指令集加入 gedit 外部工具的項目中。我指定 F5 作為此外部工具指令集的捷徑鍵。

gedit設定新的外部工具
  • *.sh: sh
  • *Test.php: phpunit
  • *.php: php
  • *.py: python
  • *.pl: perl
  • *.rb: ruby
  • *.js: gjs
  • *.c: gcc
  • *.vala: valac

這個指令集會依據文件的型態判斷需要調用哪一個外部工具。例如我正在寫一個 shell script,當我按下 F5 鍵時,gedit 就會調用 sh 執行這份 shell script 並將輸出結果顯示在 gedit 的底部面板;寫 php 程式碼就會調用 php。如果文件是 C 程式碼,它也有法子調用 gcc 編譯與執行編譯後的程式。

針對 C/Vala 的程式碼,我的指令集會先找尋程式碼第一列的註解是否指示編譯方式。例如下列範例。 如果第一列註解指示了編譯內容,就會按照指示調用編譯器編譯程式碼。若無指示,則按預設方式編譯,C 程式碼調用 gcc -o $OUTPUT_NAME $GEDIT_CURRENT_DOCUMENT_PATH;Vala 程式碼調用 valac -o $OUTPUT_NAME $GEDIT_CURRENT_DOCUMENT_PATH

// gcc -o helo -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 hello.c
// 第一行就是編譯方式。
#include <glib.h>

int main() {
    g_printf("hello\n");
    return 0;
}

當我編寫單一文件就能寫完的小程式時,這個指令集省了我不少時間。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/18790684.html