📄 lymain.c
字号:
#include "HTUtils.h"#include "tcp.h"#include "HTTP.h"#include "HTParse.h"#include "HTAccess.h"#include "HTList.h"#include "HTFile.h"#include "UCMap.h"#include "UCDefs.h"#ifdef VMS#include "HTVMSUtils.h"#endif /* VMS */#include "HTInit.h"#include "LYCurses.h"#include "LYStyle.h"#include "HTML.h"#include "LYUtils.h"#include "LYGlobalDefs.h"#include "LYSignal.h"#include "LYGetFile.h"#include "LYStrings.h"#include "LYClean.h"#include "LYCharSets.h"#include "LYCharUtils.h"#include "UCMap.h"#include "LYReadCFG.h"#include "LYrcFile.h"#include "LYKeymap.h"#include "LYList.h"#include "LYJump.h"#include "LYMainLoop.h"#include "LYBookmark.h"#ifdef DOSPATH#include "HTDOS.h"#endif#ifndef VMS#ifdef SYSLOG_REQUESTED_URLS#include <syslog.h>#endif /* SYSLOG_REQUESTED_URLS */#endif /* !VMS */#ifdef LOCALE#include<locale.h>#endif /* LOCALE */#include "LYexit.h"#include "LYLeaks.h"#define FREE(x) if (x) {free(x); x = NULL;}#ifdef VMS#define DISPLAY "DECW$DISPLAY"#else#define DISPLAY "DISPLAY"#endif /* VMS *//* ahhhhhhhhhh!! Global variables :-< */#ifdef SOCKSPUBLIC BOOLEAN socks_flag=TRUE;#endif /* SOCKS */#ifdef IGNORE_CTRL_CPUBLIC BOOLEAN sigint = FALSE;#endif /* IGNORE_CTRL_C */#ifdef __DJGPP__char init_ctrl_break[1];#endif /* __DJGPP__ */#ifdef VMSPUBLIC char *mail_adrs = NULL; /* the mask for a VMS mail transport */ /* create FIXED 512 binaries */PUBLIC BOOLEAN UseFixedRecords = USE_FIXED_RECORDS;#endif /* VMS */#ifndef VMSPUBLIC char *lynx_version_putenv_command = NULL;PUBLIC char *NNTPSERVER_putenv_cmd = NULL; /* lynx.cfg defined NNTPSERVER */PUBLIC char *http_proxy_putenv_cmd = NULL; /* lynx.cfg defined http_proxy */PUBLIC char *https_proxy_putenv_cmd = NULL; /* lynx.cfg defined https_proxy */PUBLIC char *ftp_proxy_putenv_cmd = NULL; /* lynx.cfg defined ftp_proxy */PUBLIC char *gopher_proxy_putenv_cmd = NULL; /* lynx.cfg defined gopher_proxy */PUBLIC char *cso_proxy_putenv_cmd = NULL; /* lynx.cfg defined cso_proxy */PUBLIC char *news_proxy_putenv_cmd = NULL; /* lynx.cfg defined news_proxy */PUBLIC char *newspost_proxy_putenv_cmd = NULL;PUBLIC char *newsreply_proxy_putenv_cmd = NULL;PUBLIC char *snews_proxy_putenv_cmd = NULL; /* lynx.cfg defined snews_proxy */PUBLIC char *snewspost_proxy_putenv_cmd = NULL;PUBLIC char *snewsreply_proxy_putenv_cmd = NULL;PUBLIC char *nntp_proxy_putenv_cmd = NULL; /* lynx.cfg defined nntp_proxy */PUBLIC char *wais_proxy_putenv_cmd = NULL; /* lynx.cfg defined wais_proxy */PUBLIC char *finger_proxy_putenv_cmd = NULL; /* lynx.cfg defined finger_proxy */PUBLIC char *no_proxy_putenv_cmd = NULL; /* lynx.cfg defined no_proxy */PUBLIC char *list_format=NULL; /* LONG_LIST formatting mask */#ifdef SYSLOG_REQUESTED_URLSPUBLIC char *syslog_txt = NULL; /* syslog arb text for session */#endif /* SYSLOG_REQUESTED_URLS */#endif /* !VMS */#ifdef VMSPUBLIC char *LYCSwingPath = NULL;#endif /* VMS */#ifdef DIRED_SUPPORTPUBLIC BOOLEAN lynx_edit_mode = FALSE;PUBLIC BOOLEAN no_dired_support = FALSE;PUBLIC BOOLEAN dir_list_style = MIXED_STYLE;PUBLIC HTList *tagged = NULL;#ifdef OK_OVERRIDEPUBLIC BOOLEAN prev_lynx_edit_mode = FALSE;#endif /* OK_OVERRIDE */#ifdef OK_PERMIT#ifdef NO_CHANGE_EXECUTE_PERMSPUBLIC BOOLEAN no_change_exec_perms = TRUE;#elsePUBLIC BOOLEAN no_change_exec_perms = FALSE;#endif /* NO_CHANGE_EXECUTE_PERMS */#endif /* OK_PERMIT */#endif /* DIRED_SUPPORT */ /* Number of docs cached in memory */PUBLIC int HTCacheSize = DEFAULT_CACHE_SIZE;#if defined(VMS) && defined(VAXC) && !defined(__DECC) /* Don't dump doc cache unless this size is exceeded */PUBLIC int HTVirtualMemorySize = DEFAULT_VIRTUAL_MEMORY_SIZE;#endif /* VMS && VAXC && !_DECC */#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)#ifndef NEVER_ALLOW_REMOTE_EXECPUBLIC BOOLEAN local_exec = LOCAL_EXECUTION_LINKS_ALWAYS_ON;#elsePUBLIC BOOLEAN local_exec = FALSE;#endif /* NEVER_ALLOW_REMOTE_EXEC */PUBLIC BOOLEAN local_exec_on_local_files = LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE;#endif /* EXEC_LINKS || EXEC_SCRIPTS */#if defined(LYNXCGI_LINKS) && !defined(VMS) /* WebSter Mods -jkt */PUBLIC char *LYCgiDocumentRoot = NULL; /* DOCUMENT_ROOT in the lynxcgi env */#endif /* LYNXCGI_LINKS */#ifdef REVERSE_CLEAR_SCREEN_PROBLEMPUBLIC BOOLEAN enable_scrollback=TRUE;#elsePUBLIC BOOLEAN enable_scrollback=FALSE;#endif /* REVERSE_CLEAR_SCREEN_PROBLEM */PUBLIC char *empty_string = "\0";PUBLIC int display_lines; /* number of lines in display */PUBLIC int www_search_result= -1; /* linked list of printers */PUBLIC lynx_printer_item_type *printers = NULL; /* linked list of download options */PUBLIC lynx_html_item_type *downloaders = NULL; /* linked list of upload options */#ifdef USE_EXTERNALSPUBLIC lynx_html_item_type *externals = NULL; /* linked list of external options */#endifPUBLIC lynx_html_item_type *uploaders = NULL;PUBLIC int port_syntax = 1;PUBLIC int LYShowColor = SHOW_COLOR_UNKNOWN; /* to show or not to show */PUBLIC int LYChosenShowColor = SHOW_COLOR_UNKNOWN; /* whether to show and save */PUBLIC int LYrcShowColor = SHOW_COLOR_UNKNOWN; /* ... as last read or written */PUBLIC BOOLEAN LYShowCursor = SHOW_CURSOR; /* to show or not to show */PUBLIC BOOLEAN LYUseDefShoCur = TRUE; /* Command line -show_cursor toggle */PUBLIC BOOLEAN LYforce_no_cache = FALSE;PUBLIC BOOLEAN LYoverride_no_cache = FALSE;/*override no-cache b/c history etc*/PUBLIC BOOLEAN LYinternal_flag = FALSE; /* override no-cache b/c internal link*/PUBLIC BOOLEAN LYresubmit_posts = ALWAYS_RESUBMIT_POSTS;PUBLIC BOOLEAN LYUserSpecifiedURL = TRUE;/* always TRUE the first time */PUBLIC BOOLEAN LYJumpFileURL = FALSE; /* always FALSE the first time */PUBLIC BOOLEAN jump_buffer = JUMPBUFFER; /* TRUE if offering default shortcut */PUBLIC BOOLEAN goto_buffer = GOTOBUFFER; /* TRUE if offering default goto URL */PUBLIC BOOLEAN recent_sizechange = FALSE;/* the window size changed recently? */PUBLIC BOOLEAN user_mode = NOVICE_MODE;PUBLIC BOOLEAN dump_output_immediately = FALSE;PUBLIC BOOLEAN is_www_index = FALSE;PUBLIC BOOLEAN lynx_mode = NORMAL_LYNX_MODE;PUBLIC BOOLEAN bold_headers = FALSE;PUBLIC BOOLEAN bold_H1 = FALSE;PUBLIC BOOLEAN bold_name_anchors = FALSE;PUBLIC BOOLEAN use_underscore = SUBSTITUTE_UNDERSCORES;PUBLIC BOOLEAN nolist = FALSE;PUBLIC BOOLEAN historical_comments = FALSE;PUBLIC BOOLEAN minimal_comments = FALSE;PUBLIC BOOLEAN soft_dquotes = FALSE;PUBLIC BOOLEAN LYValidate = FALSE;PUBLIC BOOLEAN LYPermitURL = FALSE;PUBLIC BOOLEAN child_lynx = FALSE;PUBLIC BOOLEAN error_logging = MAIL_SYSTEM_ERROR_LOGGING;PUBLIC BOOLEAN check_mail = CHECKMAIL;PUBLIC BOOLEAN vi_keys = VI_KEYS_ALWAYS_ON;PUBLIC BOOLEAN emacs_keys = EMACS_KEYS_ALWAYS_ON;PUBLIC BOOLEAN keypad_mode = DEFAULT_KEYPAD_MODE;PUBLIC BOOLEAN case_sensitive = CASE_SENSITIVE_ALWAYS_ON;PUBLIC BOOLEAN telnet_ok = TRUE;PUBLIC BOOLEAN news_ok = TRUE;PUBLIC BOOLEAN rlogin_ok = TRUE;PUBLIC BOOLEAN ftp_ok = TRUE;PUBLIC BOOLEAN system_editor = FALSE;#ifdef USE_EXTERNALSPUBLIC BOOLEAN no_externals = FALSE;#endif#ifdef RAWDOSKEYHACKPUBLIC BOOLEAN raw_dos_key_hack = TRUE;#endif /* RAWDOSKEYHACK */PUBLIC BOOLEAN no_inside_telnet = FALSE;PUBLIC BOOLEAN no_outside_telnet = FALSE;PUBLIC BOOLEAN no_telnet_port = FALSE;PUBLIC BOOLEAN no_inside_news = FALSE;PUBLIC BOOLEAN no_outside_news = FALSE;PUBLIC BOOLEAN no_inside_ftp = FALSE;PUBLIC BOOLEAN no_outside_ftp = FALSE;PUBLIC BOOLEAN no_inside_rlogin = FALSE;PUBLIC BOOLEAN no_outside_rlogin = FALSE;PUBLIC BOOLEAN no_suspend = FALSE;PUBLIC BOOLEAN no_editor = FALSE;PUBLIC BOOLEAN no_shell = FALSE;PUBLIC BOOLEAN no_bookmark = FALSE;PUBLIC BOOLEAN no_multibook = FALSE;PUBLIC BOOLEAN no_bookmark_exec = FALSE;PUBLIC BOOLEAN no_option_save = FALSE;PUBLIC BOOLEAN no_print = FALSE;PUBLIC BOOLEAN no_download = FALSE;PUBLIC BOOLEAN no_disk_save = FALSE;PUBLIC BOOLEAN no_exec = FALSE;PUBLIC BOOLEAN no_lynxcgi = FALSE;PUBLIC BOOLEAN exec_frozen = FALSE;PUBLIC BOOLEAN no_goto = FALSE;PUBLIC BOOLEAN no_goto_cso = FALSE;PUBLIC BOOLEAN no_goto_file = FALSE;PUBLIC BOOLEAN no_goto_finger = FALSE;PUBLIC BOOLEAN no_goto_ftp = FALSE;PUBLIC BOOLEAN no_goto_gopher = FALSE;PUBLIC BOOLEAN no_goto_http = FALSE;PUBLIC BOOLEAN no_goto_https = FALSE;PUBLIC BOOLEAN no_goto_lynxcgi = FALSE;PUBLIC BOOLEAN no_goto_lynxexec = FALSE;PUBLIC BOOLEAN no_goto_lynxprog = FALSE;PUBLIC BOOLEAN no_goto_mailto = FALSE;PUBLIC BOOLEAN no_goto_news = FALSE;PUBLIC BOOLEAN no_goto_nntp = FALSE;PUBLIC BOOLEAN no_goto_rlogin = FALSE;PUBLIC BOOLEAN no_goto_snews = FALSE;PUBLIC BOOLEAN no_goto_telnet = FALSE;PUBLIC BOOLEAN no_goto_tn3270 = FALSE;PUBLIC BOOLEAN no_goto_wais = FALSE;PUBLIC BOOLEAN no_jump = FALSE;PUBLIC BOOLEAN no_file_url = FALSE;PUBLIC BOOLEAN no_newspost = FALSE;PUBLIC BOOLEAN no_mail = FALSE;PUBLIC BOOLEAN no_dotfiles = NO_DOT_FILES;PUBLIC BOOLEAN no_useragent = FALSE;PUBLIC BOOLEAN no_statusline = FALSE;PUBLIC BOOLEAN no_filereferer = FALSE;PUBLIC BOOLEAN local_host_only = FALSE;PUBLIC BOOLEAN override_no_download = FALSE;PUBLIC BOOLEAN show_dotfiles = FALSE; /* From rcfile if no_dotfiles is false */PUBLIC BOOLEAN LYforce_HTML_mode = FALSE;PUBLIC char *homepage = NULL; /* home page or main screen */PUBLIC char *editor = NULL; /* the name of the current editor */PUBLIC char *jumpfile = NULL; /* the name of the default jumps file */PUBLIC char *jumpprompt = NULL; /* the default jumps prompt */PUBLIC char *bookmark_page = NULL; /* the name of the default bookmark page */PUBLIC char *BookmarkPage = NULL; /* the name of the current bookmark page */PUBLIC char *LynxHome = NULL; /* the default Home HREF. */PUBLIC char *startfile = NULL; /* the first file */PUBLIC char *helpfile = NULL; /* the main help file */PUBLIC char *helpfilepath = NULL; /* the path to the help file set */PUBLIC char *lynxjumpfile = NULL; /* the current jump file URL */PUBLIC char *lynxlistfile = NULL; /* the current list file URL */PUBLIC char *lynxlinksfile = NULL; /* the current visited links file URL */PUBLIC char *startrealm = NULL; /* the startfile realm */PUBLIC char *indexfile = NULL; /* an index file if there is one */PUBLIC char *personal_mail_address = NULL; /* the users mail address */PUBLIC char *display = NULL; /* display environment variable */PUBLIC char *personal_type_map = NULL; /* .mailcap */PUBLIC char *global_type_map = NULL; /* global mailcap */PUBLIC char *global_extension_map = NULL; /* global mime.types */PUBLIC char *personal_extension_map = NULL;/* .mime.types */PUBLIC char *language = NULL; /* preferred language */PUBLIC char *pref_charset = NULL; /* preferred character set */PUBLIC BOOLEAN LYNewsPosting = NEWS_POSTING; /* News posting supported? */PUBLIC char *LynxSigFile = NULL; /* Signature file, in or off home */PUBLIC char *system_mail = NULL; /* The path for sending mail */PUBLIC char *system_mail_flags = NULL; /* Flags for sending mail */PUBLIC char *lynx_temp_space = NULL; /* The prefix for temporary file paths */PUBLIC char *lynx_save_space = NULL; /* The prefix for save to disk paths */PUBLIC char *LYHostName = NULL; /* treat as a local host name */PUBLIC char *LYLocalDomain = NULL; /* treat as a local domain tail */PUBLIC BOOLEAN clickable_images = MAKE_LINKS_FOR_ALL_IMAGES;PUBLIC BOOLEAN pseudo_inline_alts = MAKE_PSEUDO_ALTS_FOR_INLINES;PUBLIC BOOLEAN crawl = FALSE; /* Do crawl? */PUBLIC BOOLEAN traversal = FALSE; /* Do traversals? */PUBLIC BOOLEAN check_realm = FALSE; /* Restrict to the starting realm? */ /* Links beyond a displayed page with no links? */PUBLIC BOOLEAN more_links = FALSE;PUBLIC int ccount = 0; /* Starting number for lnk#.dat files in crawls */PUBLIC BOOLEAN LYCancelledFetch = FALSE; /* TRUE if cancelled binary fetch */ /* Include mime headers with source dump */PUBLIC BOOLEAN keep_mime_headers = FALSE;PUBLIC BOOLEAN no_url_redirection = FALSE; /* Don't follow URL redirections */PUBLIC char *form_post_data = NULL; /* User data for post form */PUBLIC char *form_get_data = NULL; /* User data for get form */PUBLIC char *http_error_file = NULL; /* Place HTTP status code in this file */ /* Id:Password for protected documents */PUBLIC char *authentication_info[2] = {NULL, NULL}; /* Id:Password for protected proxy servers */PUBLIC char *proxyauth_info[2] = {NULL, NULL};PUBLIC BOOLEAN HEAD_request = FALSE;PUBLIC BOOLEAN scan_for_buried_news_references = TRUE;PUBLIC BOOLEAN LYRawMode;PUBLIC BOOLEAN LYDefaultRawMode;PUBLIC BOOLEAN LYUseDefaultRawMode = TRUE;PUBLIC char *UCAssume_MIMEcharset = NULL;PUBLIC char *UCAssume_localMIMEcharset = NULL;PUBLIC char *UCAssume_unrecMIMEcharset = NULL;PUBLIC int LYlines = 24;PUBLIC int LYcols = 80;PUBLIC int dump_output_width = 0;PUBLIC linkstruct links[MAXLINKS];PUBLIC histstruct history[MAXHIST];PUBLIC int nlinks = 0; /* number of links in memory */PUBLIC int nhist = 0; /* number of history entries */PUBLIC int more = FALSE; /* is there more text to display? */PUBLIC int InfoSecs; /* Seconds to sleep() for Information messages */PUBLIC int MessageSecs; /* Seconds to sleep() for important Messages */PUBLIC int AlertSecs; /* Seconds to sleep() for HTAlert() messages */PUBLIC BOOLEAN bookmark_start = FALSE;PUBLIC char *LYUserAgent = NULL; /* Lynx User-Agent header */PUBLIC char *LYUserAgentDefault = NULL; /* Lynx default User-Agent header */PUBLIC BOOLEAN LYUseMouse = FALSE;PUBLIC BOOLEAN LYNoRefererHeader=FALSE; /* Never send Referer header? */PUBLIC BOOLEAN LYNoRefererForThis=FALSE;/* No Referer header for this URL? */PUBLIC BOOLEAN LYNoFromHeader = TRUE; /* Never send From header? */PUBLIC BOOLEAN LYListNewsNumbers = LIST_NEWS_NUMBERS;PUBLIC BOOLEAN LYListNewsDates = LIST_NEWS_DATES;PUBLIC BOOLEAN LYisConfiguredForX = FALSE;PUBLIC char *URLDomainPrefixes = NULL;PUBLIC char *URLDomainSuffixes = NULL;PUBLIC BOOLEAN startfile_ok = FALSE;PUBLIC BOOLEAN LYSelectPopups = USE_SELECT_POPUPS;PUBLIC BOOLEAN LYUseDefSelPop = TRUE; /* Command line -popup toggle */PUBLIC int LYMultiBookmarks = MULTI_BOOKMARK_SUPPORT;PUBLIC BOOLEAN LYMBMBlocked = BLOCK_MULTI_BOOKMARKS;PUBLIC BOOLEAN LYMBMAdvanced = TRUE;PUBLIC int LYStatusLine = -1; /* Line for statusline() if > -1 */PUBLIC BOOLEAN LYCollapseBRs = COLLAPSE_BR_TAGS; /* Collapse serial BRs? */PUBLIC BOOLEAN LYSetCookies = SET_COOKIES; /* Process Set-Cookie headers? */PUBLIC char *XLoadImageCommand = NULL; /* Default image viewer for X */PUBLIC BOOLEAN LYNoISMAPifUSEMAP = FALSE; /* Omit ISMAP link if MAP present? */PUBLIC int LYHiddenLinks = HIDDENLINKS_SEPARATE; /* Show hidden links? */PUBLIC BOOL New_DTD = YES;PUBLIC FILE *LYTraceLogFP = NULL; /* Pointer for TRACE log */PUBLIC char *LYTraceLogPath = NULL; /* Path for TRACE log */PUBLIC BOOLEAN LYUseTraceLog = USE_TRACE_LOG; /* Use a TRACE log? */PUBLIC FILE LYOrigStderr; /* Original stderr pointer */PUBLIC BOOLEAN LYSeekFragMAPinCur = TRUE;PUBLIC BOOLEAN LYSeekFragAREAinCur = TRUE;PUBLIC BOOLEAN LYStripDotDotURLs = TRUE; /* Try to fix ../ in some URLs? */PUBLIC BOOLEAN LYForceSSLCookiesSecure = FALSE;PUBLIC BOOLEAN LYNoCc = FALSE;PUBLIC BOOLEAN LYPreparsedSource = FALSE; /* Show source as preparsed? */PUBLIC BOOLEAN LYPrependBaseToSource = TRUE;PUBLIC BOOLEAN LYPrependCharsetToSource = FALSE;PUBLIC BOOLEAN LYQuitDefaultYes = QUIT_DEFAULT_YES;/* These are declared in cutil.h for current freeWAIS libraries. - FM */#ifdef DECLARE_WAIS_LOGFILESPUBLIC char *log_file_name = NULL; /* for WAIS log file name in libWWW */PUBLIC FILE *logfile = NULL; /* for WAIS log file output in libWWW */#endif /* DECLARE_WAIS_LOGFILES */extern int HTNewsChunkSize; /* Number of news articles per chunk (HTNews.c) */extern int HTNewsMaxChunk; /* Max news articles before chunking (HTNews.c) */PRIVATE BOOLEAN anon_restrictions_set = FALSE;PRIVATE BOOLEAN stack_dump = FALSE;PRIVATE char *terminal = NULL;PRIVATE char *pgm;PRIVATE BOOLEAN number_links = FALSE;PRIVATE BOOLEAN LYPrependBase = FALSE;PRIVATE HTList *LYStdinArgs = NULL;PRIVATE void parse_arg PARAMS((char **arg, int *i, int argc));#ifndef VMSPUBLIC BOOLEAN LYNoCore = NO_FORCED_CORE_DUMP;PRIVATE void FatalProblem PARAMS((int sig));#endif /* !VMS */#if defined(USE_HASH) char *lynx_lss_file=NULL;#endif#ifdef __DJGPP__void reset_break(){ PDC_set_ctrl_break(init_ctrl_break[0]);}#endif /* __DJGPP__ */PRIVATE void free_lynx_globals NOARGS{ int i;#ifndef VMS FREE(list_format);#ifdef SYSLOG_REQUESTED_URLS FREE(syslog_txt);#endif /* SYSLOG_REQUESTED_URLS */#ifdef LYNXCGI_LINKS /* WebSter Mods -jkt */ FREE(LYCgiDocumentRoot);#endif /* LYNXCGI_LINKS */ FREE(lynx_version_putenv_command); FREE(NNTPSERVER_putenv_cmd); FREE(http_proxy_putenv_cmd); FREE(https_proxy_putenv_cmd); FREE(ftp_proxy_putenv_cmd); FREE(gopher_proxy_putenv_cmd); FREE(cso_proxy_putenv_cmd); FREE(news_proxy_putenv_cmd); FREE(newspost_proxy_putenv_cmd); FREE(newsreply_proxy_putenv_cmd); FREE(snews_proxy_putenv_cmd); FREE(snewspost_proxy_putenv_cmd); FREE(snewsreply_proxy_putenv_cmd); FREE(nntp_proxy_putenv_cmd); FREE(wais_proxy_putenv_cmd); FREE(finger_proxy_putenv_cmd); FREE(no_proxy_putenv_cmd);#endif /* !VMS */#ifdef VMS Define_VMSLogical("LYNX_VERSION", ""); FREE(mail_adrs); FREE(LYCSwingPath);#endif /* VMS */ FREE(LynxHome); FREE(startfile); FREE(helpfile); FREE(jumpprompt);#ifdef JUMPFILE FREE(jumpfile);#endif /* JUMPFILE */ FREE(indexfile); FREE(display); FREE(global_type_map); FREE(personal_type_map); FREE(global_extension_map); FREE(personal_extension_map); FREE(language);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -