📄 search.c
字号:
static const char CVSID[] = "$Id: search.c,v 1.59.2.1 2003/06/20 21:43:51 slobasso Exp $";/******************************************************************************** ** search.c -- Nirvana Editor search and replace functions ** ** Copyright (C) 1999 Mark Edel ** ** This is free software; you can redistribute it and/or modify it under the ** terms of the GNU General Public License as published by the Free Software ** Foundation; either version 2 of the License, or (at your option) any later ** version. ** ** This software is distributed in the hope that it will be useful, but WITHOUT ** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ** for more details. ** ** You should have received a copy of the GNU General Public License along with ** software; if not, write to the Free Software Foundation, Inc., 59 Temple ** Place, Suite 330, Boston, MA 02111-1307 USA ** ** Nirvana Text Editor ** May 10, 1991 ** ** Written by Mark Edel ** ********************************************************************************/#ifdef HAVE_CONFIG_H#include "../config.h"#endif#include "search.h"#include "regularExp.h"#include "textBuf.h"#include "text.h"#include "nedit.h"#include "server.h"#include "window.h" #include "preferences.h"#include "file.h"#include "highlight.h"#ifdef REPLACE_SCOPE#include "textDisp.h"#include "textP.h"#endif#include "../util/DialogF.h"#include "../util/misc.h"#include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#ifdef VMS#include "../util/VMSparam.h"#else#ifndef __MVS__#include <sys/param.h>#endif#endif /*VMS*/#include <Xm/Xm.h>#include <X11/Shell.h>#include <Xm/XmP.h>#include <Xm/Form.h>#include <Xm/Label.h>#ifdef REPLACE_SCOPE#if XmVersion >= 1002#include <Xm/PrimitiveP.h>#endif#endif#include <Xm/PushB.h>#include <Xm/RowColumn.h>#include <Xm/Text.h>#include <Xm/ToggleB.h>#include <Xm/List.h>#include <X11/Xatom.h> /* for getting selection */#include <X11/keysym.h>#include <X11/X.h> /* " " */#ifdef HAVE_DEBUG_H#include "../debug.h"#endifint NHist = 0;typedef struct _SelectionInfo { int done; WindowInfo* window; char* selection;} SelectionInfo;typedef struct { int direction; int searchType; int searchWrap;} SearchSelectedCallData;/* History mechanism for search and replace strings */static char *SearchHistory[MAX_SEARCH_HISTORY];static char *ReplaceHistory[MAX_SEARCH_HISTORY];static int SearchTypeHistory[MAX_SEARCH_HISTORY];static int HistStart = 0;static int textFieldNonEmpty(Widget w);static void setTextField(WindowInfo* window, Time time, Widget textField);static void getSelectionCB(Widget w, SelectionInfo *selectionInfo, Atom *selection, Atom *type, char *value, int *length, int *format);static void createReplaceDlog(Widget parent, WindowInfo *window);static void createFindDlog(Widget parent, WindowInfo *window);static void createReplaceMultiFileDlog(WindowInfo *window);static void fFocusCB(Widget w, WindowInfo *window, caddr_t *callData);static void rFocusCB(Widget w, WindowInfo *window, caddr_t *callData);static void rKeepCB(Widget w, WindowInfo *window, caddr_t *callData);static void fKeepCB(Widget w, WindowInfo *window, caddr_t *callData);static void replaceCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData); static void replaceAllCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void rInSelCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData); static void rCancelCB(Widget w, WindowInfo *window, caddr_t callData);static void fCancelCB(Widget w, WindowInfo *window, caddr_t callData);static void rFindCB(Widget w,WindowInfo *window,XmAnyCallbackStruct *callData);static void rFindTextValueChangedCB(Widget w, WindowInfo *window, XKeyEvent *event);static void rFindArrowKeyCB(Widget w, WindowInfo *window, XKeyEvent *event);static void rSetActionButtons(WindowInfo* window, int replaceBtn, int replaceFindBtn, int replaceAndFindBtn,#ifndef REPLACE_SCOPE int replaceInWinBtn, int replaceInSelBtn,#endif int replaceAllBtn);#ifdef REPLACE_SCOPEstatic void rScopeWinCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void rScopeSelCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void rScopeMultiCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void replaceAllScopeCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);#endifstatic void replaceArrowKeyCB(Widget w, WindowInfo *window, XKeyEvent *event);static void fUpdateActionButtons(WindowInfo *window);static void findTextValueChangedCB(Widget w, WindowInfo *window, XKeyEvent *event);static void findArrowKeyCB(Widget w, WindowInfo *window, XKeyEvent *event);static void replaceFindCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void findCB(Widget w, WindowInfo *window,XmAnyCallbackStruct *callData); static void replaceMultiFileCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void rMultiFileReplaceCB(Widget w, WindowInfo *window, XmAnyCallbackStruct * callData);static void rMultiFileCancelCB(Widget w, WindowInfo *window, caddr_t callData);static void rMultiFileSelectAllCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void rMultiFileDeselectAllCB(Widget w, WindowInfo *window, XmAnyCallbackStruct * callData);static void rMultiFilePathCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void uploadFileListItems(WindowInfo* window, Bool replace);static int countWindows(void);static int countWritableWindows(void);static void collectWritableWindows(WindowInfo* window);static void freeWritableWindowsCB(Widget* w, WindowInfo* window, XmAnyCallbackStruct *callData);static void checkMultiReplaceListForDoomedW(WindowInfo* window, WindowInfo* doomedWindow);static void removeDoomedWindowFromList(WindowInfo* window, int index);static void unmanageReplaceDialogs(WindowInfo *window);static void flashTimeoutProc(XtPointer clientData, XtIntervalId *id);static void eraseFlash(WindowInfo *window);static int getReplaceDlogInfo(WindowInfo *window, int *direction, char *searchString, char *replaceString, int *searchType);static int getFindDlogInfo(WindowInfo *window, int *direction, char *searchString, int *searchType);static void selectedSearchCB(Widget w, XtPointer callData, Atom *selection, Atom *type, char *value, int *length, int *format);static void iSearchTextActivateCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void iSearchTextValueChangedCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void iSearchTextKeyEH(Widget w, WindowInfo *window, XKeyEvent *event, Boolean *continueDispatch);static int searchLiteral(const char *string, const char *searchString, int caseSense, int direction, int wrap, int beginPos, int *startPos, int *endPos, int *searchExtentBW, int *searchExtentFW);static int searchLiteralWord(const char *string, const char *searchString, int caseSense, int direction, int wrap, int beginPos, int *startPos, int *endPos, const char * delimiters);static int searchRegex(const char *string, const char *searchString, int direction, int wrap, int beginPos, int *startPos, int *endPos, int *searchExtentBW, int *searchExtentFW, const char *delimiters, int defaultFlags);static int forwardRegexSearch(const char *string, const char *searchString, int wrap, int beginPos, int *startPos, int *endPos, int *searchExtentBW, int *searchExtentFW, const char *delimiters, int defaultFlags);static int backwardRegexSearch(const char *string, const char *searchString, int wrap, int beginPos, int *startPos, int *endPos, int *searchExtentBW, int *searchExtentFW, const char *delimiters, int defaultFlags);static void upCaseString(char *outString, const char *inString);static void downCaseString(char *outString, const char *inString);static void resetFindTabGroup(WindowInfo *window);static void resetReplaceTabGroup(WindowInfo *window);static int searchMatchesSelection(WindowInfo *window, const char *searchString, int searchType, int *left, int *right, int *searchExtentBW, int *searchExtentFW);static int findMatchingChar(WindowInfo *window, char toMatch, void *toMatchStyle, int charPos, int startLimit, int endLimit, int *matchPos);static void replaceUsingRE(const char *searchStr, const char *replaceStr, const char *sourceStr, int beginPos, char *destStr, int maxDestLen, int prevChar, const char *delimiters, int defaultFlags);static void saveSearchHistory(const char *searchString, const char *replaceString, int searchType, int isIncremental);static int historyIndex(int nCycles);static char *searchTypeArg(int searchType);static char *searchWrapArg(int searchWrap);static char *directionArg(int direction);static int isRegexType(int searchType);static int defaultRegexFlags(int searchType);static void findRegExpToggleCB(Widget w, XtPointer clientData, XtPointer callData);static void replaceRegExpToggleCB(Widget w, XtPointer clientData, XtPointer callData);static void iSearchRegExpToggleCB(Widget w, XtPointer clientData, XtPointer callData);static void findCaseToggleCB(Widget w, XtPointer clientData, XtPointer callData);static void replaceCaseToggleCB(Widget w, XtPointer clientData, XtPointer callData);static void iSearchCaseToggleCB(Widget w, XtPointer clientData, XtPointer callData);static void iSearchTryBeepOnWrap(WindowInfo *window, int direction, int beginPos, int startPos); static void iSearchRecordLastBeginPos(WindowInfo *window, int direction, int initPos); typedef struct _charMatchTable { char c; char match; char direction;} charMatchTable;#define N_MATCH_CHARS 13#define N_FLASH_CHARS 6static charMatchTable MatchingChars[N_MATCH_CHARS] = { {'{', '}', SEARCH_FORWARD}, {'}', '{', SEARCH_BACKWARD}, {'(', ')', SEARCH_FORWARD}, {')', '(', SEARCH_BACKWARD}, {'[', ']', SEARCH_FORWARD}, {']', '[', SEARCH_BACKWARD}, {'<', '>', SEARCH_FORWARD}, {'>', '<', SEARCH_BACKWARD}, {'/', '/', SEARCH_FORWARD}, {'"', '"', SEARCH_FORWARD}, {'\'', '\'', SEARCH_FORWARD}, {'`', '`', SEARCH_FORWARD}, {'\\', '\\', SEARCH_FORWARD},};/*** Definitions for the search method strings, used as arguments for ** macro search subroutines and search action routines*/static char *searchTypeStrings[] = { "literal", /* SEARCH_LITERAL */ "case", /* SEARCH_CASE_SENSE */ "regex", /* SEARCH_REGEX */ "word", /* SEARCH_LITERAL_WORD */ "caseWord", /* SEARCH_CASE_SENSE_WORD */ "regexNoCase", /* SEARCH_REGEX_NOCASE */ NULL};/*** Shared routine for replace and find dialogs and i-search bar to initialize** the state of the regex/case/word toggle buttons, and the sticky case ** sensitivity states.*/ static void initToggleButtons(int searchType, Widget regexToggle, Widget caseToggle, Widget* wordToggle, Bool* lastLiteralCase, Bool* lastRegexCase){ /* Set the initial search type and remember the corresponding case sensitivity states in case sticky case sensitivity is required. */ switch (searchType) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -