jEdit應用指南【基礎篇】

 jEdit是Java編寫,強大,易用的程序員文本編輯器

      jEdit是一個成熟的,設計優秀的程序員文本編輯器,已經有了7年的開發歷史。在功能和易用性方面壓倒許多昂貴的開發工具時,jEdit在GNU公用許可證(GPL)下發布成了開源軟件。php

jEdit的核心主要由Slava Pestov開發完成,一支由世界各地的程序員組成的隊伍正在爲jEdit開發插件(plugin)。html

下面是jEdit的幾個特點:java

  • java編寫,因此它能夠運行在Mac OS X, OS/2, Unix, VMS Windows平臺上(山顛:java程序員不推薦使用)
  • 內建宏語言;可擴展的插件體系;目前已經有了不少宏和插件.(山顛:內建BeanShell腳本語言,經過插件能夠支持其餘腳本語言.這點是我之因此在這裏費力的緣由 ^_^)
  • 使用jEdit的插件管理器能夠下載插件並安裝.(山顛:若是網絡情況容許,這個功能確實很是好.不過建議想這麼幹的傢伙去sf看看那些插件都是幹什麼的先,全裝了會影響性能)
  • 提供超過130總編程語言的自動縮進和語法高亮.(山顛:很棒.據我所知,BeanShell的高亮顯示好象只有它支持)
  • 支持UTF8Unicode在內的大量字符編碼
  • 代碼摺疊
  • 自動換行
  • 極高的可配置性和可定製性
  • 全部其餘你但願在一個文本編輯器裏找到的功能,不論是基礎性的仍是高級的,你均可以在jEdit中找到.請查看所有功能清單

看看這些截圖,從直觀上感覺一下jEdit:http://www.jedit.org/index.php?page=screenshots程序員

是啊,變幻無窮的jEdit。融合VIM,EditPlus,Emacs等編輯器的優勢於一身。請查看維基百科中的文本編輯器比較。在這個有些片面(顯然測試的是個陽春版本,沒有加任何插件)的比較中,jEdit的表現仍然非常搶眼,全面超越它的只有Emacs(這個超級難用的程序)。做爲一個Java程序員,我找遍了整個地球,在苦惱地認可本身的智商還不足以輕鬆學好Emacs或Vim後欣喜地發現了:開源、強大、易用、Java編寫的jEdit正是我要的。
相關:從其餘編輯器轉移到jEdit http://community.jedit.org/cgi-bin/TWiki/view/Main/SwitchingToJEdit
正則表達式

Beanshell腳本在jEdit的應用

第一節 強大、簡單、獨到的宏

在目前的Java IDE領域中,Eclipse是最好的。但jEdit並非一個IDE,而是「程序員文本編輯器」。在文本編輯領域,jEdit擁有不少獨到的優點,其中之一,也是做者最感興趣的部分,就是它的宏——其實就是Beanshell腳本。內嵌的Beanshell引擎可以直接訪問jEdit的內部對象和API,例如:你能夠寫出這樣的宏命令:shell

buffer.undo(textArea);   //撤銷當前buffer的一個操做編程

Registers.paste(textArea,'$',false);//粘貼到當前文本域網絡

textArea.setSelectedText("    ");//將選定文本設爲「    」閉包

textArea.goToNextLine(false);//移動光標到下一行app

Registers.copy(textArea,'$');//copy

textArea.showWordCountDialog();//顯示對話框,統計字數

textArea.backspace();//按一下後退鍵

       buffer、textArea都是jEdit的內部對象,Registers是jEdit中的寄存器類。可見Beanshell腳本具備直接訪問jEdit內部資源的能力,這使咱們寫出一個高度自動化的宏命令成爲可能。
      除了手工編寫宏文件(.bsh文件)外,jEdit也能夠錄製宏。 錄製宏有三種途徑:
      1.使用菜單:打開 Macros->Record Macro,進行操做,完成時點擊stop Recording。
      2.使用快捷鍵:開始錄製用c+m c+r,結束錄製用c+m c+s。(其中c+m c+r表示先按Ctrl+e,再按Ctrl+r,也能夠按住Ctrl,而後再接着按m和r鍵)
      3.使用action bar:Ctrl+Enter組合鍵打開action bar,輸入record,按Tab鍵,回車,就開始錄製宏。完成後打開action bar,輸入recording,按tab,回車。
       Note:多種使用方式體現出jEdit強大的操做性;有關action bar的相關資料,請查看幫助。
       Note:宏文件必須存放在jedit/macros/目錄或/Documents and Settings/uername/.jedit/macros目錄下,前者是系統宏目錄,後者是用戶宏目錄。

      

第二節 使用 jEdit中的Beanshell編寫宏

    到了這一步,看來咱們又要學一門新的語言了。「太麻煩了!」,你可能已經決定放棄jEdit了。幸虧,Beanshell是Java陣營的腳本語言,咱們基本上不須要什麼精力就學會怎麼在jEdit中使用它——固然前提你必須熟悉Java,這就是我在前面推薦Java程序員使用jEdit的緣由。

       Beanshell 有腳本語言的特性,如弱類型、閉包等,但同時也徹底兼容Java語法。爲了簡便起見,咱們這裏就象java同樣來寫beanshell,只要記住一點:它是解釋執行的。更深刻的學習推薦訪問如下網站:

1.        http://dev.csdn.net/develop/article/15/15090.shtm

2.        http://www-128.ibm.com/developerworks/cn/java/l-beanshell/index.html

3.        官方網站:http://www.beanshell.org

4.        在線教程:http://www.beanshell.org/manual/contents.html

下面經過jEdit自帶的一個宏文件來看看宏是怎麼「煉成」的。
實例:jEdit 4.2/macros/java/Java_File_Save.bsh

文件源代碼以下:中文部分是添加的註釋

  *
 * Copyright (C) 2004 Nicholas O'Leary nol@deferential.net
 * 
 * :mode=beanshell:tabSize=3:indentSize=3:maxLineLen=0:noTabs=true:
 * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
 *
 *
 * Notes:
 *  Only the first 250 lines of the buffer are scanned for a suitable
 *  class or interface declaration.
 *  
 * Changes:
 *  17-May-04: Only scans if the edit mode is either 'java' or the default mode
 *           : Ignores declarations that are in multiline comments
 *  08-Jun-04: If an infinite loop is hit (1000 iterations) in the comment
 *           : parsing, it now opens the default save dialog, rather than
 *           : just returning.
 * $Id: Java_File_Save.bsh,v 1.1 2004/06/26 19:10:58 spestov Exp $
  */
//以上是宏做者寫的說明

