Mercurial > vim
view runtime/doc/makehtml.awk @ 33299:4c975fa0a442 v9.0.1915
patch 9.0.1915: r_CTRL-C works differently in visual mode
Commit: https://github.com/vim/vim/commit/476733f3d06876c7ac105e064108c973a57984d3
Author: Christian Brabandt <cb@256bit.org>
Date: Tue Sep 19 20:41:51 2023 +0200
patch 9.0.1915: r_CTRL-C works differently in visual mode
Problem: r_CTRL-C works differently in visual mode
Solution: Make r_CTRL-C behave consistent in visual mode
in terminal and Windows GUI
in visual mode, r CTRL-C behaves strange in Unix like environments. It
seems to end visual mode, but still is waiting for few more chars,
however it never seems to replace it by any characters and eventually
just returns back into normal mode.
In contrast in Windows GUI mode, r_CTRL-C replaces in the selected area
all characters by a literal CTRL-C.
Not sure why it behaves like this. It seems in the Windows GUI, got_int
is not set and therefore behaves as if any other normal character has
been pressed.
So remove the special casing of what happens when got_int is set and
make it always behave like in Windows GUI mode. Add a test to verify it
always behaves like replacing in the selected area each selected
character by a literal CTRL-C.
closes: #13091
closes: #13112
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 19 Sep 2023 21:00:03 +0200 |
parents | 74e3316c1d5a |
children |
line wrap: on
line source
BEGIN { # some initialization variables asciiart="no"; wasset="no"; lineset=0; sample="no"; while ( getline ti <"tags.ref" > 0 ) { nf=split(ti,tag," "); tagkey[tag[1]]="yes";tagref[tag[1]]=tag[2]; } skip_word["and"]="yes"; skip_word["backspace"]="yes"; skip_word["beep"]="yes"; skip_word["bugs"]="yes"; skip_word["da"]="yes"; skip_word["end"]="yes"; skip_word["ftp"]="yes"; skip_word["go"]="yes"; skip_word["help"]="yes"; skip_word["home"]="yes"; skip_word["news"]="yes"; skip_word["index"]="yes"; skip_word["insert"]="yes"; skip_word["into"]="yes"; skip_word["put"]="yes"; skip_word["reference"]="yes"; skip_word["section"]="yes"; skip_word["space"]="yes"; skip_word["starting"]="yes"; skip_word["toggle"]="yes"; skip_word["various"]="yes"; skip_word["version"]="yes"; skip_word["is"]="yes"; } # # protect special chars # /[><&á]/ {gsub(/&/,"\\&");gsub(/>/,"\\>");gsub(/</,"\\<");gsub("á","\\á");} # # end of sample lines by non-blank in first column # sample == "yes" && substr($0,1,4) == "<" { sample = "no"; gsub(/^</, " "); } sample == "yes" && substr($0,1,1) != " " && substr($0,1,1) != " " && length($0) > 0 { sample = "no" } # # sample lines printed bold unless empty... # sample == "yes" && $0 =="" { print ""; next; } sample == "yes" && $0 !="" { print "<B>" $0 "</B>"; next; } # # start of sample lines in next line # $0 == ">" { sample = "yes"; print ""; next; } substr($0,length($0)-4,5) == " >" { sample = "yes"; gsub(/ >$/, ""); } # # header lines printed bold, colored # substr($0,length($0),1) == "~" { print "<B><FONT COLOR=\"PURPLE\">" substr($0,1,length($0)-1) "</FONT></B>"; next; } # #ad hoc code # /^"\|& / {gsub(/\|/,"\\|"); } / = b / {gsub(/ b /," \\b "); } # # one letter tag # /[ ]\*.\*[ ]/ {gsub(/\*/,"ZWWZ"); } # # isolated "*" # /[ ]\*[ ]/ {gsub(/ \* /," \\* "); gsub(/ \* /," \\* "); gsub(/ \* /," \\* "); gsub(/ \* /," \\* "); } # # tag start # /[ ]\*[^ ]/ {gsub(/ \*/," ZWWZ");gsub(/ \*/," ZWWZ");} /^\*[^ ]/ {gsub(/^\*/,"ZWWZ");} # # tag end # /[^ ]\*$/ {gsub(/\*$/,"ZWWZ");} /[^ \/ ]\*[ ]/ {gsub(/\*/,"ZWWZ");} # # isolated "|" # /[ ]\|[ ]/ {gsub(/ \| /," \\| "); gsub(/ \| /," \\| "); gsub(/ \| /," \\| "); gsub(/ \| /," \\| "); } /'\|'/ { gsub(/'\|'/,"'\\|'"); } /\^V\|/ {gsub(/\^V\|/,"^V\\|");} / \\\| / {gsub(/\|/,"\\|");} # # one letter pipes and "||" false pipe (digraphs) # /[ ]\|.\|[ ]/ && asciiart == "no" {gsub(/\|/,"YXXY"); } /^\|.\|[ ]/ {gsub(/\|/,"YXXY"); } /\|\|/ {gsub(/\|\|/,"\\|\\|"); } /^shellpipe/ {gsub(/\|/,"\\|"); } # # pipe start # /[ ]\|[^ ]/ && asciiart == "no" {gsub(/ \|/," YXXY"); gsub(/ \|/," YXXY");} /^\|[^ ]/ {gsub(/^\|/,"YXXY");} # # pipe end # /[^ ]\|$/ && asciiart == "no" {gsub(/\|$/,"YXXY");} /[^ ]\|[s ,.); ]/ && asciiart == "no" {gsub(/\|/,"YXXY");} /[^ ]\|]/ && asciiart == "no" {gsub(/\|/,"YXXY");} # # various # /'"/ {gsub(/'"/,"\\'\\"'");} /"/ {gsub(/"/,"\\"");} /%/ {gsub(/%/,"\\%");} NR == 1 { nf=split(FILENAME,f,".") print "<HTML>"; print "<HEAD>" if ( FILENAME == "mbyte.txt" ) { # needs utf-8 as uses many languages print "<META HTTP-EQUIV=\"Content-type\" content=\"text/html; charset=UTF-8\">"; } else { # common case - Latin1 print "<META HTTP-EQUIV=\"Content-type\" content=\"text/html; charset=ISO-8859-1\">"; } print "<TITLE>Vim documentation: " f[1] "</TITLE>"; print "</HEAD>"; print "<BODY BGCOLOR=\"#ffffff\">"; print "<H1>Vim documentation: " f[1] "</H1>"; print "<A NAME=\"top\"></A>"; if ( FILENAME != "help.txt" ) { print "<A HREF=\"index.html\">main help file</A>\n"; } print "<HR>"; print "<PRE>"; filename=f[1]".html"; } # set to a low value to test for few lines of text # NR == 99999 { exit; } # ignore underlines and tags substr($0,1,5) == " vim:" { next; } substr($0,1,4) == "vim:" { next; } # keep just whole lines of "-", "=" substr($0,1,3) == "===" && substr($0,75,1) != "=" { next; } substr($0,1,3) == "---" && substr($0,75,1) != "-" { next; } { nstar = split($0,s,"ZWWZ"); for ( i=2 ; i <= nstar ; i=i+2 ) { nbla=split(s[i],blata,"[ ]"); if ( nbla > 1 ) { gsub("ZWWZ","*"); nstar = split($0,s,"ZWWZ"); } } npipe = split($0,p,"YXXY"); for ( i=2 ; i <= npipe ; i=i+2 ) { nbla=split(p[i],blata,"[ ]"); if ( nbla > 1 ) { gsub("YXXY","|"); ntabs = split($0,p,"YXXY"); } } } FILENAME == "gui.txt" && asciiart == "no" \ && $0 ~ /\+----/ && $0 ~ /----\+/ { asciiart= "yes"; asciicnt=0; } FILENAME == "quotes.txt" && asciiart == "no" \ && $0 ~ /In summary:/ { asciiart= "yes"; asciicnt=0; } FILENAME == "usr_20.txt" && asciiart == "no" \ && $0 ~ /an empty line at the end:/ { asciiart= "yes"; asciicnt=0; } asciiart == "yes" && $0=="" { asciicnt++; } asciiart == "yes" && asciicnt == 2 { asciiart = "no"; } asciiart == "yes" { npipe = 1; } # { print NR " <=> " asciiart; } # # line contains "*" # nstar > 2 && npipe < 3 { printf("\n"); for ( i=1; i <= nstar ; i=i+2 ) { this=s[i]; put_this(); ii=i+1; nbla = split(s[ii],blata," "); if ( ii <= nstar ) { if ( nbla == 1 && substr(s[ii],length(s[ii]),1) != " " ) { printf("*<A NAME=\"%s\"></A>",s[ii]); printf("<B>%s</B>*",s[ii]); } else { printf("*%s*",s[ii]); } } } printf("\n"); next; } # # line contains "|" # npipe > 2 && nstar < 3 { if ( npipe%2 == 0 ) { for ( i=1; i < npipe ; i++ ) { gsub("ZWWZ","*",p[i]); printf("%s|",p[i]); } printf("%s\n",p[npipe]); next; } for ( i=1; i <= npipe ; i++ ) { if ( i % 2 == 1 ) { gsub("ZWWZ","*",p[i]); this=p[i]; put_this(); } else { nfn=split(p[i],f,"."); if ( nfn == 1 || f[2] == "" || f[1] == "" || length(f[2]) < 3 ) { find_tag1(); } else { if ( f[1] == "index" ) { printf "|<A HREF=\"vimindex.html\">" p[i] "</A>|"; } else { if ( f[1] == "help" ) { printf "|<A HREF=\"index.html\">" p[i] "</A>|"; } else { printf "|<A HREF=\"" f[1] ".html\">" p[i] "</A>|"; } } } } } printf("\n"); next; } # # line contains both "|" and "*" # npipe > 2 && nstar > 2 { printf("\n"); for ( j=1; j <= nstar ; j=j+2 ) { npipe = split(s[j],p,"YXXY"); if ( npipe > 1 ) { for ( np=1; np<=npipe; np=np+2 ) { this=p[np]; put_this(); i=np+1;find_tag1(); } } else { this=s[j]; put_this(); } jj=j+1; nbla = split(s[jj],blata," "); if ( jj <= nstar && nbla == 1 && s[jj] != "" ) { printf("*<A NAME=\"%s\"></A>",s[jj]); printf("<B>%s</B>*",s[jj]); } else { if ( s[jj] != "" ) { printf("*%s*",s[jj]); } } } printf("\n"); next; } # # line contains e-mail address john.doe@some.place.edu # $0 ~ /@/ && $0 ~ /[a-zA-Z0-9]@[a-z]/ \ { nemail=split($0,em," "); if ( substr($0,1,1) == " " ) { printf(" "); } for ( i=1; i <= nemail; i++ ) { if ( em[i] ~ /@/ ) { if ( substr(em[i],2,3) == "lt;" && substr(em[i],length(em[i])-2,3) == "gt;" ) { mailaddr=substr(em[i],5,length(em[i])-8); printf("<A HREF=\"mailto:%s\"><%s></A> ",mailaddr,mailaddr); } else { if ( substr(em[i],2,3) == "lt;" && substr(em[i],length(em[i])-3,3) == "gt;" ) { mailaddr=substr(em[i],5,length(em[i])-9); printf("<A HREF=\"mailto:%s\"><%s></A>%s ",mailaddr,mailaddr,substr(em[i],length(em[i]),1)); } else { printf("<A HREF=\"mailto:%s\">%s</A> ",em[i],em[i]); } } } else { printf("%s ",em[i]); } } #print "*** " NR " " FILENAME " - possible mail ref"; printf("\n"); next; } # # line contains http / ftp reference # $0 ~ /http:\/\// || $0 ~ /ftp:\/\// { gsub("URL:",""); gsub("<",""); gsub(">",""); gsub("\\(",""); gsub("\\)",""); nemail=split($0,em," "); for ( i=1; i <= nemail; i++ ) { if ( substr(em[i],1,5) == "http:" || substr(em[i],1,4) == "ftp:" ) { if ( substr(em[i],length(em[i]),1) != "." ) { printf(" <A HREF=\"%s\">%s</A>",em[i],em[i]); } else { em[i]=substr(em[i],1,length(em[i])-1); printf(" <A HREF=\"%s\">%s</A>.",em[i],em[i]); } } else { printf(" %s",em[i]); } } #print "*** " NR " " FILENAME " - possible http ref"; printf("\n"); next; } # # some lines contains just one "almost regular" "*"... # nstar == 2 { this=s[1]; put_this(); printf("*"); this=s[2]; put_this(); printf("\n"); next; } # # regular line # { ntabs = split($0,tb," "); for ( i=1; i < ntabs ; i++) { this=tb[i]; put_this(); printf(" "); } this=tb[ntabs]; put_this(); printf("\n"); } asciiart == "yes" && $0 ~ /\+-\+--/ \ && $0 ~ "scrollbar" { asciiart = "no"; } END { topback(); print "</PRE>\n</BODY>\n\n\n</HTML>"; } # # as main we keep index.txt (by default) # function topback () { if ( FILENAME != "tags" ) { if ( FILENAME != "help.txt" ) { printf("<A HREF=\"#top\">top</A> - "); printf("<A HREF=\"index.html\">main help file</A>\n"); } else { printf("<A HREF=\"#top\">top</A>\n"); } } } function find_tag1() { if ( p[i] == "" ) { return; } if ( tagkey[p[i]] == "yes" ) { which=tagref[p[i]]; put_href(); return; } # if not found, then we have a problem print "============================================" >>"errors.log"; print FILENAME ", line " NR ", pointer: >>" p[i] "<<" >>"errors.log"; print $0 >>"errors.log"; which="intro.html"; put_href(); } function see_tag() { # ad-hoc code: if ( atag == "\"--" || atag == "--\"" ) { return; } if_already(); if ( already == "yes" ) { printf("%s",aword); return; } allow_one_char="no"; find_tag2(); if ( done == "yes" ) { return; } rightchar=substr(atag,length(atag),1); if ( rightchar == "." \ || rightchar == "," \ || rightchar == ":" \ || rightchar == ";" \ || rightchar == "!" \ || rightchar == "?" \ || rightchar == ")" ) { atag=substr(atag,1,length(atag)-1); if_already(); if ( already == "yes" ) { printf("%s",aword); return; } find_tag2(); if ( done == "yes" ) { printf("%s",rightchar);return; } leftchar=substr(atag,1,1); lastbut1=substr(atag,length(atag),1); if ( leftchar == "'" && lastbut1 == "'" ) { allow_one_char="yes"; atag=substr(atag,2,length(atag)-2); if_already(); if ( already == "yes" ) { printf("%s",aword); return; } printf("%s",leftchar); aword=substr(atag,1,length(atag))""lastbut1""rightchar; find_tag2(); if ( done == "yes" ) { printf("%s%s",lastbut1,rightchar);return; } } } atag=aword; leftchar=substr(atag,1,1); if ( leftchar == "'" && rightchar == "'" ) { allow_one_char="yes"; atag=substr(atag,2,length(atag)-2); if ( atag == "<" ) { printf(" |%s|%s| ",atag,p[2]); } if_already(); if ( already == "yes" ) { printf("%s",aword); return; } printf("%s",leftchar); find_tag2(); if ( done == "yes" ) { printf("%s",rightchar);return; } printf("%s%s",atag,rightchar); return; } last2=substr(atag,length(atag)-1,2); first2=substr(atag,1,2); if ( first2 == "('" && last2 == "')" ) { allow_one_char="yes"; atag=substr(atag,3,length(atag)-4); if_already(); if ( already == "yes" ) { printf("%s",aword); return; } printf("%s",first2); find_tag2(); if ( done == "yes" ) { printf("%s",last2);return; } printf("%s%s",atag,last2); return; } if ( last2 == ".)" ) { atag=substr(atag,1,length(atag)-2); if_already(); if ( already == "yes" ) { printf("%s",aword); return; } find_tag2(); if ( done == "yes" ) { printf("%s",last2);return; } printf("%s%s",atag,last2); return; } if ( last2 == ")." ) { atag=substr(atag,1,length(atag)-2); find_tag2(); if_already(); if ( already == "yes" ) { printf("%s",aword); return; } if ( done == "yes" ) { printf("%s",last2);return; } printf("%s%s",atag,last2); return; } first6=substr(atag,1,6); last6=substr(atag,length(atag)-5,6); if ( last6 == atag ) { printf("%s",aword); return; } last6of7=substr(atag,length(atag)-6,6); if ( first6 == """ && last6of7 == """ && length(atag) > 12 ) { allow_one_char="yes"; atag=substr(atag,7,length(atag)-13); if_already(); if ( already == "yes" ) { printf("%s",aword); return; } printf("%s",first6); find_tag2(); if ( done == "yes" ) { printf(""%s",rightchar); return; } printf("%s"%s",atag,rightchar); return; } if ( first6 == """ && last6 != """ ) { allow_one_char="yes"; atag=substr(atag,7,length(atag)-6); if ( atag == "[" ) { printf(""%s",atag); return; } if ( atag == "." ) { printf(""%s",atag); return; } if ( atag == ":" ) { printf(""%s",atag); return; } if ( atag == "a" ) { printf(""%s",atag); return; } if ( atag == "A" ) { printf(""%s",atag); return; } if ( atag == "g" ) { printf(""%s",atag); return; } if_already(); if ( already == "yes" ) { printf(""%s",atag); return; } printf("%s",first6); find_tag2(); if ( done == "yes" ) { return; } printf("%s",atag); return; } if ( last6 == """ && first6 == """ ) { allow_one_char="yes"; atag=substr(atag,7,length(atag)-12); if_already(); if ( already == "yes" ) { printf("%s",aword); return; } printf("%s",first6); find_tag2(); if ( done == "yes" ) { printf("%s",last6);return; } printf("%s%s",atag,last6); return; } last6of7=substr(atag,length(atag)-6,6); if ( last6of7 == """ && first6 == """ ) { allow_one_char="yes"; atag=substr(atag,7,length(atag)-13); #printf("\natag=%s,aword=%s\n",atag,aword); if_already(); if ( already == "yes" ) { printf("%s",aword); return; } printf("%s",first6); find_tag2(); if ( done == "yes" ) { printf("%s%s",last6of7,rightchar);return; } printf("%s%s%s",atag,last6of7,rightchar); return; } printf("%s",aword); } function find_tag2() { done="no"; # no blanks present in a tag... ntags=split(atag,blata,"[ ]"); if ( ntags > 1 ) { return; } if ( ( allow_one_char == "no" ) && \ ( index("!#$%&'()+,-./0:;=?@ACINX\\[\\]^_`at\\{\\}~",atag) !=0 ) ) { return; } if ( skip_word[atag] == "yes" ) { return; } if ( wasset == "yes" && lineset == NR ) { wasset="no"; see_opt(); if ( done_opt == "yes" ) {return;} } if ( wasset == "yes" && lineset != NR ) { wasset="no"; } if ( atag == ":set" ) { wasset="yes"; lineset=NR; } if ( tagkey[atag] == "yes" ) { which=tagref[atag]; put_href2(); done="yes"; } } function find_tag3() { done="no"; # no blanks present in a tag... ntags=split(btag,blata,"[ ]"); if ( ntags > 1 ) { return; } if ( ( allow_one_char == "no" ) && \ ( index("!#$%&'()+,-./0:;=?@ACINX\\[\\]^_`at\\{\\}~",btag) !=0 ) ) { return; } if ( skip_word[btag] == "yes" ) { return; } if ( tagkey[btag] == "yes" ) { which=tagref[btag]; put_href3(); done="yes"; } } function put_href() { if ( p[i] == "" ) { return; } if ( which == FILENAME ) { printf("|<A HREF=\"#%s\">%s</A>|",p[i],p[i]); } else { nz=split(which,zz,"."); if ( zz[2] == "txt" || zz[1] == "tags" ) { printf("|<A HREF=\"%s.html#%s\">%s</A>|",zz[1],p[i],p[i]); } else { printf("|<A HREF=\"intro.html#%s\">%s</A>|",p[i],p[i]); } } } function put_href2() { if ( atag == "" ) { return; } if ( which == FILENAME ) { printf("<A HREF=\"#%s\">%s</A>",atag,atag); } else { nz=split(which,zz,"."); if ( zz[2] == "txt" || zz[1] == "tags" ) { printf("<A HREF=\"%s.html#%s\">%s</A>",zz[1],atag,atag); } else { printf("<A HREF=\"intro.html#%s\">%s</A>",atag,atag); } } } function put_href3() { if ( btag == "" ) { return; } if ( which == FILENAME ) { printf("<A HREF=\"#%s\">%s</A>",btag,btag2); } else { nz=split(which,zz,"."); if ( zz[2] == "txt" || zz[1] == "tags" ) { printf("<A HREF=\"%s.html#%s\">%s</A>",zz[1],btag,btag2); } else { printf("<A HREF=\"intro.html#%s\">%s</A>",btag,btag2); } } } function put_this() { ntab=split(this,ta," "); for ( nta=1 ; nta <= ntab ; nta++ ) { ata=ta[nta]; lata=length(ata); aword=""; for ( iata=1 ; iata <=lata ; iata++ ) { achar=substr(ata,iata,1); if ( achar != " " ) { aword=aword""achar; } else { if ( aword != "" ) { atag=aword; see_tag(); aword=""; printf(" "); } else { printf(" "); } } } if ( aword != "" ) { atag=aword; see_tag(); } if ( nta != ntab ) { printf(" "); } } } function if_already() { already="no"; if ( npipe < 2 ) { return; } if ( atag == ":au" && p[2] == ":autocmd" ) { already="yes";return; } for ( npp=2 ; npp <= npipe ; npp=npp+2 ) { if ( ( (index(p[npp],atag)) != 0 \ && length(p[npp]) > length(atag) \ && length(atag) >= 1 \ ) \ || (p[npp] == atag) \ ) { # printf("p=|%s|,tag=|%s| ",p[npp],atag); already="yes"; return; } } } function see_opt() { done_opt="no"; stag=atag; nfields = split(atag,tae,"="); if ( nfields > 1 ) { btag="'"tae[1]"'"; btag2=tae[1]; find_tag3(); if (done == "yes") { for ( ntae=2 ; ntae <= nfields ; ntae++ ) { printf("=%s",tae[ntae]); } atag=stag; done_opt="yes"; return; } btag=tae[1]; btag2=tae[1]; find_tag3(); if ( done=="yes" ) { for ( ntae=2 ; ntae <= nfields ; ntae++ ) { printf("=%s",tae[ntae]); } atag=stag; done_opt="yes"; return; } } nfields = split(atag,tae,"""); if ( nfields > 1 ) { btag="'"tae[1]"'"; btag2=tae[1]; find_tag3(); if (done == "yes") { printf("""); atag=stag; done_opt="yes"; return; } btag=tae[1]; btag2=tae[1]; find_tag3(); if (done == "yes") { printf("""); atag=stag; done_opt="yes"; return; } } btag="'"tae[1]"'"; btag2=tae[1]; find_tag3(); if (done == "yes") { atag=stag; done_opt="yes"; return; } btag=tae[1]; btag2=tae[1]; find_tag3(); if (done == "yes") { atag=stag; done_opt="yes"; return; } atag=stag; }