// Check this is a new file。
// 在jEdit中buffer對象指向當前正在編輯的文件,打開一個文件,就是在當前視圖(view)的textArea中建立一個buffer
// 在幫助中能夠查看這些類的API:對象buffer: org.gjt.sp.jedit.Buffer,
//                           對象textArea: org.gjt.sp.jedit.textarea.JEditTextArea
//                           對象view:    org.gjt.sp.jedit.View
// beanshell能訪問的內存中的對象有view,buffer,textArea,editPane,wm,scriptPath,
// 詳情請看幫助中的 Chapter 13. Macro Basics-->Predefined Variables in BeanShell小節
if (buffer.isNewFile() && buffer.getPath() != null)
{
   // Only look further if the mode is 'java', or still the default
   String buffer_mode = buffer.getMode().toString();//編輯模式,jEdit的默認編輯模式是text
   if (buffer_mode.equals("java"|| buffer_mode.equals(jEdit.getProperty("buffer.defaultMode","")))
   {
      String fullpath = buffer.getPath();//打開文件的路徑
      VFS vfs = VFSManager.getVFSForPath(fullpath);//根據路徑生成虛擬文件系統
      // Split into constituent parts
      String path = vfs.getParentOfPath(fullpath);//得到所在目錄
      String name = vfs.getFileName(fullpath);//得到文件名
      
      // At most, check the first 250 lines - this sounds reasonable to me
      //如下利用GNU的正則表達式包檢查代碼,提取出類名(最多檢查250行)
      int maxLine = Math.min(buffer.getLineCount(),250);
      import gnu.regexp.RE;
      import gnu.regexp.REMatch;//這樣引入包,jar文件必須能被jEdit找到(只要將jar文件放在jars目錄下)
      // Build the regex - based on the offical java language spec.
      RE regex = new RE("^//s*(public|protected|private|static|abstract|final|native|synchronized|transient|volatile|strictfp)?//s*(class|interface)//s*([^ {/]*)");
      int regexMinimum = regex.getMinimumLength();//可能構成一次匹配的最小字符數
      boolean inComment = false;//是否在註釋裏
      for(int i=0;i<maxLine;i++)
      {
         String txt = buffer.getLineText(i);//第i行的字符串
         int count = 0;
            // See if this line has a the start or finish of a multiline comment
         //肯定提取的類名是有效的,不在註釋裏
         while (txt.indexOf("/*")!=-1 || txt.indexOf("*/")!=-1)
            {
                // A little paranoia on my part 
            count++;
            if (count==1000)//最多執行1000次,若是這行長度超過2000就無論了,直接保存爲默認文件名
            {
               Log.log(Log.ERROR,BeanShell.class,"Infinite loop:["+txt+"]");               //log: org.gjt.sp.util.Log jEdit的log系統               buffer.save(view,null,true);//以默認名保存               return;//結束腳本執行            }                // Look for the next starting comment if we're not in a comment            if (!inComment)            {               int commentStartIndex = txt.indexOf("/*");               if (commentStartIndex != -1)               {                  inComment = true;                  if (commentStartIndex+2 == txt.length())                     txt = "";                  else                     txt = txt.substring(commentStartIndex+2);               }            }                // Look for the next ending comment if we are in a comment            if (inComment)            {               int commentEndIndex = txt.indexOf("*/");               if (commentEndIndex != -1)               {                  inComment = false;                  if (commentEndIndex+2 == txt.length())                     txt = "";                  else                     txt = txt.substring(commentEndIndex+2);               } else {                  continue;               }            }         }                        // We now know if the remainder of the line is in a comment or not         if (!inComment)         {            // Ignore lines that are too short for the regex            if (txt.length() < regexMinimum)               continue;            REMatch match = regex.getMatch(txt);            // See if it matches            if (match!=null)            {               int startIndex = match.getStartIndex(3);               int endIndex = match.getEndIndex(3);               // Extract the class/interface name 得出第三個匹配,就是類名               name = txt.substring(startIndex,endIndex)+".java";//文件名               break;            }         }      }            // Open the VFSBrowser      String[] files = GUIUtilities.showVFSFileDialog(view,path+name,                                                VFSBrowser.SAVE_DIALOG,false);      if(files == null)         return false;      buffer.save(view,files[0],true);      return;   }}// This isn't a file that has been scanned, so just do a normal savebuffer.save(view,null,true);/*Macro index data (in DocBook format)   <listitem>      <para><filename>Java_File_Save.bsh</filename></para>      <abstract><para>Acts as a wrapper script to the Save As action. If the buffer      is a new file, it scans the first 250 lines for a Java class or interface      declaration. On finding one, it extracts the appropriate filename to be      used in the Save As dialog.</para></abstract>         </listitem>*/

         這個bsh腳本能自動獲得文件中的類名,以此做爲文件名的前綴保存。要執行這個文件,點擊 Macros-Java-java_File_save。要快速執行,能夠設定快捷鍵。打開Utilities-Global option,選擇shortcuts-macros進行快捷鍵設置。          jEdit自帶的Macro就是很好的例子,配合幫助中的API,beanshell宏是很容易上手的。

相關文章
相關標籤/搜索