12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593 |
- This is /home/cyd/emacs/doc/lispref/../../info/elisp, produced by
- makeinfo version 4.13 from /home/cyd/emacs/doc/lispref/elisp.texi.
- This is the `GNU Emacs Lisp Reference Manual' corresponding to Emacs
- version 24.2.
- Copyright (C) 1990-1996, 1998-2012 Free Software Foundation, Inc.
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.3 or any later version published by the Free Software
- Foundation; with the Invariant Sections being "GNU General Public
- License," with the Front-Cover texts being "A GNU Manual," and
- with the Back-Cover Texts as in (a) below. A copy of the license
- is included in the section entitled "GNU Free Documentation
- License."
- (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
- modify this GNU manual. Buying copies from the FSF supports it in
- developing GNU and promoting software freedom."
- INFO-DIR-SECTION GNU Emacs Lisp
- START-INFO-DIR-ENTRY
- * Elisp: (elisp). The Emacs Lisp Reference Manual.
- END-INFO-DIR-ENTRY
- File: elisp, Node: Visibility of Frames, Next: Raising and Lowering, Prev: Input Focus, Up: Frames
- 29.10 Visibility of Frames
- ==========================
- A frame on a graphical display may be "visible", "invisible", or
- "iconified". If it is visible, its contents are displayed in the usual
- manner. If it is iconified, its contents are not displayed, but there
- is a little icon somewhere to bring the frame back into view (some
- window managers refer to this state as "minimized" rather than
- "iconified", but from Emacs' point of view they are the same thing).
- If a frame is invisible, it is not displayed at all.
- Visibility is meaningless on text terminals, since only the selected
- one is actually displayed in any case.
- -- Function: frame-visible-p frame
- This function returns the visibility status of frame FRAME. The
- value is `t' if FRAME is visible, `nil' if it is invisible, and
- `icon' if it is iconified.
- On a text terminal, all frames are considered visible, whether they
- are currently being displayed or not.
- -- Command: iconify-frame &optional frame
- This function iconifies frame FRAME. If you omit FRAME, it
- iconifies the selected frame.
- -- Command: make-frame-visible &optional frame
- This function makes frame FRAME visible. If you omit FRAME, it
- makes the selected frame visible. This does not raise the frame,
- but you can do that with `raise-frame' if you wish (*note Raising
- and Lowering::).
- -- Command: make-frame-invisible &optional frame force
- This function makes frame FRAME invisible. If you omit FRAME, it
- makes the selected frame invisible.
- Unless FORCE is non-`nil', this function refuses to make FRAME
- invisible if all other frames are invisible..
- The visibility status of a frame is also available as a frame
- parameter. You can read or change it as such. *Note Management
- Parameters::. The user can also iconify and deiconify frames with the
- window manager. This happens below the level at which Emacs can exert
- any control, but Emacs does provide events that you can use to keep
- track of such changes. *Note Misc Events::.
- File: elisp, Node: Raising and Lowering, Next: Frame Configurations, Prev: Visibility of Frames, Up: Frames
- 29.11 Raising and Lowering Frames
- =================================
- Most window systems use a desktop metaphor. Part of this metaphor is
- the idea that windows are stacked in a notional third dimension
- perpendicular to the screen surface, and thus ordered from "highest" to
- "lowest". Where two windows overlap, the one higher up covers the one
- underneath. Even a window at the bottom of the stack can be seen if no
- other window overlaps it.
- A window's place in this ordering is not fixed; in fact, users tend
- to change the order frequently. "Raising" a window means moving it
- "up", to the top of the stack. "Lowering" a window means moving it to
- the bottom of the stack. This motion is in the notional third
- dimension only, and does not change the position of the window on the
- screen.
- With Emacs, frames constitute the windows in the metaphor sketched
- above. You can raise and lower frames using these functions:
- -- Command: raise-frame &optional frame
- This function raises frame FRAME (default, the selected frame).
- If FRAME is invisible or iconified, this makes it visible.
- -- Command: lower-frame &optional frame
- This function lowers frame FRAME (default, the selected frame).
- -- User Option: minibuffer-auto-raise
- If this is non-`nil', activation of the minibuffer raises the frame
- that the minibuffer window is in.
- You can also enable auto-raise (raising automatically when a frame is
- selected) or auto-lower (lowering automatically when it is deselected)
- for any frame using frame parameters. *Note Management Parameters::.
- File: elisp, Node: Frame Configurations, Next: Mouse Tracking, Prev: Raising and Lowering, Up: Frames
- 29.12 Frame Configurations
- ==========================
- A "frame configuration" records the current arrangement of frames, all
- their properties, and the window configuration of each one. (*Note
- Window Configurations::.)
- -- Function: current-frame-configuration
- This function returns a frame configuration list that describes
- the current arrangement of frames and their contents.
- -- Function: set-frame-configuration configuration &optional nodelete
- This function restores the state of frames described in
- CONFIGURATION. However, this function does not restore deleted
- frames.
- Ordinarily, this function deletes all existing frames not listed in
- CONFIGURATION. But if NODELETE is non-`nil', the unwanted frames
- are iconified instead.
- File: elisp, Node: Mouse Tracking, Next: Mouse Position, Prev: Frame Configurations, Up: Frames
- 29.13 Mouse Tracking
- ====================
- Sometimes it is useful to "track" the mouse, which means to display
- something to indicate where the mouse is and move the indicator as the
- mouse moves. For efficient mouse tracking, you need a way to wait until
- the mouse actually moves.
- The convenient way to track the mouse is to ask for events to
- represent mouse motion. Then you can wait for motion by waiting for an
- event. In addition, you can easily handle any other sorts of events
- that may occur. That is useful, because normally you don't want to
- track the mouse forever--only until some other event, such as the
- release of a button.
- -- Special Form: track-mouse body...
- This special form executes BODY, with generation of mouse motion
- events enabled. Typically, BODY would use `read-event' to read
- the motion events and modify the display accordingly. *Note
- Motion Events::, for the format of mouse motion events.
- The value of `track-mouse' is that of the last form in BODY. You
- should design BODY to return when it sees the up-event that
- indicates the release of the button, or whatever kind of event
- means it is time to stop tracking.
- The usual purpose of tracking mouse motion is to indicate on the
- screen the consequences of pushing or releasing a button at the current
- position.
- In many cases, you can avoid the need to track the mouse by using
- the `mouse-face' text property (*note Special Properties::). That
- works at a much lower level and runs more smoothly than Lisp-level
- mouse tracking.
- File: elisp, Node: Mouse Position, Next: Pop-Up Menus, Prev: Mouse Tracking, Up: Frames
- 29.14 Mouse Position
- ====================
- The functions `mouse-position' and `set-mouse-position' give access to
- the current position of the mouse.
- -- Function: mouse-position
- This function returns a description of the position of the mouse.
- The value looks like `(FRAME X . Y)', where X and Y are integers
- giving the position in characters relative to the top left corner
- of the inside of FRAME.
- -- Variable: mouse-position-function
- If non-`nil', the value of this variable is a function for
- `mouse-position' to call. `mouse-position' calls this function
- just before returning, with its normal return value as the sole
- argument, and it returns whatever this function returns to it.
- This abnormal hook exists for the benefit of packages like
- `xt-mouse.el' that need to do mouse handling at the Lisp level.
- -- Function: set-mouse-position frame x y
- This function "warps the mouse" to position X, Y in frame FRAME.
- The arguments X and Y are integers, giving the position in
- characters relative to the top left corner of the inside of FRAME.
- If FRAME is not visible, this function does nothing. The return
- value is not significant.
- -- Function: mouse-pixel-position
- This function is like `mouse-position' except that it returns
- coordinates in units of pixels rather than units of characters.
- -- Function: set-mouse-pixel-position frame x y
- This function warps the mouse like `set-mouse-position' except that
- X and Y are in units of pixels rather than units of characters.
- These coordinates are not required to be within the frame.
- If FRAME is not visible, this function does nothing. The return
- value is not significant.
- -- Function: frame-pointer-visible-p &optional frame
- This predicate function returns non-`nil' if the mouse pointer
- displayed on FRAME is visible; otherwise it returns `nil'. FRAME
- omitted or `nil' means the selected frame. This is useful when
- `make-pointer-invisible' is set to `t': it allows to know if the
- pointer has been hidden. *Note Mouse Avoidance: (emacs)Mouse
- Avoidance.
- File: elisp, Node: Pop-Up Menus, Next: Dialog Boxes, Prev: Mouse Position, Up: Frames
- 29.15 Pop-Up Menus
- ==================
- When using a window system, a Lisp program can pop up a menu so that
- the user can choose an alternative with the mouse.
- -- Function: x-popup-menu position menu
- This function displays a pop-up menu and returns an indication of
- what selection the user makes.
- The argument POSITION specifies where on the screen to put the top
- left corner of the menu. It can be either a mouse button event
- (which says to put the menu where the user actuated the button) or
- a list of this form:
- ((XOFFSET YOFFSET) WINDOW)
- where XOFFSET and YOFFSET are coordinates, measured in pixels,
- counting from the top left corner of WINDOW. WINDOW may be a
- window or a frame.
- If POSITION is `t', it means to use the current mouse position.
- If POSITION is `nil', it means to precompute the key binding
- equivalents for the keymaps specified in MENU, without actually
- displaying or popping up the menu.
- The argument MENU says what to display in the menu. It can be a
- keymap or a list of keymaps (*note Menu Keymaps::). In this case,
- the return value is the list of events corresponding to the user's
- choice. This list has more than one element if the choice
- occurred in a submenu. (Note that `x-popup-menu' does not
- actually execute the command bound to that sequence of events.)
- On toolkits that support menu titles, the title is taken from the
- prompt string of MENU if MENU is a keymap, or from the prompt
- string of the first keymap in MENU if it is a list of keymaps
- (*note Defining Menus::).
- Alternatively, MENU can have the following form:
- (TITLE PANE1 PANE2...)
- where each pane is a list of form
- (TITLE ITEM1 ITEM2...)
- Each item should normally be a cons cell `(LINE . VALUE)', where
- LINE is a string, and VALUE is the value to return if that LINE is
- chosen. An item can also be a string; this makes a non-selectable
- line in the menu.
- If the user gets rid of the menu without making a valid choice, for
- instance by clicking the mouse away from a valid choice or by
- typing keyboard input, then this normally results in a quit and
- `x-popup-menu' does not return. But if POSITION is a mouse button
- event (indicating that the user invoked the menu with the mouse)
- then no quit occurs and `x-popup-menu' returns `nil'.
- *Usage note:* Don't use `x-popup-menu' to display a menu if you
- could do the job with a prefix key defined with a menu keymap. If you
- use a menu keymap to implement a menu, `C-h c' and `C-h a' can see the
- individual items in that menu and provide help for them. If instead
- you implement the menu by defining a command that calls `x-popup-menu',
- the help facilities cannot know what happens inside that command, so
- they cannot give any help for the menu's items.
- The menu bar mechanism, which lets you switch between submenus by
- moving the mouse, cannot look within the definition of a command to see
- that it calls `x-popup-menu'. Therefore, if you try to implement a
- submenu using `x-popup-menu', it cannot work with the menu bar in an
- integrated fashion. This is why all menu bar submenus are implemented
- with menu keymaps within the parent menu, and never with
- `x-popup-menu'. *Note Menu Bar::.
- If you want a menu bar submenu to have contents that vary, you should
- still use a menu keymap to implement it. To make the contents vary, add
- a hook function to `menu-bar-update-hook' to update the contents of the
- menu keymap as necessary.
- File: elisp, Node: Dialog Boxes, Next: Pointer Shape, Prev: Pop-Up Menus, Up: Frames
- 29.16 Dialog Boxes
- ==================
- A dialog box is a variant of a pop-up menu--it looks a little
- different, it always appears in the center of a frame, and it has just
- one level and one or more buttons. The main use of dialog boxes is for
- asking questions that the user can answer with "yes", "no", and a few
- other alternatives. With a single button, they can also force the user
- to acknowledge important information. The functions `y-or-n-p' and
- `yes-or-no-p' use dialog boxes instead of the keyboard, when called
- from commands invoked by mouse clicks.
- -- Function: x-popup-dialog position contents &optional header
- This function displays a pop-up dialog box and returns an
- indication of what selection the user makes. The argument
- CONTENTS specifies the alternatives to offer; it has this format:
- (TITLE (STRING . VALUE)...)
- which looks like the list that specifies a single pane for
- `x-popup-menu'.
- The return value is VALUE from the chosen alternative.
- As for `x-popup-menu', an element of the list may be just a string
- instead of a cons cell `(STRING . VALUE)'. That makes a box that
- cannot be selected.
- If `nil' appears in the list, it separates the left-hand items from
- the right-hand items; items that precede the `nil' appear on the
- left, and items that follow the `nil' appear on the right. If you
- don't include a `nil' in the list, then approximately half the
- items appear on each side.
- Dialog boxes always appear in the center of a frame; the argument
- POSITION specifies which frame. The possible values are as in
- `x-popup-menu', but the precise coordinates or the individual
- window don't matter; only the frame matters.
- If HEADER is non-`nil', the frame title for the box is
- `Information', otherwise it is `Question'. The former is used for
- `message-box' (*note message-box::).
- In some configurations, Emacs cannot display a real dialog box; so
- instead it displays the same items in a pop-up menu in the center
- of the frame.
- If the user gets rid of the dialog box without making a valid
- choice, for instance using the window manager, then this produces
- a quit and `x-popup-dialog' does not return.
- File: elisp, Node: Pointer Shape, Next: Window System Selections, Prev: Dialog Boxes, Up: Frames
- 29.17 Pointer Shape
- ===================
- You can specify the mouse pointer style for particular text or images
- using the `pointer' text property, and for images with the `:pointer'
- and `:map' image properties. The values you can use in these
- properties are `text' (or `nil'), `arrow', `hand', `vdrag', `hdrag',
- `modeline', and `hourglass'. `text' stands for the usual mouse pointer
- style used over text.
- Over void parts of the window (parts that do not correspond to any
- of the buffer contents), the mouse pointer usually uses the `arrow'
- style, but you can specify a different style (one of those above) by
- setting `void-text-area-pointer'.
- -- User Option: void-text-area-pointer
- This variable specifies the mouse pointer style for void text
- areas. These include the areas after the end of a line or below
- the last line in the buffer. The default is to use the `arrow'
- (non-text) pointer style.
- When using X, you can specify what the `text' pointer style really
- looks like by setting the variable `x-pointer-shape'.
- -- Variable: x-pointer-shape
- This variable specifies the pointer shape to use ordinarily in the
- Emacs frame, for the `text' pointer style.
- -- Variable: x-sensitive-text-pointer-shape
- This variable specifies the pointer shape to use when the mouse is
- over mouse-sensitive text.
- These variables affect newly created frames. They do not normally
- affect existing frames; however, if you set the mouse color of a frame,
- that also installs the current value of those two variables. *Note
- Font and Color Parameters::.
- The values you can use, to specify either of these pointer shapes,
- are defined in the file `lisp/term/x-win.el'. Use `M-x apropos <RET>
- x-pointer <RET>' to see a list of them.
- File: elisp, Node: Window System Selections, Next: Drag and Drop, Prev: Pointer Shape, Up: Frames
- 29.18 Window System Selections
- ==============================
- In the X window system, data can be transferred between different
- applications by means of "selections". X defines an arbitrary number
- of "selection types", each of which can store its own data; however,
- only three are commonly used: the "clipboard", "primary selection", and
- "secondary selection". *Note Cut and Paste: (emacs)Cut and Paste, for
- Emacs commands that make use of these selections. This section
- documents the low-level functions for reading and setting X selections.
- -- Command: x-set-selection type data
- This function sets an X selection. It takes two arguments: a
- selection type TYPE, and the value to assign to it, DATA.
- TYPE should be a symbol; it is usually one of `PRIMARY',
- `SECONDARY' or `CLIPBOARD'. These are symbols with upper-case
- names, in accord with X Window System conventions. If TYPE is
- `nil', that stands for `PRIMARY'.
- If DATA is `nil', it means to clear out the selection. Otherwise,
- DATA may be a string, a symbol, an integer (or a cons of two
- integers or list of two integers), an overlay, or a cons of two
- markers pointing to the same buffer. An overlay or a pair of
- markers stands for text in the overlay or between the markers.
- The argument DATA may also be a vector of valid non-vector
- selection values.
- This function returns DATA.
- -- Function: x-get-selection &optional type data-type
- This function accesses selections set up by Emacs or by other X
- clients. It takes two optional arguments, TYPE and DATA-TYPE.
- The default for TYPE, the selection type, is `PRIMARY'.
- The DATA-TYPE argument specifies the form of data conversion to
- use, to convert the raw data obtained from another X client into
- Lisp data. Meaningful values include `TEXT', `STRING',
- `UTF8_STRING', `TARGETS', `LENGTH', `DELETE', `FILE_NAME',
- `CHARACTER_POSITION', `NAME', `LINE_NUMBER', `COLUMN_NUMBER',
- `OWNER_OS', `HOST_NAME', `USER', `CLASS', `ATOM', and `INTEGER'.
- (These are symbols with upper-case names in accord with X
- conventions.) The default for DATA-TYPE is `STRING'.
- -- User Option: selection-coding-system
- This variable specifies the coding system to use when reading and
- writing selections or the clipboard. *Note Coding Systems::. The
- default is `compound-text-with-extensions', which converts to the
- text representation that X11 normally uses.
- When Emacs runs on MS-Windows, it does not implement X selections in
- general, but it does support the clipboard. `x-get-selection' and
- `x-set-selection' on MS-Windows support the text data type only; if the
- clipboard holds other types of data, Emacs treats the clipboard as
- empty.
- File: elisp, Node: Drag and Drop, Next: Color Names, Prev: Window System Selections, Up: Frames
- 29.19 Drag and Drop
- ===================
- When a user drags something from another application over Emacs, that
- other application expects Emacs to tell it if Emacs can handle the data
- that is dragged. The variable `x-dnd-test-function' is used by Emacs
- to determine what to reply. The default value is
- `x-dnd-default-test-function' which accepts drops if the type of the
- data to be dropped is present in `x-dnd-known-types'. You can
- customize `x-dnd-test-function' and/or `x-dnd-known-types' if you want
- Emacs to accept or reject drops based on some other criteria.
- If you want to change the way Emacs handles drop of different types
- or add a new type, customize `x-dnd-types-alist'. This requires
- detailed knowledge of what types other applications use for drag and
- drop.
- When an URL is dropped on Emacs it may be a file, but it may also be
- another URL type (ftp, http, etc.). Emacs first checks
- `dnd-protocol-alist' to determine what to do with the URL. If there is
- no match there and if `browse-url-browser-function' is an alist, Emacs
- looks for a match there. If no match is found the text for the URL is
- inserted. If you want to alter Emacs behavior, you can customize these
- variables.
- File: elisp, Node: Color Names, Next: Text Terminal Colors, Prev: Drag and Drop, Up: Frames
- 29.20 Color Names
- =================
- A color name is text (usually in a string) that specifies a color.
- Symbolic names such as `black', `white', `red', etc., are allowed; use
- `M-x list-colors-display' to see a list of defined names. You can also
- specify colors numerically in forms such as `#RGB' and `RGB:R/G/B',
- where R specifies the red level, G specifies the green level, and B
- specifies the blue level. You can use either one, two, three, or four
- hex digits for R; then you must use the same number of hex digits for
- all G and B as well, making either 3, 6, 9 or 12 hex digits in all.
- (See the documentation of the X Window System for more details about
- numerical RGB specification of colors.)
- These functions provide a way to determine which color names are
- valid, and what they look like. In some cases, the value depends on the
- "selected frame", as described below; see *note Input Focus::, for the
- meaning of the term "selected frame".
- To read user input of color names with completion, use `read-color'
- (*note read-color: High-Level Completion.).
- -- Function: color-defined-p color &optional frame
- This function reports whether a color name is meaningful. It
- returns `t' if so; otherwise, `nil'. The argument FRAME says
- which frame's display to ask about; if FRAME is omitted or `nil',
- the selected frame is used.
- Note that this does not tell you whether the display you are using
- really supports that color. When using X, you can ask for any
- defined color on any kind of display, and you will get some
- result--typically, the closest it can do. To determine whether a
- frame can really display a certain color, use `color-supported-p'
- (see below).
- This function used to be called `x-color-defined-p', and that name
- is still supported as an alias.
- -- Function: defined-colors &optional frame
- This function returns a list of the color names that are defined
- and supported on frame FRAME (default, the selected frame). If
- FRAME does not support colors, the value is `nil'.
- This function used to be called `x-defined-colors', and that name
- is still supported as an alias.
- -- Function: color-supported-p color &optional frame background-p
- This returns `t' if FRAME can really display the color COLOR (or
- at least something close to it). If FRAME is omitted or `nil',
- the question applies to the selected frame.
- Some terminals support a different set of colors for foreground and
- background. If BACKGROUND-P is non-`nil', that means you are
- asking whether COLOR can be used as a background; otherwise you
- are asking whether it can be used as a foreground.
- The argument COLOR must be a valid color name.
- -- Function: color-gray-p color &optional frame
- This returns `t' if COLOR is a shade of gray, as defined on
- FRAME's display. If FRAME is omitted or `nil', the question
- applies to the selected frame. If COLOR is not a valid color
- name, this function returns `nil'.
- -- Function: color-values color &optional frame
- This function returns a value that describes what COLOR should
- ideally look like on FRAME. If COLOR is defined, the value is a
- list of three integers, which give the amount of red, the amount
- of green, and the amount of blue. Each integer ranges in
- principle from 0 to 65535, but some displays may not use the full
- range. This three-element list is called the "rgb values" of the
- color.
- If COLOR is not defined, the value is `nil'.
- (color-values "black")
- => (0 0 0)
- (color-values "white")
- => (65280 65280 65280)
- (color-values "red")
- => (65280 0 0)
- (color-values "pink")
- => (65280 49152 51968)
- (color-values "hungry")
- => nil
- The color values are returned for FRAME's display. If FRAME is
- omitted or `nil', the information is returned for the selected
- frame's display. If the frame cannot display colors, the value is
- `nil'.
- This function used to be called `x-color-values', and that name is
- still supported as an alias.
- File: elisp, Node: Text Terminal Colors, Next: Resources, Prev: Color Names, Up: Frames
- 29.21 Text Terminal Colors
- ==========================
- Text terminals usually support only a small number of colors, and the
- computer uses small integers to select colors on the terminal. This
- means that the computer cannot reliably tell what the selected color
- looks like; instead, you have to inform your application which small
- integers correspond to which colors. However, Emacs does know the
- standard set of colors and will try to use them automatically.
- The functions described in this section control how terminal colors
- are used by Emacs.
- Several of these functions use or return "rgb values", described in
- *note Color Names::.
- These functions accept a display (either a frame or the name of a
- terminal) as an optional argument. We hope in the future to make Emacs
- support different colors on different text terminals; then this
- argument will specify which terminal to operate on (the default being
- the selected frame's terminal; *note Input Focus::). At present,
- though, the FRAME argument has no effect.
- -- Function: tty-color-define name number &optional rgb frame
- This function associates the color name NAME with color number
- NUMBER on the terminal.
- The optional argument RGB, if specified, is an rgb value, a list
- of three numbers that specify what the color actually looks like.
- If you do not specify RGB, then this color cannot be used by
- `tty-color-approximate' to approximate other colors, because Emacs
- will not know what it looks like.
- -- Function: tty-color-clear &optional frame
- This function clears the table of defined colors for a text
- terminal.
- -- Function: tty-color-alist &optional frame
- This function returns an alist recording the known colors
- supported by a text terminal.
- Each element has the form `(NAME NUMBER . RGB)' or `(NAME
- NUMBER)'. Here, NAME is the color name, NUMBER is the number used
- to specify it to the terminal. If present, RGB is a list of three
- color values (for red, green, and blue) that says what the color
- actually looks like.
- -- Function: tty-color-approximate rgb &optional frame
- This function finds the closest color, among the known colors
- supported for DISPLAY, to that described by the rgb value RGB (a
- list of color values). The return value is an element of
- `tty-color-alist'.
- -- Function: tty-color-translate color &optional frame
- This function finds the closest color to COLOR among the known
- colors supported for DISPLAY and returns its index (an integer).
- If the name COLOR is not defined, the value is `nil'.
- File: elisp, Node: Resources, Next: Display Feature Testing, Prev: Text Terminal Colors, Up: Frames
- 29.22 X Resources
- =================
- This section describes some of the functions and variables for querying
- and using X resources, or their equivalent on your operating system.
- *Note X Resources: (emacs)X Resources, for more information about X
- resources.
- -- Function: x-get-resource attribute class &optional component
- subclass
- The function `x-get-resource' retrieves a resource value from the X
- Window defaults database.
- Resources are indexed by a combination of a "key" and a "class".
- This function searches using a key of the form
- `INSTANCE.ATTRIBUTE' (where INSTANCE is the name under which Emacs
- was invoked), and using `Emacs.CLASS' as the class.
- The optional arguments COMPONENT and SUBCLASS add to the key and
- the class, respectively. You must specify both of them or neither.
- If you specify them, the key is `INSTANCE.COMPONENT.ATTRIBUTE',
- and the class is `Emacs.CLASS.SUBCLASS'.
- -- Variable: x-resource-class
- This variable specifies the application name that `x-get-resource'
- should look up. The default value is `"Emacs"'. You can examine X
- resources for application names other than "Emacs" by binding this
- variable to some other string, around a call to `x-get-resource'.
- -- Variable: x-resource-name
- This variable specifies the instance name that `x-get-resource'
- should look up. The default value is the name Emacs was invoked
- with, or the value specified with the `-name' or `-rn' switches.
- To illustrate some of the above, suppose that you have the line:
- xterm.vt100.background: yellow
- in your X resources file (whose name is usually `~/.Xdefaults' or
- `~/.Xresources'). Then:
- (let ((x-resource-class "XTerm") (x-resource-name "xterm"))
- (x-get-resource "vt100.background" "VT100.Background"))
- => "yellow"
- (let ((x-resource-class "XTerm") (x-resource-name "xterm"))
- (x-get-resource "background" "VT100" "vt100" "Background"))
- => "yellow"
- -- Variable: inhibit-x-resources
- If this variable is non-`nil', Emacs does not look up X resources,
- and X resources do not have any effect when creating new frames.
- File: elisp, Node: Display Feature Testing, Prev: Resources, Up: Frames
- 29.23 Display Feature Testing
- =============================
- The functions in this section describe the basic capabilities of a
- particular display. Lisp programs can use them to adapt their behavior
- to what the display can do. For example, a program that ordinarily uses
- a popup menu could use the minibuffer if popup menus are not supported.
- The optional argument DISPLAY in these functions specifies which
- display to ask the question about. It can be a display name, a frame
- (which designates the display that frame is on), or `nil' (which refers
- to the selected frame's display, *note Input Focus::).
- *Note Color Names::, *note Text Terminal Colors::, for other
- functions to obtain information about displays.
- -- Function: display-popup-menus-p &optional display
- This function returns `t' if popup menus are supported on DISPLAY,
- `nil' if not. Support for popup menus requires that the mouse be
- available, since the user cannot choose menu items without a mouse.
- -- Function: display-graphic-p &optional display
- This function returns `t' if DISPLAY is a graphic display capable
- of displaying several frames and several different fonts at once.
- This is true for displays that use a window system such as X, and
- false for text terminals.
- -- Function: display-mouse-p &optional display
- This function returns `t' if DISPLAY has a mouse available, `nil'
- if not.
- -- Function: display-color-p &optional display
- This function returns `t' if the screen is a color screen. It
- used to be called `x-display-color-p', and that name is still
- supported as an alias.
- -- Function: display-grayscale-p &optional display
- This function returns `t' if the screen can display shades of gray.
- (All color displays can do this.)
- -- Function: display-supports-face-attributes-p attributes &optional
- display
- This function returns non-`nil' if all the face attributes in
- ATTRIBUTES are supported (*note Face Attributes::).
- The definition of `supported' is somewhat heuristic, but basically
- means that a face containing all the attributes in ATTRIBUTES,
- when merged with the default face for display, can be represented
- in a way that's
- 1. different in appearance than the default face, and
- 2. `close in spirit' to what the attributes specify, if not
- exact.
- Point (2) implies that a `:weight black' attribute will be
- satisfied by any display that can display bold, as will
- `:foreground "yellow"' as long as some yellowish color can be
- displayed, but `:slant italic' will _not_ be satisfied by the tty
- display code's automatic substitution of a `dim' face for italic.
- -- Function: display-selections-p &optional display
- This function returns `t' if DISPLAY supports selections.
- Windowed displays normally support selections, but they may also be
- supported in some other cases.
- -- Function: display-images-p &optional display
- This function returns `t' if DISPLAY can display images. Windowed
- displays ought in principle to handle images, but some systems
- lack the support for that. On a display that does not support
- images, Emacs cannot display a tool bar.
- -- Function: display-screens &optional display
- This function returns the number of screens associated with the
- display.
- -- Function: display-pixel-height &optional display
- This function returns the height of the screen in pixels. On a
- character terminal, it gives the height in characters.
- For graphical terminals, note that on "multi-monitor" setups this
- refers to the pixel width for all physical monitors associated with
- DISPLAY. *Note Multiple Terminals::.
- -- Function: display-pixel-width &optional display
- This function returns the width of the screen in pixels. On a
- character terminal, it gives the width in characters.
- For graphical terminals, note that on "multi-monitor" setups this
- refers to the pixel width for all physical monitors associated with
- DISPLAY. *Note Multiple Terminals::.
- -- Function: display-mm-height &optional display
- This function returns the height of the screen in millimeters, or
- `nil' if Emacs cannot get that information.
- -- Function: display-mm-width &optional display
- This function returns the width of the screen in millimeters, or
- `nil' if Emacs cannot get that information.
- -- User Option: display-mm-dimensions-alist
- This variable allows the user to specify the dimensions of
- graphical displays returned by `display-mm-height' and
- `display-mm-width' in case the system provides incorrect values.
- -- Function: display-backing-store &optional display
- This function returns the backing store capability of the display.
- Backing store means recording the pixels of windows (and parts of
- windows) that are not exposed, so that when exposed they can be
- displayed very quickly.
- Values can be the symbols `always', `when-mapped', or
- `not-useful'. The function can also return `nil' when the
- question is inapplicable to a certain kind of display.
- -- Function: display-save-under &optional display
- This function returns non-`nil' if the display supports the
- SaveUnder feature. That feature is used by pop-up windows to save
- the pixels they obscure, so that they can pop down quickly.
- -- Function: display-planes &optional display
- This function returns the number of planes the display supports.
- This is typically the number of bits per pixel. For a tty
- display, it is log to base two of the number of colors supported.
- -- Function: display-visual-class &optional display
- This function returns the visual class for the screen. The value
- is one of the symbols `static-gray' (a limited, unchangeable number
- of grays), `gray-scale' (a full range of grays), `static-color' (a
- limited, unchangeable number of colors), `pseudo-color' (a limited
- number of colors), `true-color' (a full range of colors), and
- `direct-color' (a full range of colors).
- -- Function: display-color-cells &optional display
- This function returns the number of color cells the screen
- supports.
- These functions obtain additional information specifically about X
- displays.
- -- Function: x-server-version &optional display
- This function returns the list of version numbers of the X server
- running the display. The value is a list of three integers: the
- major and minor version numbers of the X protocol, and the
- distributor-specific release number of the X server software
- itself.
- -- Function: x-server-vendor &optional display
- This function returns the "vendor" that provided the X server
- software (as a string). Really this means whoever distributes the
- X server.
- When the developers of X labeled software distributors as
- "vendors", they showed their false assumption that no system could
- ever be developed and distributed noncommercially.
- File: elisp, Node: Positions, Next: Markers, Prev: Frames, Up: Top
- 30 Positions
- ************
- A "position" is the index of a character in the text of a buffer. More
- precisely, a position identifies the place between two characters (or
- before the first character, or after the last character), so we can
- speak of the character before or after a given position. However, we
- often speak of the character "at" a position, meaning the character
- after that position.
- Positions are usually represented as integers starting from 1, but
- can also be represented as "markers"--special objects that relocate
- automatically when text is inserted or deleted so they stay with the
- surrounding characters. Functions that expect an argument to be a
- position (an integer), but accept a marker as a substitute, normally
- ignore which buffer the marker points into; they convert the marker to
- an integer, and use that integer, exactly as if you had passed the
- integer as the argument, even if the marker points to the "wrong"
- buffer. A marker that points nowhere cannot convert to an integer;
- using it instead of an integer causes an error. *Note Markers::.
- See also the "field" feature (*note Fields::), which provides
- functions that are used by many cursor-motion commands.
- * Menu:
- * Point:: The special position where editing takes place.
- * Motion:: Changing point.
- * Excursions:: Temporary motion and buffer changes.
- * Narrowing:: Restricting editing to a portion of the buffer.
- File: elisp, Node: Point, Next: Motion, Up: Positions
- 30.1 Point
- ==========
- "Point" is a special buffer position used by many editing commands,
- including the self-inserting typed characters and text insertion
- functions. Other commands move point through the text to allow editing
- and insertion at different places.
- Like other positions, point designates a place between two characters
- (or before the first character, or after the last character), rather
- than a particular character. Usually terminals display the cursor over
- the character that immediately follows point; point is actually before
- the character on which the cursor sits.
- The value of point is a number no less than 1, and no greater than
- the buffer size plus 1. If narrowing is in effect (*note Narrowing::),
- then point is constrained to fall within the accessible portion of the
- buffer (possibly at one end of it).
- Each buffer has its own value of point, which is independent of the
- value of point in other buffers. Each window also has a value of point,
- which is independent of the value of point in other windows on the same
- buffer. This is why point can have different values in various windows
- that display the same buffer. When a buffer appears in only one window,
- the buffer's point and the window's point normally have the same value,
- so the distinction is rarely important. *Note Window Point::, for more
- details.
- -- Function: point
- This function returns the value of point in the current buffer, as
- an integer.
- (point)
- => 175
- -- Function: point-min
- This function returns the minimum accessible value of point in the
- current buffer. This is normally 1, but if narrowing is in
- effect, it is the position of the start of the region that you
- narrowed to. (*Note Narrowing::.)
- -- Function: point-max
- This function returns the maximum accessible value of point in the
- current buffer. This is `(1+ (buffer-size))', unless narrowing is
- in effect, in which case it is the position of the end of the
- region that you narrowed to. (*Note Narrowing::.)
- -- Function: buffer-end flag
- This function returns `(point-max)' if FLAG is greater than 0,
- `(point-min)' otherwise. The argument FLAG must be a number.
- -- Function: buffer-size &optional buffer
- This function returns the total number of characters in the current
- buffer. In the absence of any narrowing (*note Narrowing::),
- `point-max' returns a value one larger than this.
- If you specify a buffer, BUFFER, then the value is the size of
- BUFFER.
- (buffer-size)
- => 35
- (point-max)
- => 36
- File: elisp, Node: Motion, Next: Excursions, Prev: Point, Up: Positions
- 30.2 Motion
- ===========
- Motion functions change the value of point, either relative to the
- current value of point, relative to the beginning or end of the buffer,
- or relative to the edges of the selected window. *Note Point::.
- * Menu:
- * Character Motion:: Moving in terms of characters.
- * Word Motion:: Moving in terms of words.
- * Buffer End Motion:: Moving to the beginning or end of the buffer.
- * Text Lines:: Moving in terms of lines of text.
- * Screen Lines:: Moving in terms of lines as displayed.
- * List Motion:: Moving by parsing lists and sexps.
- * Skipping Characters:: Skipping characters belonging to a certain set.
- File: elisp, Node: Character Motion, Next: Word Motion, Up: Motion
- 30.2.1 Motion by Characters
- ---------------------------
- These functions move point based on a count of characters. `goto-char'
- is the fundamental primitive; the other functions use that.
- -- Command: goto-char position
- This function sets point in the current buffer to the value
- POSITION. If POSITION is less than 1, it moves point to the
- beginning of the buffer. If POSITION is greater than the length
- of the buffer, it moves point to the end.
- If narrowing is in effect, POSITION still counts from the
- beginning of the buffer, but point cannot go outside the accessible
- portion. If POSITION is out of range, `goto-char' moves point to
- the beginning or the end of the accessible portion.
- When this function is called interactively, POSITION is the
- numeric prefix argument, if provided; otherwise it is read from the
- minibuffer.
- `goto-char' returns POSITION.
- -- Command: forward-char &optional count
- This function moves point COUNT characters forward, towards the
- end of the buffer (or backward, towards the beginning of the
- buffer, if COUNT is negative). If COUNT is `nil', the default is
- 1.
- If this attempts to move past the beginning or end of the buffer
- (or the limits of the accessible portion, when narrowing is in
- effect), it signals an error with error symbol
- `beginning-of-buffer' or `end-of-buffer'.
- In an interactive call, COUNT is the numeric prefix argument.
- -- Command: backward-char &optional count
- This is just like `forward-char' except that it moves in the
- opposite direction.
- File: elisp, Node: Word Motion, Next: Buffer End Motion, Prev: Character Motion, Up: Motion
- 30.2.2 Motion by Words
- ----------------------
- These functions for parsing words use the syntax table to decide
- whether a given character is part of a word. *Note Syntax Tables::.
- -- Command: forward-word &optional count
- This function moves point forward COUNT words (or backward if
- COUNT is negative). If COUNT is `nil', it moves forward one word.
- "Moving one word" means moving until point crosses a
- word-constituent character and then encounters a word-separator
- character. However, this function cannot move point past the
- boundary of the accessible portion of the buffer, or across a
- field boundary (*note Fields::). The most common case of a field
- boundary is the end of the prompt in the minibuffer.
- If it is possible to move COUNT words, without being stopped
- prematurely by the buffer boundary or a field boundary, the value
- is `t'. Otherwise, the return value is `nil' and point stops at
- the buffer boundary or field boundary.
- If `inhibit-field-text-motion' is non-`nil', this function ignores
- field boundaries.
- In an interactive call, COUNT is specified by the numeric prefix
- argument. If COUNT is omitted or `nil', it defaults to 1.
- -- Command: backward-word &optional count
- This function is just like `forward-word', except that it moves
- backward until encountering the front of a word, rather than
- forward.
- -- User Option: words-include-escapes
- This variable affects the behavior of `forward-word' and everything
- that uses it. If it is non-`nil', then characters in the "escape"
- and "character quote" syntax classes count as part of words.
- Otherwise, they do not.
- -- Variable: inhibit-field-text-motion
- If this variable is non-`nil', certain motion functions including
- `forward-word', `forward-sentence', and `forward-paragraph' ignore
- field boundaries.
- File: elisp, Node: Buffer End Motion, Next: Text Lines, Prev: Word Motion, Up: Motion
- 30.2.3 Motion to an End of the Buffer
- -------------------------------------
- To move point to the beginning of the buffer, write:
- (goto-char (point-min))
- Likewise, to move to the end of the buffer, use:
- (goto-char (point-max))
- Here are two commands that users use to do these things. They are
- documented here to warn you not to use them in Lisp programs, because
- they set the mark and display messages in the echo area.
- -- Command: beginning-of-buffer &optional n
- This function moves point to the beginning of the buffer (or the
- limits of the accessible portion, when narrowing is in effect),
- setting the mark at the previous position (except in Transient
- Mark mode, if the mark is already active, it does not set the
- mark.)
- If N is non-`nil', then it puts point N tenths of the way from the
- beginning of the accessible portion of the buffer. In an
- interactive call, N is the numeric prefix argument, if provided;
- otherwise N defaults to `nil'.
- *Warning:* Don't use this function in Lisp programs!
- -- Command: end-of-buffer &optional n
- This function moves point to the end of the buffer (or the limits
- of the accessible portion, when narrowing is in effect), setting
- the mark at the previous position (except in Transient Mark mode
- when the mark is already active). If N is non-`nil', then it puts
- point N tenths of the way from the end of the accessible portion of
- the buffer.
- In an interactive call, N is the numeric prefix argument, if
- provided; otherwise N defaults to `nil'.
- *Warning:* Don't use this function in Lisp programs!
- File: elisp, Node: Text Lines, Next: Screen Lines, Prev: Buffer End Motion, Up: Motion
- 30.2.4 Motion by Text Lines
- ---------------------------
- Text lines are portions of the buffer delimited by newline characters,
- which are regarded as part of the previous line. The first text line
- begins at the beginning of the buffer, and the last text line ends at
- the end of the buffer whether or not the last character is a newline.
- The division of the buffer into text lines is not affected by the width
- of the window, by line continuation in display, or by how tabs and
- control characters are displayed.
- -- Command: beginning-of-line &optional count
- This function moves point to the beginning of the current line.
- With an argument COUNT not `nil' or 1, it moves forward COUNT-1
- lines and then to the beginning of the line.
- This function does not move point across a field boundary (*note
- Fields::) unless doing so would move beyond there to a different
- line; therefore, if COUNT is `nil' or 1, and point starts at a
- field boundary, point does not move. To ignore field boundaries,
- either bind `inhibit-field-text-motion' to `t', or use the
- `forward-line' function instead. For instance, `(forward-line 0)'
- does the same thing as `(beginning-of-line)', except that it
- ignores field boundaries.
- If this function reaches the end of the buffer (or of the
- accessible portion, if narrowing is in effect), it positions point
- there. No error is signaled.
- -- Function: line-beginning-position &optional count
- Return the position that `(beginning-of-line COUNT)' would move to.
- -- Command: end-of-line &optional count
- This function moves point to the end of the current line. With an
- argument COUNT not `nil' or 1, it moves forward COUNT-1 lines and
- then to the end of the line.
- This function does not move point across a field boundary (*note
- Fields::) unless doing so would move beyond there to a different
- line; therefore, if COUNT is `nil' or 1, and point starts at a
- field boundary, point does not move. To ignore field boundaries,
- bind `inhibit-field-text-motion' to `t'.
- If this function reaches the end of the buffer (or of the
- accessible portion, if narrowing is in effect), it positions point
- there. No error is signaled.
- -- Function: line-end-position &optional count
- Return the position that `(end-of-line COUNT)' would move to.
- -- Command: forward-line &optional count
- This function moves point forward COUNT lines, to the beginning of
- the line. If COUNT is negative, it moves point -COUNT lines
- backward, to the beginning of a line. If COUNT is zero, it moves
- point to the beginning of the current line. If COUNT is `nil',
- that means 1.
- If `forward-line' encounters the beginning or end of the buffer (or
- of the accessible portion) before finding that many lines, it sets
- point there. No error is signaled.
- `forward-line' returns the difference between COUNT and the number
- of lines actually moved. If you attempt to move down five lines
- from the beginning of a buffer that has only three lines, point
- stops at the end of the last line, and the value will be 2.
- In an interactive call, COUNT is the numeric prefix argument.
- -- Function: count-lines start end
- This function returns the number of lines between the positions
- START and END in the current buffer. If START and END are equal,
- then it returns 0. Otherwise it returns at least 1, even if START
- and END are on the same line. This is because the text between
- them, considered in isolation, must contain at least one line
- unless it is empty.
- -- Command: count-words start end
- This function returns the number of words between the positions
- START and END in the current buffer.
- This function can also be called interactively. In that case, it
- prints a message reporting the number of lines, words, and
- characters in the buffer, or in the region if the region is active.
- -- Function: line-number-at-pos &optional pos
- This function returns the line number in the current buffer
- corresponding to the buffer position POS. If POS is `nil' or
- omitted, the current buffer position is used.
- Also see the functions `bolp' and `eolp' in *note Near Point::.
- These functions do not move point, but test whether it is already at the
- beginning or end of a line.
- File: elisp, Node: Screen Lines, Next: List Motion, Prev: Text Lines, Up: Motion
- 30.2.5 Motion by Screen Lines
- -----------------------------
- The line functions in the previous section count text lines, delimited
- only by newline characters. By contrast, these functions count screen
- lines, which are defined by the way the text appears on the screen. A
- text line is a single screen line if it is short enough to fit the width
- of the selected window, but otherwise it may occupy several screen
- lines.
- In some cases, text lines are truncated on the screen rather than
- continued onto additional screen lines. In these cases,
- `vertical-motion' moves point much like `forward-line'. *Note
- Truncation::.
- Because the width of a given string depends on the flags that control
- the appearance of certain characters, `vertical-motion' behaves
- differently, for a given piece of text, depending on the buffer it is
- in, and even on the selected window (because the width, the truncation
- flag, and display table may vary between windows). *Note Usual
- Display::.
- These functions scan text to determine where screen lines break, and
- thus take time proportional to the distance scanned. If you intend to
- use them heavily, Emacs provides caches which may improve the
- performance of your code. *Note cache-long-line-scans: Truncation.
- -- Function: vertical-motion count &optional window
- This function moves point to the start of the screen line COUNT
- screen lines down from the screen line containing point. If COUNT
- is negative, it moves up instead.
- The COUNT argument can be a cons cell, `(COLS . LINES)', instead
- of an integer. Then the function moves by LINES screen lines, and
- puts point COLS columns from the start of that screen line.
- The return value is the number of screen lines over which point was
- moved. The value may be less in absolute value than COUNT if the
- beginning or end of the buffer was reached.
- The window WINDOW is used for obtaining parameters such as the
- width, the horizontal scrolling, and the display table. But
- `vertical-motion' always operates on the current buffer, even if
- WINDOW currently displays some other buffer.
- -- Function: count-screen-lines &optional beg end count-final-newline
- window
- This function returns the number of screen lines in the text from
- BEG to END. The number of screen lines may be different from the
- number of actual lines, due to line continuation, the display
- table, etc. If BEG and END are `nil' or omitted, they default to
- the beginning and end of the accessible portion of the buffer.
- If the region ends with a newline, that is ignored unless the
- optional third argument COUNT-FINAL-NEWLINE is non-`nil'.
- The optional fourth argument WINDOW specifies the window for
- obtaining parameters such as width, horizontal scrolling, and so
- on. The default is to use the selected window's parameters.
- Like `vertical-motion', `count-screen-lines' always uses the
- current buffer, regardless of which buffer is displayed in WINDOW.
- This makes possible to use `count-screen-lines' in any buffer,
- whether or not it is currently displayed in some window.
- -- Command: move-to-window-line count
- This function moves point with respect to the text currently
- displayed in the selected window. It moves point to the beginning
- of the screen line COUNT screen lines from the top of the window.
- If COUNT is negative, that specifies a position -COUNT lines from
- the bottom (or the last line of the buffer, if the buffer ends
- above the specified screen position).
- If COUNT is `nil', then point moves to the beginning of the line
- in the middle of the window. If the absolute value of COUNT is
- greater than the size of the window, then point moves to the place
- that would appear on that screen line if the window were tall
- enough. This will probably cause the next redisplay to scroll to
- bring that location onto the screen.
- In an interactive call, COUNT is the numeric prefix argument.
- The value returned is the window line number point has moved to,
- with the top line in the window numbered 0.
- -- Function: compute-motion from frompos to topos width offsets window
- This function scans the current buffer, calculating screen
- positions. It scans the buffer forward from position FROM,
- assuming that is at screen coordinates FROMPOS, to position TO or
- coordinates TOPOS, whichever comes first. It returns the ending
- buffer position and screen coordinates.
- The coordinate arguments FROMPOS and TOPOS are cons cells of the
- form `(HPOS . VPOS)'.
- The argument WIDTH is the number of columns available to display
- text; this affects handling of continuation lines. `nil' means
- the actual number of usable text columns in the window, which is
- equivalent to the value returned by `(window-width window)'.
- The argument OFFSETS is either `nil' or a cons cell of the form
- `(HSCROLL . TAB-OFFSET)'. Here HSCROLL is the number of columns
- not being displayed at the left margin; most callers get this by
- calling `window-hscroll'. Meanwhile, TAB-OFFSET is the offset
- between column numbers on the screen and column numbers in the
- buffer. This can be nonzero in a continuation line, when the
- previous screen lines' widths do not add up to a multiple of
- `tab-width'. It is always zero in a non-continuation line.
- The window WINDOW serves only to specify which display table to
- use. `compute-motion' always operates on the current buffer,
- regardless of what buffer is displayed in WINDOW.
- The return value is a list of five elements:
- (POS HPOS VPOS PREVHPOS CONTIN)
- Here POS is the buffer position where the scan stopped, VPOS is
- the vertical screen position, and HPOS is the horizontal screen
- position.
- The result PREVHPOS is the horizontal position one character back
- from POS. The result CONTIN is `t' if the last line was continued
- after (or within) the previous character.
- For example, to find the buffer position of column COL of screen
- line LINE of a certain window, pass the window's display start
- location as FROM and the window's upper-left coordinates as
- FROMPOS. Pass the buffer's `(point-max)' as TO, to limit the scan
- to the end of the accessible portion of the buffer, and pass LINE
- and COL as TOPOS. Here's a function that does this:
- (defun coordinates-of-position (col line)
- (car (compute-motion (window-start)
- '(0 . 0)
- (point-max)
- (cons col line)
- (window-width)
- (cons (window-hscroll) 0)
- (selected-window))))
- When you use `compute-motion' for the minibuffer, you need to use
- `minibuffer-prompt-width' to get the horizontal position of the
- beginning of the first screen line. *Note Minibuffer Contents::.
- File: elisp, Node: List Motion, Next: Skipping Characters, Prev: Screen Lines, Up: Motion
- 30.2.6 Moving over Balanced Expressions
- ---------------------------------------
- Here are several functions concerned with balanced-parenthesis
- expressions (also called "sexps" in connection with moving across them
- in Emacs). The syntax table controls how these functions interpret
- various characters; see *note Syntax Tables::. *Note Parsing
- Expressions::, for lower-level primitives for scanning sexps or parts of
- sexps. For user-level commands, see *note Commands for Editing with
- Parentheses: (emacs)Parentheses.
- -- Command: forward-list &optional arg
- This function moves forward across ARG (default 1) balanced groups
- of parentheses. (Other syntactic entities such as words or paired
- string quotes are ignored.)
- -- Command: backward-list &optional arg
- This function moves backward across ARG (default 1) balanced
- groups of parentheses. (Other syntactic entities such as words or
- paired string quotes are ignored.)
- -- Command: up-list &optional arg
- This function moves forward out of ARG (default 1) levels of
- parentheses. A negative argument means move backward but still to
- a less deep spot.
- -- Command: down-list &optional arg
- This function moves forward into ARG (default 1) levels of
- parentheses. A negative argument means move backward but still go
- deeper in parentheses (-ARG levels).
- -- Command: forward-sexp &optional arg
- This function moves forward across ARG (default 1) balanced
- expressions. Balanced expressions include both those delimited by
- parentheses and other kinds, such as words and string constants.
- *Note Parsing Expressions::. For example,
- ---------- Buffer: foo ----------
- (concat-!- "foo " (car x) y z)
- ---------- Buffer: foo ----------
- (forward-sexp 3)
- => nil
- ---------- Buffer: foo ----------
- (concat "foo " (car x) y-!- z)
- ---------- Buffer: foo ----------
- -- Command: backward-sexp &optional arg
- This function moves backward across ARG (default 1) balanced
- expressions.
- -- Command: beginning-of-defun &optional arg
- This function moves back to the ARGth beginning of a defun. If
- ARG is negative, this actually moves forward, but it still moves
- to the beginning of a defun, not to the end of one. ARG defaults
- to 1.
- -- Command: end-of-defun &optional arg
- This function moves forward to the ARGth end of a defun. If ARG
- is negative, this actually moves backward, but it still moves to
- the end of a defun, not to the beginning of one. ARG defaults to
- 1.
- -- User Option: defun-prompt-regexp
- If non-`nil', this buffer-local variable holds a regular
- expression that specifies what text can appear before the
- open-parenthesis that starts a defun. That is to say, a defun
- begins on a line that starts with a match for this regular
- expression, followed by a character with open-parenthesis syntax.
- -- User Option: open-paren-in-column-0-is-defun-start
- If this variable's value is non-`nil', an open parenthesis in
- column 0 is considered to be the start of a defun. If it is
- `nil', an open parenthesis in column 0 has no special meaning.
- The default is `t'.
- -- Variable: beginning-of-defun-function
- If non-`nil', this variable holds a function for finding the
- beginning of a defun. The function `beginning-of-defun' calls
- this function instead of using its normal method, passing it its
- optional argument. If the argument is non-`nil', the function
- should move back by that many functions, like `beginning-of-defun'
- does.
- -- Variable: end-of-defun-function
- If non-`nil', this variable holds a function for finding the end of
- a defun. The function `end-of-defun' calls this function instead
- of using its normal method.
- File: elisp, Node: Skipping Characters, Prev: List Motion, Up: Motion
- 30.2.7 Skipping Characters
- --------------------------
- The following two functions move point over a specified set of
- characters. For example, they are often used to skip whitespace. For
- related functions, see *note Motion and Syntax::.
- These functions convert the set string to multibyte if the buffer is
- multibyte, and they convert it to unibyte if the buffer is unibyte, as
- the search functions do (*note Searching and Matching::).
- -- Function: skip-chars-forward character-set &optional limit
- This function moves point in the current buffer forward, skipping
- over a given set of characters. It examines the character
- following point, then advances point if the character matches
- CHARACTER-SET. This continues until it reaches a character that
- does not match. The function returns the number of characters
- moved over.
- The argument CHARACTER-SET is a string, like the inside of a
- `[...]' in a regular expression except that `]' does not terminate
- it, and `\' quotes `^', `-' or `\'. Thus, `"a-zA-Z"' skips over
- all letters, stopping before the first nonletter, and `"^a-zA-Z"'
- skips nonletters stopping before the first letter. See *Note
- Regular Expressions::. Character classes can also be used, e.g.
- `"[:alnum:]"'. See *note Char Classes::.
- If LIMIT is supplied (it must be a number or a marker), it
- specifies the maximum position in the buffer that point can be
- skipped to. Point will stop at or before LIMIT.
- In the following example, point is initially located directly
- before the `T'. After the form is evaluated, point is located at
- the end of that line (between the `t' of `hat' and the newline).
- The function skips all letters and spaces, but not newlines.
- ---------- Buffer: foo ----------
- I read "-!-The cat in the hat
- comes back" twice.
- ---------- Buffer: foo ----------
- (skip-chars-forward "a-zA-Z ")
- => 18
- ---------- Buffer: foo ----------
- I read "The cat in the hat-!-
- comes back" twice.
- ---------- Buffer: foo ----------
- -- Function: skip-chars-backward character-set &optional limit
- This function moves point backward, skipping characters that match
- CHARACTER-SET, until LIMIT. It is just like `skip-chars-forward'
- except for the direction of motion.
- The return value indicates the distance traveled. It is an
- integer that is zero or less.
- File: elisp, Node: Excursions, Next: Narrowing, Prev: Motion, Up: Positions
- 30.3 Excursions
- ===============
- It is often useful to move point "temporarily" within a localized
- portion of the program. This is called an "excursion", and it is done
- with the `save-excursion' special form. This construct remembers the
- initial identity of the current buffer, and its values of point and the
- mark, and restores them after the excursion completes. It is the
- standard way to move point within one part of a program and avoid
- affecting the rest of the program, and is used thousands of times in
- the Lisp sources of Emacs.
- If you only need to save and restore the identity of the current
- buffer, use `save-current-buffer' or `with-current-buffer' instead
- (*note Current Buffer::). If you need to save or restore window
- configurations, see the forms described in *note Window
- Configurations:: and in *note Frame Configurations::.
- -- Special Form: save-excursion body...
- This special form saves the identity of the current buffer and the
- values of point and the mark in it, evaluates BODY, and finally
- restores the buffer and its saved values of point and the mark.
- All three saved values are restored even in case of an abnormal
- exit via `throw' or error (*note Nonlocal Exits::).
- The value returned by `save-excursion' is the result of the last
- form in BODY, or `nil' if no body forms were given.
- Because `save-excursion' only saves point and mark for the buffer
- that was current at the start of the excursion, any changes made to
- point and/or mark in other buffers, during the excursion, will remain
- in effect afterward. This frequently leads to unintended consequences,
- so the byte compiler warns if you call `set-buffer' during an excursion:
- Warning: Use `with-current-buffer' rather than
- save-excursion+set-buffer
- To avoid such problems, you should call `save-excursion' only after
- setting the desired current buffer, as in the following example:
- (defun append-string-to-buffer (string buffer)
- "Append STRING to the end of BUFFER."
- (with-current-buffer buffer
- (save-excursion
- (goto-char (point-max))
- (insert string))))
- Likewise, `save-excursion' does not restore window-buffer
- correspondences altered by functions such as `switch-to-buffer'. One
- way to restore these correspondences, and the selected window, is to
- use `save-window-excursion' inside `save-excursion' (*note Window
- Configurations::).
- *Warning:* Ordinary insertion of text adjacent to the saved point
- value relocates the saved value, just as it relocates all markers.
- More precisely, the saved value is a marker with insertion type `nil'.
- *Note Marker Insertion Types::. Therefore, when the saved point value
- is restored, it normally comes before the inserted text.
- Although `save-excursion' saves the location of the mark, it does
- not prevent functions which modify the buffer from setting
- `deactivate-mark', and thus causing the deactivation of the mark after
- the command finishes. *Note The Mark::.
- File: elisp, Node: Narrowing, Prev: Excursions, Up: Positions
- 30.4 Narrowing
- ==============
- "Narrowing" means limiting the text addressable by Emacs editing
- commands to a limited range of characters in a buffer. The text that
- remains addressable is called the "accessible portion" of the buffer.
- Narrowing is specified with two buffer positions which become the
- beginning and end of the accessible portion. For most editing commands
- and most Emacs primitives, these positions replace the values of the
- beginning and end of the buffer. While narrowing is in effect, no text
- outside the accessible portion is displayed, and point cannot move
- outside the accessible portion.
- Values such as positions or line numbers, which usually count from
- the beginning of the buffer, do so despite narrowing, but the functions
- which use them refuse to operate on text that is inaccessible.
- The commands for saving buffers are unaffected by narrowing; they
- save the entire buffer regardless of any narrowing.
- If you need to display in a single buffer several very different
- types of text, consider using an alternative facility described in
- *note Swapping Text::.
- -- Command: narrow-to-region start end
- This function sets the accessible portion of the current buffer to
- start at START and end at END. Both arguments should be character
- positions.
- In an interactive call, START and END are set to the bounds of the
- current region (point and the mark, with the smallest first).
- -- Command: narrow-to-page &optional move-count
- This function sets the accessible portion of the current buffer to
- include just the current page. An optional first argument
- MOVE-COUNT non-`nil' means to move forward or backward by
- MOVE-COUNT pages and then narrow to one page. The variable
- `page-delimiter' specifies where pages start and end (*note
- Standard Regexps::).
- In an interactive call, MOVE-COUNT is set to the numeric prefix
- argument.
- -- Command: widen
- This function cancels any narrowing in the current buffer, so that
- the entire contents are accessible. This is called "widening".
- It is equivalent to the following expression:
- (narrow-to-region 1 (1+ (buffer-size)))
- -- Special Form: save-restriction body...
- This special form saves the current bounds of the accessible
- portion, evaluates the BODY forms, and finally restores the saved
- bounds, thus restoring the same state of narrowing (or absence
- thereof) formerly in effect. The state of narrowing is restored
- even in the event of an abnormal exit via `throw' or error (*note
- Nonlocal Exits::). Therefore, this construct is a clean way to
- narrow a buffer temporarily.
- The value returned by `save-restriction' is that returned by the
- last form in BODY, or `nil' if no body forms were given.
- *Caution:* it is easy to make a mistake when using the
- `save-restriction' construct. Read the entire description here
- before you try it.
- If BODY changes the current buffer, `save-restriction' still
- restores the restrictions on the original buffer (the buffer whose
- restrictions it saved from), but it does not restore the identity
- of the current buffer.
- `save-restriction' does _not_ restore point and the mark; use
- `save-excursion' for that. If you use both `save-restriction' and
- `save-excursion' together, `save-excursion' should come first (on
- the outside). Otherwise, the old point value would be restored
- with temporary narrowing still in effect. If the old point value
- were outside the limits of the temporary narrowing, this would
- fail to restore it accurately.
- Here is a simple example of correct use of `save-restriction':
- ---------- Buffer: foo ----------
- This is the contents of foo
- This is the contents of foo
- This is the contents of foo-!-
- ---------- Buffer: foo ----------
- (save-excursion
- (save-restriction
- (goto-char 1)
- (forward-line 2)
- (narrow-to-region 1 (point))
- (goto-char (point-min))
- (replace-string "foo" "bar")))
- ---------- Buffer: foo ----------
- This is the contents of bar
- This is the contents of bar
- This is the contents of foo-!-
- ---------- Buffer: foo ----------
- File: elisp, Node: Markers, Next: Text, Prev: Positions, Up: Top
- 31 Markers
- **********
- A "marker" is a Lisp object used to specify a position in a buffer
- relative to the surrounding text. A marker changes its offset from the
- beginning of the buffer automatically whenever text is inserted or
- deleted, so that it stays with the two characters on either side of it.
- * Menu:
- * Overview of Markers:: The components of a marker, and how it relocates.
- * Predicates on Markers:: Testing whether an object is a marker.
- * Creating Markers:: Making empty markers or markers at certain places.
- * Information from Markers:: Finding the marker's buffer or character position.
- * Marker Insertion Types:: Two ways a marker can relocate when you
- insert where it points.
- * Moving Markers:: Moving the marker to a new buffer or position.
- * The Mark:: How "the mark" is implemented with a marker.
- * The Region:: How to access "the region".
- File: elisp, Node: Overview of Markers, Next: Predicates on Markers, Up: Markers
- 31.1 Overview of Markers
- ========================
- A marker specifies a buffer and a position in that buffer. A marker
- can be used to represent a position in functions that require one, just
- as an integer could be used. In that case, the marker's buffer is
- normally ignored. Of course, a marker used in this way usually points
- to a position in the buffer that the function operates on, but that is
- entirely the programmer's responsibility. *Note Positions::, for a
- complete description of positions.
- A marker has three attributes: the marker position, the marker
- buffer, and the insertion type. The marker position is an integer that
- is equivalent (at a given time) to the marker as a position in that
- buffer. But the marker's position value can change during the life of
- the marker, and often does. Insertion and deletion of text in the
- buffer relocate the marker. The idea is that a marker positioned
- between two characters remains between those two characters despite
- insertion and deletion elsewhere in the buffer. Relocation changes the
- integer equivalent of the marker.
- Deleting text around a marker's position leaves the marker between
- the characters immediately before and after the deleted text. Inserting
- text at the position of a marker normally leaves the marker either in
- front of or after the new text, depending on the marker's "insertion
- type" (*note Marker Insertion Types::)--unless the insertion is done
- with `insert-before-markers' (*note Insertion::).
- Insertion and deletion in a buffer must check all the markers and
- relocate them if necessary. This slows processing in a buffer with a
- large number of markers. For this reason, it is a good idea to make a
- marker point nowhere if you are sure you don't need it any more.
- Markers that can no longer be accessed are eventually removed (*note
- Garbage Collection::).
- Because it is common to perform arithmetic operations on a marker
- position, most of these operations (including `+' and `-') accept
- markers as arguments. In such cases, the marker stands for its current
- position.
- Here are examples of creating markers, setting markers, and moving
- point to markers:
- ;; Make a new marker that initially does not point anywhere:
- (setq m1 (make-marker))
- => #<marker in no buffer>
- ;; Set `m1' to point between the 99th and 100th characters
- ;; in the current buffer:
- (set-marker m1 100)
- => #<marker at 100 in markers.texi>
- ;; Now insert one character at the beginning of the buffer:
- (goto-char (point-min))
- => 1
- (insert "Q")
- => nil
- ;; `m1' is updated appropriately.
- m1
- => #<marker at 101 in markers.texi>
- ;; Two markers that point to the same position
- ;; are not `eq', but they are `equal'.
- (setq m2 (copy-marker m1))
- => #<marker at 101 in markers.texi>
- (eq m1 m2)
- => nil
- (equal m1 m2)
- => t
- ;; When you are finished using a marker, make it point nowhere.
- (set-marker m1 nil)
- => #<marker in no buffer>
- File: elisp, Node: Predicates on Markers, Next: Creating Markers, Prev: Overview of Markers, Up: Markers
- 31.2 Predicates on Markers
- ==========================
- You can test an object to see whether it is a marker, or whether it is
- either an integer or a marker. The latter test is useful in connection
- with the arithmetic functions that work with both markers and integers.
- -- Function: markerp object
- This function returns `t' if OBJECT is a marker, `nil' otherwise.
- Note that integers are not markers, even though many functions
- will accept either a marker or an integer.
- -- Function: integer-or-marker-p object
- This function returns `t' if OBJECT is an integer or a marker,
- `nil' otherwise.
- -- Function: number-or-marker-p object
- This function returns `t' if OBJECT is a number (either integer or
- floating point) or a marker, `nil' otherwise.
- File: elisp, Node: Creating Markers, Next: Information from Markers, Prev: Predicates on Markers, Up: Markers
- 31.3 Functions that Create Markers
- ==================================
- When you create a new marker, you can make it point nowhere, or point
- to the present position of point, or to the beginning or end of the
- accessible portion of the buffer, or to the same place as another given
- marker.
- The next four functions all return markers with insertion type
- `nil'. *Note Marker Insertion Types::.
- -- Function: make-marker
- This function returns a newly created marker that does not point
- anywhere.
- (make-marker)
- => #<marker in no buffer>
- -- Function: point-marker
- This function returns a new marker that points to the present
- position of point in the current buffer. *Note Point::. For an
- example, see `copy-marker', below.
- -- Function: point-min-marker
- This function returns a new marker that points to the beginning of
- the accessible portion of the buffer. This will be the beginning
- of the buffer unless narrowing is in effect. *Note Narrowing::.
- -- Function: point-max-marker
- This function returns a new marker that points to the end of the
- accessible portion of the buffer. This will be the end of the
- buffer unless narrowing is in effect. *Note Narrowing::.
- Here are examples of this function and `point-min-marker', shown in
- a buffer containing a version of the source file for the text of
- this chapter.
- (point-min-marker)
- => #<marker at 1 in markers.texi>
- (point-max-marker)
- => #<marker at 24080 in markers.texi>
- (narrow-to-region 100 200)
- => nil
- (point-min-marker)
- => #<marker at 100 in markers.texi>
- (point-max-marker)
- => #<marker at 200 in markers.texi>
- -- Function: copy-marker &optional marker-or-integer insertion-type
- If passed a marker as its argument, `copy-marker' returns a new
- marker that points to the same place and the same buffer as does
- MARKER-OR-INTEGER. If passed an integer as its argument,
- `copy-marker' returns a new marker that points to position
- MARKER-OR-INTEGER in the current buffer.
- The new marker's insertion type is specified by the argument
- INSERTION-TYPE. *Note Marker Insertion Types::.
- If passed an integer argument less than 1, `copy-marker' returns a
- new marker that points to the beginning of the current buffer. If
- passed an integer argument greater than the length of the buffer,
- `copy-marker' returns a new marker that points to the end of the
- buffer.
- (copy-marker 0)
- => #<marker at 1 in markers.texi>
- (copy-marker 90000)
- => #<marker at 24080 in markers.texi>
- An error is signaled if MARKER is neither a marker nor an integer.
- Two distinct markers are considered `equal' (even though not `eq')
- to each other if they have the same position and buffer, or if they
- both point nowhere.
- (setq p (point-marker))
- => #<marker at 2139 in markers.texi>
- (setq q (copy-marker p))
- => #<marker at 2139 in markers.texi>
- (eq p q)
- => nil
- (equal p q)
- => t
- File: elisp, Node: Information from Markers, Next: Marker Insertion Types, Prev: Creating Markers, Up: Markers
- 31.4 Information from Markers
- =============================
- This section describes the functions for accessing the components of a
- marker object.
- -- Function: marker-position marker
- This function returns the position that MARKER points to, or `nil'
- if it points nowhere.
- -- Function: marker-buffer marker
- This function returns the buffer that MARKER points into, or `nil'
- if it points nowhere.
- (setq m (make-marker))
- => #<marker in no buffer>
- (marker-position m)
- => nil
- (marker-buffer m)
- => nil
- (set-marker m 3770 (current-buffer))
- => #<marker at 3770 in markers.texi>
- (marker-buffer m)
- => #<buffer markers.texi>
- (marker-position m)
- => 3770
- -- Function: buffer-has-markers-at position
- This function returns `t' if one or more markers point at position
- POSITION in the current buffer.
- File: elisp, Node: Marker Insertion Types, Next: Moving Markers, Prev: Information from Markers, Up: Markers
- 31.5 Marker Insertion Types
- ===========================
- When you insert text directly at the place where a marker points, there
- are two possible ways to relocate that marker: it can point before the
- inserted text, or point after it. You can specify which one a given
- marker should do by setting its "insertion type". Note that use of
- `insert-before-markers' ignores markers' insertion types, always
- relocating a marker to point after the inserted text.
- -- Function: set-marker-insertion-type marker type
- This function sets the insertion type of marker MARKER to TYPE.
- If TYPE is `t', MARKER will advance when text is inserted at its
- position. If TYPE is `nil', MARKER does not advance when text is
- inserted there.
- -- Function: marker-insertion-type marker
- This function reports the current insertion type of MARKER.
- Most functions that create markers, without an argument allowing to
- specify the insertion type, create them with insertion type `nil'.
- Also, the mark has, by default, insertion type `nil'.
- File: elisp, Node: Moving Markers, Next: The Mark, Prev: Marker Insertion Types, Up: Markers
- 31.6 Moving Marker Positions
- ============================
- This section describes how to change the position of an existing
- marker. When you do this, be sure you know whether the marker is used
- outside of your program, and, if so, what effects will result from
- moving it--otherwise, confusing things may happen in other parts of
- Emacs.
- -- Function: set-marker marker position &optional buffer
- This function moves MARKER to POSITION in BUFFER. If BUFFER is
- not provided, it defaults to the current buffer.
- If POSITION is less than 1, `set-marker' moves MARKER to the
- beginning of the buffer. If POSITION is greater than the size of
- the buffer, `set-marker' moves marker to the end of the buffer.
- If POSITION is `nil' or a marker that points nowhere, then MARKER
- is set to point nowhere.
- The value returned is MARKER.
- (setq m (point-marker))
- => #<marker at 4714 in markers.texi>
- (set-marker m 55)
- => #<marker at 55 in markers.texi>
- (setq b (get-buffer "foo"))
- => #<buffer foo>
- (set-marker m 0 b)
- => #<marker at 1 in foo>
- -- Function: move-marker marker position &optional buffer
- This is another name for `set-marker'.
- File: elisp, Node: The Mark, Next: The Region, Prev: Moving Markers, Up: Markers
- 31.7 The Mark
- =============
- Each buffer has a special marker, which is designated "the mark". When
- a buffer is newly created, this marker exists but does not point
- anywhere; this means that the mark "doesn't exist" in that buffer yet.
- Subsequent commands can set the mark.
- The mark specifies a position to bound a range of text for many
- commands, such as `kill-region' and `indent-rigidly'. These commands
- typically act on the text between point and the mark, which is called
- the "region". If you are writing a command that operates on the
- region, don't examine the mark directly; instead, use `interactive'
- with the `r' specification. This provides the values of point and the
- mark as arguments to the command in an interactive call, but permits
- other Lisp programs to specify arguments explicitly. *Note Interactive
- Codes::.
- Some commands set the mark as a side-effect. Commands should do
- this only if it has a potential use to the user, and never for their
- own internal purposes. For example, the `replace-regexp' command sets
- the mark to the value of point before doing any replacements, because
- this enables the user to move back there conveniently after the replace
- is finished.
- Once the mark "exists" in a buffer, it normally never ceases to
- exist. However, it may become "inactive", if Transient Mark mode is
- enabled. The buffer-local variable `mark-active', if non-`nil', means
- that the mark is active. A command can call the function
- `deactivate-mark' to deactivate the mark directly, or it can request
- deactivation of the mark upon return to the editor command loop by
- setting the variable `deactivate-mark' to a non-`nil' value.
- If Transient Mark mode is enabled, certain editing commands that
- normally apply to text near point, apply instead to the region when the
- mark is active. This is the main motivation for using Transient Mark
- mode. (Another is that this enables highlighting of the region when
- the mark is active. *Note Display::.)
- In addition to the mark, each buffer has a "mark ring" which is a
- list of markers containing previous values of the mark. When editing
- commands change the mark, they should normally save the old value of the
- mark on the mark ring. The variable `mark-ring-max' specifies the
- maximum number of entries in the mark ring; once the list becomes this
- long, adding a new element deletes the last element.
- There is also a separate global mark ring, but that is used only in a
- few particular user-level commands, and is not relevant to Lisp
- programming. So we do not describe it here.
- -- Function: mark &optional force
- This function returns the current buffer's mark position as an
- integer, or `nil' if no mark has ever been set in this buffer.
- If Transient Mark mode is enabled, and `mark-even-if-inactive' is
- `nil', `mark' signals an error if the mark is inactive. However,
- if FORCE is non-`nil', then `mark' disregards inactivity of the
- mark, and returns the mark position (or `nil') anyway.
- -- Function: mark-marker
- This function returns the marker that represents the current
- buffer's mark. It is not a copy, it is the marker used
- internally. Therefore, changing this marker's position will
- directly affect the buffer's mark. Don't do that unless that is
- the effect you want.
- (setq m (mark-marker))
- => #<marker at 3420 in markers.texi>
- (set-marker m 100)
- => #<marker at 100 in markers.texi>
- (mark-marker)
- => #<marker at 100 in markers.texi>
- Like any marker, this marker can be set to point at any buffer you
- like. If you make it point at any buffer other than the one of
- which it is the mark, it will yield perfectly consistent, but
- rather odd, results. We recommend that you not do it!
- -- Function: set-mark position
- This function sets the mark to POSITION, and activates the mark.
- The old value of the mark is _not_ pushed onto the mark ring.
- *Please note:* Use this function only if you want the user to see
- that the mark has moved, and you want the previous mark position to
- be lost. Normally, when a new mark is set, the old one should go
- on the `mark-ring'. For this reason, most applications should use
- `push-mark' and `pop-mark', not `set-mark'.
- Novice Emacs Lisp programmers often try to use the mark for the
- wrong purposes. The mark saves a location for the user's
- convenience. An editing command should not alter the mark unless
- altering the mark is part of the user-level functionality of the
- command. (And, in that case, this effect should be documented.)
- To remember a location for internal use in the Lisp program, store
- it in a Lisp variable. For example:
- (let ((beg (point)))
- (forward-line 1)
- (delete-region beg (point))).
- -- Function: push-mark &optional position nomsg activate
- This function sets the current buffer's mark to POSITION, and
- pushes a copy of the previous mark onto `mark-ring'. If POSITION
- is `nil', then the value of point is used.
- The function `push-mark' normally _does not_ activate the mark.
- To do that, specify `t' for the argument ACTIVATE.
- A `Mark set' message is displayed unless NOMSG is non-`nil'.
- -- Function: pop-mark
- This function pops off the top element of `mark-ring' and makes
- that mark become the buffer's actual mark. This does not move
- point in the buffer, and it does nothing if `mark-ring' is empty.
- It deactivates the mark.
- -- User Option: transient-mark-mode
- This variable, if non-`nil', enables Transient Mark mode. In
- Transient Mark mode, every buffer-modifying primitive sets
- `deactivate-mark'. As a consequence, most commands that modify
- the buffer also deactivate the mark.
- When Transient Mark mode is enabled and the mark is active, many
- commands that normally apply to the text near point instead apply
- to the region. Such commands should use the function
- `use-region-p' to test whether they should operate on the region.
- *Note The Region::.
- Lisp programs can set `transient-mark-mode' to non-`nil', non-`t'
- values to enable Transient Mark mode temporarily. If the value is
- `lambda', Transient Mark mode is automatically turned off after
- any action, such as buffer modification, that would normally
- deactivate the mark. If the value is `(only . OLDVAL)', then
- `transient-mark-mode' is set to the value OLDVAL after any
- subsequent command that moves point and is not shift-translated
- (*note shift-translation: Key Sequence Input.), or after any other
- action that would normally deactivate the mark.
- -- User Option: mark-even-if-inactive
- If this is non-`nil', Lisp programs and the Emacs user can use the
- mark even when it is inactive. This option affects the behavior of
- Transient Mark mode. When the option is non-`nil', deactivation of
- the mark turns off region highlighting, but commands that use the
- mark behave as if the mark were still active.
- -- Variable: deactivate-mark
- If an editor command sets this variable non-`nil', then the editor
- command loop deactivates the mark after the command returns (if
- Transient Mark mode is enabled). All the primitives that change
- the buffer set `deactivate-mark', to deactivate the mark when the
- command is finished.
- To write Lisp code that modifies the buffer without causing
- deactivation of the mark at the end of the command, bind
- `deactivate-mark' to `nil' around the code that does the
- modification. For example:
- (let (deactivate-mark)
- (insert " "))
- -- Function: deactivate-mark &optional force
- If Transient Mark mode is enabled or FORCE is non-`nil', this
- function deactivates the mark and runs the normal hook
- `deactivate-mark-hook'. Otherwise, it does nothing.
- -- Variable: mark-active
- The mark is active when this variable is non-`nil'. This variable
- is always buffer-local in each buffer. Do _not_ use the value of
- this variable to decide whether a command that normally operates
- on text near point should operate on the region instead. Use the
- function `use-region-p' for that (*note The Region::).
- -- Variable: activate-mark-hook
- -- Variable: deactivate-mark-hook
- These normal hooks are run, respectively, when the mark becomes
- active and when it becomes inactive. The hook
- `activate-mark-hook' is also run at the end of the command loop if
- the mark is active and it is possible that the region may have
- changed.
- -- Function: handle-shift-selection
- This function implements the "shift-selection" behavior of
- point-motion commands. *Note Shift Selection: (emacs)Shift
- Selection. It is called automatically by the Emacs command loop
- whenever a command with a `^' character in its `interactive' spec
- is invoked, before the command itself is executed (*note ^:
- Interactive Codes.).
- If `shift-select-mode' is non-`nil' and the current command was
- invoked via shift translation (*note shift-translation: Key
- Sequence Input.), this function sets the mark and temporarily
- activates the region, unless the region was already temporarily
- activated in this way. Otherwise, if the region has been activated
- temporarily, it deactivates the mark and restores the variable
- `transient-mark-mode' to its earlier value.
- -- Variable: mark-ring
- The value of this buffer-local variable is the list of saved former
- marks of the current buffer, most recent first.
- mark-ring
- => (#<marker at 11050 in markers.texi>
- #<marker at 10832 in markers.texi>
- ...)
- -- User Option: mark-ring-max
- The value of this variable is the maximum size of `mark-ring'. If
- more marks than this are pushed onto the `mark-ring', `push-mark'
- discards an old mark when it adds a new one.
- File: elisp, Node: The Region, Prev: The Mark, Up: Markers
- 31.8 The Region
- ===============
- The text between point and the mark is known as "the region". Various
- functions operate on text delimited by point and the mark, but only
- those functions specifically related to the region itself are described
- here.
- The next two functions signal an error if the mark does not point
- anywhere. If Transient Mark mode is enabled and
- `mark-even-if-inactive' is `nil', they also signal an error if the mark
- is inactive.
- -- Function: region-beginning
- This function returns the position of the beginning of the region
- (as an integer). This is the position of either point or the mark,
- whichever is smaller.
- -- Function: region-end
- This function returns the position of the end of the region (as an
- integer). This is the position of either point or the mark,
- whichever is larger.
- Instead of using `region-beginning' and `region-end', a command
- designed to operate on a region should normally use `interactive' with
- the `r' specification to find the beginning and end of the region.
- This lets other Lisp programs specify the bounds explicitly as
- arguments. *Note Interactive Codes::.
- -- Function: use-region-p
- This function returns `t' if Transient Mark mode is enabled, the
- mark is active, and there is a valid region in the buffer. This
- function is intended to be used by commands that operate on the
- region, instead of on text near point, when the mark is active.
- A region is valid if it has a non-zero size, or if the user option
- `use-empty-active-region' is non-`nil' (by default, it is `nil').
- The function `region-active-p' is similar to `use-region-p', but
- considers all regions as valid. In most cases, you should not use
- `region-active-p', since if the region is empty it is often more
- appropriate to operate on point.
- File: elisp, Node: Text, Next: Non-ASCII Characters, Prev: Markers, Up: Top
- 32 Text
- *******
- This chapter describes the functions that deal with the text in a
- buffer. Most examine, insert, or delete text in the current buffer,
- often operating at point or on text adjacent to point. Many are
- interactive. All the functions that change the text provide for undoing
- the changes (*note Undo::).
- Many text-related functions operate on a region of text defined by
- two buffer positions passed in arguments named START and END. These
- arguments should be either markers (*note Markers::) or numeric
- character positions (*note Positions::). The order of these arguments
- does not matter; it is all right for START to be the end of the region
- and END the beginning. For example, `(delete-region 1 10)' and
- `(delete-region 10 1)' are equivalent. An `args-out-of-range' error is
- signaled if either START or END is outside the accessible portion of
- the buffer. In an interactive call, point and the mark are used for
- these arguments.
- Throughout this chapter, "text" refers to the characters in the
- buffer, together with their properties (when relevant). Keep in mind
- that point is always between two characters, and the cursor appears on
- the character after point.
- * Menu:
- * Near Point:: Examining text in the vicinity of point.
- * Buffer Contents:: Examining text in a general fashion.
- * Comparing Text:: Comparing substrings of buffers.
- * Insertion:: Adding new text to a buffer.
- * Commands for Insertion:: User-level commands to insert text.
- * Deletion:: Removing text from a buffer.
- * User-Level Deletion:: User-level commands to delete text.
- * The Kill Ring:: Where removed text sometimes is saved for later use.
- * Undo:: Undoing changes to the text of a buffer.
- * Maintaining Undo:: How to enable and disable undo information.
- How to control how much information is kept.
- * Filling:: Functions for explicit filling.
- * Margins:: How to specify margins for filling commands.
- * Adaptive Fill:: Adaptive Fill mode chooses a fill prefix from context.
- * Auto Filling:: How auto-fill mode is implemented to break lines.
- * Sorting:: Functions for sorting parts of the buffer.
- * Columns:: Computing horizontal positions, and using them.
- * Indentation:: Functions to insert or adjust indentation.
- * Case Changes:: Case conversion of parts of the buffer.
- * Text Properties:: Assigning Lisp property lists to text characters.
- * Substitution:: Replacing a given character wherever it appears.
- * Transposition:: Swapping two portions of a buffer.
- * Registers:: How registers are implemented. Accessing the text or
- position stored in a register.
- * Base 64:: Conversion to or from base 64 encoding.
- * Checksum/Hash:: Computing cryptographic hashes.
- * Parsing HTML/XML:: Parsing HTML and XML.
- * Atomic Changes:: Installing several buffer changes "atomically".
- * Change Hooks:: Supplying functions to be run when text is changed.
- File: elisp, Node: Near Point, Next: Buffer Contents, Up: Text
- 32.1 Examining Text Near Point
- ==============================
- Many functions are provided to look at the characters around point.
- Several simple functions are described here. See also `looking-at' in
- *note Regexp Search::.
- In the following four functions, "beginning" or "end" of buffer
- refers to the beginning or end of the accessible portion.
- -- Function: char-after &optional position
- This function returns the character in the current buffer at (i.e.,
- immediately after) position POSITION. If POSITION is out of range
- for this purpose, either before the beginning of the buffer, or at
- or beyond the end, then the value is `nil'. The default for
- POSITION is point.
- In the following example, assume that the first character in the
- buffer is `@':
- (string (char-after 1))
- => "@"
- -- Function: char-before &optional position
- This function returns the character in the current buffer
- immediately before position POSITION. If POSITION is out of range
- for this purpose, either at or before the beginning of the buffer,
- or beyond the end, then the value is `nil'. The default for
- POSITION is point.
- -- Function: following-char
- This function returns the character following point in the current
- buffer. This is similar to `(char-after (point))'. However, if
- point is at the end of the buffer, then `following-char' returns 0.
- Remember that point is always between characters, and the cursor
- normally appears over the character following point. Therefore,
- the character returned by `following-char' is the character the
- cursor is over.
- In this example, point is between the `a' and the `c'.
- ---------- Buffer: foo ----------
- Gentlemen may cry ``Pea-!-ce! Peace!,''
- but there is no peace.
- ---------- Buffer: foo ----------
- (string (preceding-char))
- => "a"
- (string (following-char))
- => "c"
- -- Function: preceding-char
- This function returns the character preceding point in the current
- buffer. See above, under `following-char', for an example. If
- point is at the beginning of the buffer, `preceding-char' returns
- 0.
- -- Function: bobp
- This function returns `t' if point is at the beginning of the
- buffer. If narrowing is in effect, this means the beginning of the
- accessible portion of the text. See also `point-min' in *note
- Point::.
- -- Function: eobp
- This function returns `t' if point is at the end of the buffer.
- If narrowing is in effect, this means the end of accessible
- portion of the text. See also `point-max' in *Note Point::.
- -- Function: bolp
- This function returns `t' if point is at the beginning of a line.
- *Note Text Lines::. The beginning of the buffer (or of its
- accessible portion) always counts as the beginning of a line.
- -- Function: eolp
- This function returns `t' if point is at the end of a line. The
- end of the buffer (or of its accessible portion) is always
- considered the end of a line.
- File: elisp, Node: Buffer Contents, Next: Comparing Text, Prev: Near Point, Up: Text
- 32.2 Examining Buffer Contents
- ==============================
- This section describes functions that allow a Lisp program to convert
- any portion of the text in the buffer into a string.
- -- Function: buffer-substring start end
- This function returns a string containing a copy of the text of the
- region defined by positions START and END in the current buffer.
- If the arguments are not positions in the accessible portion of
- the buffer, `buffer-substring' signals an `args-out-of-range'
- error.
- Here's an example which assumes Font-Lock mode is not enabled:
- ---------- Buffer: foo ----------
- This is the contents of buffer foo
- ---------- Buffer: foo ----------
- (buffer-substring 1 10)
- => "This is t"
- (buffer-substring (point-max) 10)
- => "he contents of buffer foo\n"
- If the text being copied has any text properties, these are copied
- into the string along with the characters they belong to. *Note
- Text Properties::. However, overlays (*note Overlays::) in the
- buffer and their properties are ignored, not copied.
- For example, if Font-Lock mode is enabled, you might get results
- like these:
- (buffer-substring 1 10)
- => #("This is t" 0 1 (fontified t) 1 9 (fontified t))
- -- Function: buffer-substring-no-properties start end
- This is like `buffer-substring', except that it does not copy text
- properties, just the characters themselves. *Note Text
- Properties::.
- -- Function: buffer-string
- This function returns the contents of the entire accessible
- portion of the current buffer, as a string.
- -- Function: filter-buffer-substring start end &optional delete
- This function passes the buffer text between START and END through
- the filter functions specified by the wrapper hook
- `filter-buffer-substring-functions', and returns the result. The
- obsolete variable `buffer-substring-filters' is also consulted.
- If both of these variables are `nil', the value is the unaltered
- text from the buffer, i.e. what `buffer-substring' would return.
- If DELETE is non-`nil', this function deletes the text between
- START and END after copying it, like `delete-and-extract-region'.
- Lisp code should use this function instead of `buffer-substring',
- `buffer-substring-no-properties', or `delete-and-extract-region'
- when copying into user-accessible data structures such as the
- kill-ring, X clipboard, and registers. Major and minor modes can
- add functions to `filter-buffer-substring-functions' to alter such
- text as it is copied out of the buffer.
- -- Variable: filter-buffer-substring-functions
- This variable is a wrapper hook (*note Running Hooks::), whose
- members should be functions that accept four arguments: FUN,
- START, END, and DELETE. FUN is a function that takes three
- arguments (START, END, and DELETE), and returns a string. In both
- cases, the START, END, and DELETE arguments are the same as those
- of `filter-buffer-substring'.
- The first hook function is passed a FUN that is equivalent to the
- default operation of `filter-buffer-substring', i.e. it returns
- the buffer-substring between START and END (processed by any
- `buffer-substring-filters') and optionally deletes the original
- text from the buffer. In most cases, the hook function will call
- FUN once, and then do its own processing of the result. The next
- hook function receives a FUN equivalent to this, and so on. The
- actual return value is the result of all the hook functions acting
- in sequence.
- -- Variable: buffer-substring-filters
- This variable is obsoleted by `filter-buffer-substring-functions',
- but is still supported for backward compatibility. Its value
- should should be a list of functions which accept a single string
- argument and return another string. `filter-buffer-substring'
- passes the buffer substring to the first function in this list,
- and the return value of each function is passed to the next
- function. The return value of the last function is passed to
- `filter-buffer-substring-functions'.
- -- Function: current-word &optional strict really-word
- This function returns the symbol (or word) at or near point, as a
- string. The return value includes no text properties.
- If the optional argument REALLY-WORD is non-`nil', it finds a
- word; otherwise, it finds a symbol (which includes both word
- characters and symbol constituent characters).
- If the optional argument STRICT is non-`nil', then point must be
- in or next to the symbol or word--if no symbol or word is there,
- the function returns `nil'. Otherwise, a nearby symbol or word on
- the same line is acceptable.
- -- Function: thing-at-point thing
- Return the THING around or next to point, as a string.
- The argument THING is a symbol which specifies a kind of syntactic
- entity. Possibilities include `symbol', `list', `sexp', `defun',
- `filename', `url', `word', `sentence', `whitespace', `line',
- `page', and others.
- ---------- Buffer: foo ----------
- Gentlemen may cry ``Pea-!-ce! Peace!,''
- but there is no peace.
- ---------- Buffer: foo ----------
- (thing-at-point 'word)
- => "Peace"
- (thing-at-point 'line)
- => "Gentlemen may cry ``Peace! Peace!,''\n"
- (thing-at-point 'whitespace)
- => nil
- File: elisp, Node: Comparing Text, Next: Insertion, Prev: Buffer Contents, Up: Text
- 32.3 Comparing Text
- ===================
- This function lets you compare portions of the text in a buffer, without
- copying them into strings first.
- -- Function: compare-buffer-substrings buffer1 start1 end1 buffer2
- start2 end2
- This function lets you compare two substrings of the same buffer
- or two different buffers. The first three arguments specify one
- substring, giving a buffer (or a buffer name) and two positions
- within the buffer. The last three arguments specify the other
- substring in the same way. You can use `nil' for BUFFER1,
- BUFFER2, or both to stand for the current buffer.
- The value is negative if the first substring is less, positive if
- the first is greater, and zero if they are equal. The absolute
- value of the result is one plus the index of the first differing
- characters within the substrings.
- This function ignores case when comparing characters if
- `case-fold-search' is non-`nil'. It always ignores text
- properties.
- Suppose the current buffer contains the text `foobarbar
- haha!rara!'; then in this example the two substrings are `rbar '
- and `rara!'. The value is 2 because the first substring is greater
- at the second character.
- (compare-buffer-substrings nil 6 11 nil 16 21)
- => 2
- File: elisp, Node: Insertion, Next: Commands for Insertion, Prev: Comparing Text, Up: Text
- 32.4 Inserting Text
- ===================
- "Insertion" means adding new text to a buffer. The inserted text goes
- at point--between the character before point and the character after
- point. Some insertion functions leave point before the inserted text,
- while other functions leave it after. We call the former insertion
- "after point" and the latter insertion "before point".
- Insertion moves markers located at positions after the insertion
- point, so that they stay with the surrounding text (*note Markers::).
- When a marker points at the place of insertion, insertion may or may
- not relocate the marker, depending on the marker's insertion type
- (*note Marker Insertion Types::). Certain special functions such as
- `insert-before-markers' relocate all such markers to point after the
- inserted text, regardless of the markers' insertion type.
- Insertion functions signal an error if the current buffer is
- read-only or if they insert within read-only text.
- These functions copy text characters from strings and buffers along
- with their properties. The inserted characters have exactly the same
- properties as the characters they were copied from. By contrast,
- characters specified as separate arguments, not part of a string or
- buffer, inherit their text properties from the neighboring text.
- The insertion functions convert text from unibyte to multibyte in
- order to insert in a multibyte buffer, and vice versa--if the text
- comes from a string or from a buffer. However, they do not convert
- unibyte character codes 128 through 255 to multibyte characters, not
- even if the current buffer is a multibyte buffer. *Note Converting
- Representations::.
- -- Function: insert &rest args
- This function inserts the strings and/or characters ARGS into the
- current buffer, at point, moving point forward. In other words, it
- inserts the text before point. An error is signaled unless all
- ARGS are either strings or characters. The value is `nil'.
- -- Function: insert-before-markers &rest args
- This function inserts the strings and/or characters ARGS into the
- current buffer, at point, moving point forward. An error is
- signaled unless all ARGS are either strings or characters. The
- value is `nil'.
- This function is unlike the other insertion functions in that it
- relocates markers initially pointing at the insertion point, to
- point after the inserted text. If an overlay begins at the
- insertion point, the inserted text falls outside the overlay; if a
- nonempty overlay ends at the insertion point, the inserted text
- falls inside that overlay.
- -- Function: insert-char character count &optional inherit
- This function inserts COUNT instances of CHARACTER into the
- current buffer before point. The argument COUNT should be an
- integer, and CHARACTER must be a character. The value is `nil'.
- This function does not convert unibyte character codes 128 through
- 255 to multibyte characters, not even if the current buffer is a
- multibyte buffer. *Note Converting Representations::.
- If INHERIT is non-`nil', then the inserted characters inherit
- sticky text properties from the two characters before and after the
- insertion point. *Note Sticky Properties::.
- -- Function: insert-buffer-substring from-buffer-or-name &optional
- start end
- This function inserts a portion of buffer FROM-BUFFER-OR-NAME
- (which must already exist) into the current buffer before point.
- The text inserted is the region between START and END. (These
- arguments default to the beginning and end of the accessible
- portion of that buffer.) This function returns `nil'.
- In this example, the form is executed with buffer `bar' as the
- current buffer. We assume that buffer `bar' is initially empty.
- ---------- Buffer: foo ----------
- We hold these truths to be self-evident, that all
- ---------- Buffer: foo ----------
- (insert-buffer-substring "foo" 1 20)
- => nil
- ---------- Buffer: bar ----------
- We hold these truth-!-
- ---------- Buffer: bar ----------
- -- Function: insert-buffer-substring-no-properties from-buffer-or-name
- &optional start end
- This is like `insert-buffer-substring' except that it does not
- copy any text properties.
- *Note Sticky Properties::, for other insertion functions that inherit
- text properties from the nearby text in addition to inserting it.
- Whitespace inserted by indentation functions also inherits text
- properties.
- File: elisp, Node: Commands for Insertion, Next: Deletion, Prev: Insertion, Up: Text
- 32.5 User-Level Insertion Commands
- ==================================
- This section describes higher-level commands for inserting text,
- commands intended primarily for the user but useful also in Lisp
- programs.
- -- Command: insert-buffer from-buffer-or-name
- This command inserts the entire accessible contents of
- FROM-BUFFER-OR-NAME (which must exist) into the current buffer
- after point. It leaves the mark after the inserted text. The
- value is `nil'.
- -- Command: self-insert-command count
- This command inserts the last character typed; it does so COUNT
- times, before point, and returns `nil'. Most printing characters
- are bound to this command. In routine use, `self-insert-command'
- is the most frequently called function in Emacs, but programs
- rarely use it except to install it on a keymap.
- In an interactive call, COUNT is the numeric prefix argument.
- Self-insertion translates the input character through
- `translation-table-for-input'. *Note Translation of Characters::.
- This command calls `auto-fill-function' whenever that is non-`nil'
- and the character inserted is in the table `auto-fill-chars'
- (*note Auto Filling::).
- This command performs abbrev expansion if Abbrev mode is enabled
- and the inserted character does not have word-constituent syntax.
- (*Note Abbrevs::, and *note Syntax Class Table::.) It is also
- responsible for calling `blink-paren-function' when the inserted
- character has close parenthesis syntax (*note Blinking::).
- The final thing this command does is to run the hook
- `post-self-insert-hook'. You could use this to automatically
- reindent text as it is typed, for example.
- Do not try substituting your own definition of
- `self-insert-command' for the standard one. The editor command
- loop handles this function specially.
- -- Command: newline &optional number-of-newlines
- This command inserts newlines into the current buffer before point.
- If NUMBER-OF-NEWLINES is supplied, that many newline characters
- are inserted.
- This function calls `auto-fill-function' if the current column
- number is greater than the value of `fill-column' and
- NUMBER-OF-NEWLINES is `nil'. Typically what `auto-fill-function'
- does is insert a newline; thus, the overall result in this case is
- to insert two newlines at different places: one at point, and
- another earlier in the line. `newline' does not auto-fill if
- NUMBER-OF-NEWLINES is non-`nil'.
- This command indents to the left margin if that is not zero.
- *Note Margins::.
- The value returned is `nil'. In an interactive call, COUNT is the
- numeric prefix argument.
- -- Variable: overwrite-mode
- This variable controls whether overwrite mode is in effect. The
- value should be `overwrite-mode-textual', `overwrite-mode-binary',
- or `nil'. `overwrite-mode-textual' specifies textual overwrite
- mode (treats newlines and tabs specially), and
- `overwrite-mode-binary' specifies binary overwrite mode (treats
- newlines and tabs like any other characters).
- File: elisp, Node: Deletion, Next: User-Level Deletion, Prev: Commands for Insertion, Up: Text
- 32.6 Deleting Text
- ==================
- Deletion means removing part of the text in a buffer, without saving it
- in the kill ring (*note The Kill Ring::). Deleted text can't be
- yanked, but can be reinserted using the undo mechanism (*note Undo::).
- Some deletion functions do save text in the kill ring in some special
- cases.
- All of the deletion functions operate on the current buffer.
- -- Command: erase-buffer
- This function deletes the entire text of the current buffer (_not_
- just the accessible portion), leaving it empty. If the buffer is
- read-only, it signals a `buffer-read-only' error; if some of the
- text in it is read-only, it signals a `text-read-only' error.
- Otherwise, it deletes the text without asking for any
- confirmation. It returns `nil'.
- Normally, deleting a large amount of text from a buffer inhibits
- further auto-saving of that buffer "because it has shrunk".
- However, `erase-buffer' does not do this, the idea being that the
- future text is not really related to the former text, and its size
- should not be compared with that of the former text.
- -- Command: delete-region start end
- This command deletes the text between positions START and END in
- the current buffer, and returns `nil'. If point was inside the
- deleted region, its value afterward is START. Otherwise, point
- relocates with the surrounding text, as markers do.
- -- Function: delete-and-extract-region start end
- This function deletes the text between positions START and END in
- the current buffer, and returns a string containing the text just
- deleted.
- If point was inside the deleted region, its value afterward is
- START. Otherwise, point relocates with the surrounding text, as
- markers do.
- -- Command: delete-char count &optional killp
- This command deletes COUNT characters directly after point, or
- before point if COUNT is negative. If KILLP is non-`nil', then it
- saves the deleted characters in the kill ring.
- In an interactive call, COUNT is the numeric prefix argument, and
- KILLP is the unprocessed prefix argument. Therefore, if a prefix
- argument is supplied, the text is saved in the kill ring. If no
- prefix argument is supplied, then one character is deleted, but
- not saved in the kill ring.
- The value returned is always `nil'.
- -- Command: delete-backward-char count &optional killp
- This command deletes COUNT characters directly before point, or
- after point if COUNT is negative. If KILLP is non-`nil', then it
- saves the deleted characters in the kill ring.
- In an interactive call, COUNT is the numeric prefix argument, and
- KILLP is the unprocessed prefix argument. Therefore, if a prefix
- argument is supplied, the text is saved in the kill ring. If no
- prefix argument is supplied, then one character is deleted, but
- not saved in the kill ring.
- The value returned is always `nil'.
- -- Command: backward-delete-char-untabify count &optional killp
- This command deletes COUNT characters backward, changing tabs into
- spaces. When the next character to be deleted is a tab, it is
- first replaced with the proper number of spaces to preserve
- alignment and then one of those spaces is deleted instead of the
- tab. If KILLP is non-`nil', then the command saves the deleted
- characters in the kill ring.
- Conversion of tabs to spaces happens only if COUNT is positive.
- If it is negative, exactly -COUNT characters after point are
- deleted.
- In an interactive call, COUNT is the numeric prefix argument, and
- KILLP is the unprocessed prefix argument. Therefore, if a prefix
- argument is supplied, the text is saved in the kill ring. If no
- prefix argument is supplied, then one character is deleted, but
- not saved in the kill ring.
- The value returned is always `nil'.
- -- User Option: backward-delete-char-untabify-method
- This option specifies how `backward-delete-char-untabify' should
- deal with whitespace. Possible values include `untabify', the
- default, meaning convert a tab to many spaces and delete one;
- `hungry', meaning delete all tabs and spaces before point with one
- command; `all' meaning delete all tabs, spaces and newlines before
- point, and `nil', meaning do nothing special for whitespace
- characters.
- File: elisp, Node: User-Level Deletion, Next: The Kill Ring, Prev: Deletion, Up: Text
- 32.7 User-Level Deletion Commands
- =================================
- This section describes higher-level commands for deleting text,
- commands intended primarily for the user but useful also in Lisp
- programs.
- -- Command: delete-horizontal-space &optional backward-only
- This function deletes all spaces and tabs around point. It returns
- `nil'.
- If BACKWARD-ONLY is non-`nil', the function deletes spaces and
- tabs before point, but not after point.
- In the following examples, we call `delete-horizontal-space' four
- times, once on each line, with point between the second and third
- characters on the line each time.
- ---------- Buffer: foo ----------
- I -!-thought
- I -!- thought
- We-!- thought
- Yo-!-u thought
- ---------- Buffer: foo ----------
- (delete-horizontal-space) ; Four times.
- => nil
- ---------- Buffer: foo ----------
- Ithought
- Ithought
- Wethought
- You thought
- ---------- Buffer: foo ----------
- -- Command: delete-indentation &optional join-following-p
- This function joins the line point is on to the previous line,
- deleting any whitespace at the join and in some cases replacing it
- with one space. If JOIN-FOLLOWING-P is non-`nil',
- `delete-indentation' joins this line to the following line
- instead. The function returns `nil'.
- If there is a fill prefix, and the second of the lines being joined
- starts with the prefix, then `delete-indentation' deletes the fill
- prefix before joining the lines. *Note Margins::.
- In the example below, point is located on the line starting
- `events', and it makes no difference if there are trailing spaces
- in the preceding line.
- ---------- Buffer: foo ----------
- When in the course of human
- -!- events, it becomes necessary
- ---------- Buffer: foo ----------
- (delete-indentation)
- => nil
- ---------- Buffer: foo ----------
- When in the course of human-!- events, it becomes necessary
- ---------- Buffer: foo ----------
- After the lines are joined, the function `fixup-whitespace' is
- responsible for deciding whether to leave a space at the junction.
- -- Command: fixup-whitespace
- This function replaces all the horizontal whitespace surrounding
- point with either one space or no space, according to the context.
- It returns `nil'.
- At the beginning or end of a line, the appropriate amount of space
- is none. Before a character with close parenthesis syntax, or
- after a character with open parenthesis or expression-prefix
- syntax, no space is also appropriate. Otherwise, one space is
- appropriate. *Note Syntax Class Table::.
- In the example below, `fixup-whitespace' is called the first time
- with point before the word `spaces' in the first line. For the
- second invocation, point is directly after the `('.
- ---------- Buffer: foo ----------
- This has too many -!-spaces
- This has too many spaces at the start of (-!- this list)
- ---------- Buffer: foo ----------
- (fixup-whitespace)
- => nil
- (fixup-whitespace)
- => nil
- ---------- Buffer: foo ----------
- This has too many spaces
- This has too many spaces at the start of (this list)
- ---------- Buffer: foo ----------
- -- Command: just-one-space &optional n
- This command replaces any spaces and tabs around point with a
- single space, or N spaces if N is specified. It returns `nil'.
- -- Command: delete-blank-lines
- This function deletes blank lines surrounding point. If point is
- on a blank line with one or more blank lines before or after it,
- then all but one of them are deleted. If point is on an isolated
- blank line, then it is deleted. If point is on a nonblank line,
- the command deletes all blank lines immediately following it.
- A blank line is defined as a line containing only tabs and spaces.
- `delete-blank-lines' returns `nil'.
- File: elisp, Node: The Kill Ring, Next: Undo, Prev: User-Level Deletion, Up: Text
- 32.8 The Kill Ring
- ==================
- "Kill functions" delete text like the deletion functions, but save it
- so that the user can reinsert it by "yanking". Most of these functions
- have `kill-' in their name. By contrast, the functions whose names
- start with `delete-' normally do not save text for yanking (though they
- can still be undone); these are "deletion" functions.
- Most of the kill commands are primarily for interactive use, and are
- not described here. What we do describe are the functions provided for
- use in writing such commands. You can use these functions to write
- commands for killing text. When you need to delete text for internal
- purposes within a Lisp function, you should normally use deletion
- functions, so as not to disturb the kill ring contents. *Note
- Deletion::.
- Killed text is saved for later yanking in the "kill ring". This is
- a list that holds a number of recent kills, not just the last text
- kill. We call this a "ring" because yanking treats it as having
- elements in a cyclic order. The list is kept in the variable
- `kill-ring', and can be operated on with the usual functions for lists;
- there are also specialized functions, described in this section, that
- treat it as a ring.
- Some people think this use of the word "kill" is unfortunate, since
- it refers to operations that specifically _do not_ destroy the entities
- "killed". This is in sharp contrast to ordinary life, in which death
- is permanent and "killed" entities do not come back to life.
- Therefore, other metaphors have been proposed. For example, the term
- "cut ring" makes sense to people who, in pre-computer days, used
- scissors and paste to cut up and rearrange manuscripts. However, it
- would be difficult to change the terminology now.
- * Menu:
- * Kill Ring Concepts:: What text looks like in the kill ring.
- * Kill Functions:: Functions that kill text.
- * Yanking:: How yanking is done.
- * Yank Commands:: Commands that access the kill ring.
- * Low-Level Kill Ring:: Functions and variables for kill ring access.
- * Internals of Kill Ring:: Variables that hold kill ring data.
- File: elisp, Node: Kill Ring Concepts, Next: Kill Functions, Up: The Kill Ring
- 32.8.1 Kill Ring Concepts
- -------------------------
- The kill ring records killed text as strings in a list, most recent
- first. A short kill ring, for example, might look like this:
- ("some text" "a different piece of text" "even older text")
- When the list reaches `kill-ring-max' entries in length, adding a new
- entry automatically deletes the last entry.
- When kill commands are interwoven with other commands, each kill
- command makes a new entry in the kill ring. Multiple kill commands in
- succession build up a single kill ring entry, which would be yanked as a
- unit; the second and subsequent consecutive kill commands add text to
- the entry made by the first one.
- For yanking, one entry in the kill ring is designated the "front" of
- the ring. Some yank commands "rotate" the ring by designating a
- different element as the "front". But this virtual rotation doesn't
- change the list itself--the most recent entry always comes first in the
- list.
- File: elisp, Node: Kill Functions, Next: Yanking, Prev: Kill Ring Concepts, Up: The Kill Ring
- 32.8.2 Functions for Killing
- ----------------------------
- `kill-region' is the usual subroutine for killing text. Any command
- that calls this function is a "kill command" (and should probably have
- `kill' in its name). `kill-region' puts the newly killed text in a new
- element at the beginning of the kill ring or adds it to the most recent
- element. It determines automatically (using `last-command') whether
- the previous command was a kill command, and if so appends the killed
- text to the most recent entry.
- -- Command: kill-region start end
- This function kills the text in the region defined by START and
- END. The text is deleted but saved in the kill ring, along with
- its text properties. The value is always `nil'.
- In an interactive call, START and END are point and the mark.
- If the buffer or text is read-only, `kill-region' modifies the kill
- ring just the same, then signals an error without modifying the
- buffer. This is convenient because it lets the user use a series
- of kill commands to copy text from a read-only buffer into the
- kill ring.
- -- User Option: kill-read-only-ok
- If this option is non-`nil', `kill-region' does not signal an
- error if the buffer or text is read-only. Instead, it simply
- returns, updating the kill ring but not changing the buffer.
- -- Command: copy-region-as-kill start end
- This command saves the region defined by START and END on the kill
- ring (including text properties), but does not delete the text
- from the buffer. It returns `nil'.
- The command does not set `this-command' to `kill-region', so a
- subsequent kill command does not append to the same kill ring
- entry.
- In Lisp programs, it is better to use `kill-new' or `kill-append'
- instead of this command. *Note Low-Level Kill Ring::.
- File: elisp, Node: Yanking, Next: Yank Commands, Prev: Kill Functions, Up: The Kill Ring
- 32.8.3 Yanking
- --------------
- Yanking means inserting text from the kill ring, but it does not insert
- the text blindly. Yank commands and some other commands use
- `insert-for-yank' to perform special processing on the text that they
- copy into the buffer.
- -- Function: insert-for-yank string
- This function normally works like `insert' except that it doesn't
- insert the text properties (*note Text Properties::) in the list
- variable `yank-excluded-properties'. However, if any part of
- STRING has a non-`nil' `yank-handler' text property, that property
- can do various special processing on that part of the text being
- inserted.
- -- Function: insert-buffer-substring-as-yank buf &optional start end
- This function resembles `insert-buffer-substring' except that it
- doesn't insert the text properties in the
- `yank-excluded-properties' list.
- You can put a `yank-handler' text property on all or part of the
- text to control how it will be inserted if it is yanked. The
- `insert-for-yank' function looks for that property. The property value
- must be a list of one to four elements, with the following format
- (where elements after the first may be omitted):
- (FUNCTION PARAM NOEXCLUDE UNDO)
- Here is what the elements do:
- FUNCTION
- When FUNCTION is present and non-`nil', it is called instead of
- `insert' to insert the string. FUNCTION takes one argument--the
- string to insert.
- PARAM
- If PARAM is present and non-`nil', it replaces STRING (or the part
- of STRING being processed) as the object passed to FUNCTION (or
- `insert'); for example, if FUNCTION is `yank-rectangle', PARAM
- should be a list of strings to insert as a rectangle.
- NOEXCLUDE
- If NOEXCLUDE is present and non-`nil', the normal removal of the
- yank-excluded-properties is not performed; instead FUNCTION is
- responsible for removing those properties. This may be necessary
- if FUNCTION adjusts point before or after inserting the object.
- UNDO
- If UNDO is present and non-`nil', it is a function that will be
- called by `yank-pop' to undo the insertion of the current object.
- It is called with two arguments, the start and end of the current
- region. FUNCTION can set `yank-undo-function' to override the
- UNDO value.
- -- User Option: yank-excluded-properties
- Yanking discards certain text properties from the yanked text, as
- described above. The value of this variable is the list of
- properties to discard. Its default value contains properties that
- might lead to annoying results, such as causing the text to
- respond to the mouse or specifying key bindings.
- File: elisp, Node: Yank Commands, Next: Low-Level Kill Ring, Prev: Yanking, Up: The Kill Ring
- 32.8.4 Functions for Yanking
- ----------------------------
- This section describes higher-level commands for yanking, which are
- intended primarily for the user but useful also in Lisp programs. Both
- `yank' and `yank-pop' honor the `yank-excluded-properties' variable and
- `yank-handler' text property (*note Yanking::).
- -- Command: yank &optional arg
- This command inserts before point the text at the front of the kill
- ring. It sets the mark at the beginning of that text, using
- `push-mark' (*note The Mark::), and puts point at the end.
- If ARG is a non-`nil' list (which occurs interactively when the
- user types `C-u' with no digits), then `yank' inserts the text as
- described above, but puts point before the yanked text and sets
- the mark after it.
- If ARG is a number, then `yank' inserts the ARGth most recently
- killed text--the ARGth element of the kill ring list, counted
- cyclically from the front, which is considered the first element
- for this purpose.
- `yank' does not alter the contents of the kill ring, unless it
- used text provided by another program, in which case it pushes
- that text onto the kill ring. However if ARG is an integer
- different from one, it rotates the kill ring to place the yanked
- string at the front.
- `yank' returns `nil'.
- -- Command: yank-pop &optional arg
- This command replaces the just-yanked entry from the kill ring
- with a different entry from the kill ring.
- This is allowed only immediately after a `yank' or another
- `yank-pop'. At such a time, the region contains text that was just
- inserted by yanking. `yank-pop' deletes that text and inserts in
- its place a different piece of killed text. It does not add the
- deleted text to the kill ring, since it is already in the kill
- ring somewhere. It does however rotate the kill ring to place the
- newly yanked string at the front.
- If ARG is `nil', then the replacement text is the previous element
- of the kill ring. If ARG is numeric, the replacement is the ARGth
- previous kill. If ARG is negative, a more recent kill is the
- replacement.
- The sequence of kills in the kill ring wraps around, so that after
- the oldest one comes the newest one, and before the newest one
- goes the oldest.
- The return value is always `nil'.
- -- Variable: yank-undo-function
- If this variable is non-`nil', the function `yank-pop' uses its
- value instead of `delete-region' to delete the text inserted by
- the previous `yank' or `yank-pop' command. The value must be a
- function of two arguments, the start and end of the current region.
- The function `insert-for-yank' automatically sets this variable
- according to the UNDO element of the `yank-handler' text property,
- if there is one.
- File: elisp, Node: Low-Level Kill Ring, Next: Internals of Kill Ring, Prev: Yank Commands, Up: The Kill Ring
- 32.8.5 Low-Level Kill Ring
- --------------------------
- These functions and variables provide access to the kill ring at a
- lower level, but are still convenient for use in Lisp programs, because
- they take care of interaction with window system selections (*note
- Window System Selections::).
- -- Function: current-kill n &optional do-not-move
- The function `current-kill' rotates the yanking pointer, which
- designates the "front" of the kill ring, by N places (from newer
- kills to older ones), and returns the text at that place in the
- ring.
- If the optional second argument DO-NOT-MOVE is non-`nil', then
- `current-kill' doesn't alter the yanking pointer; it just returns
- the Nth kill, counting from the current yanking pointer.
- If N is zero, indicating a request for the latest kill,
- `current-kill' calls the value of `interprogram-paste-function'
- (documented below) before consulting the kill ring. If that value
- is a function and calling it returns a string or a list of several
- string, `current-kill' pushes the strings onto the kill ring and
- returns the first string. It also sets the yanking pointer to
- point to the kill-ring entry of the first string returned by
- `interprogram-paste-function', regardless of the value of
- DO-NOT-MOVE. Otherwise, `current-kill' does not treat a zero
- value for N specially: it returns the entry pointed at by the
- yanking pointer and does not move the yanking pointer.
- -- Function: kill-new string &optional replace
- This function pushes the text STRING onto the kill ring and makes
- the yanking pointer point to it. It discards the oldest entry if
- appropriate. It also invokes the value of
- `interprogram-cut-function' (see below).
- If REPLACE is non-`nil', then `kill-new' replaces the first
- element of the kill ring with STRING, rather than pushing STRING
- onto the kill ring.
- -- Function: kill-append string before-p
- This function appends the text STRING to the first entry in the
- kill ring and makes the yanking pointer point to the combined
- entry. Normally STRING goes at the end of the entry, but if
- BEFORE-P is non-`nil', it goes at the beginning. This function
- also invokes the value of `interprogram-cut-function' (see below).
- -- Variable: interprogram-paste-function
- This variable provides a way of transferring killed text from other
- programs, when you are using a window system. Its value should be
- `nil' or a function of no arguments.
- If the value is a function, `current-kill' calls it to get the
- "most recent kill". If the function returns a non-`nil' value,
- then that value is used as the "most recent kill". If it returns
- `nil', then the front of the kill ring is used.
- To facilitate support for window systems that support multiple
- selections, this function may also return a list of strings. In
- that case, the first string is used as the "most recent kill", and
- all the other strings are pushed onto the kill ring, for easy
- access by `yank-pop'.
- The normal use of this function is to get the window system's
- clipboard as the most recent kill, even if the selection belongs to
- another application. *Note Window System Selections::. However,
- if the clipboard contents come from the current Emacs session, this
- function should return `nil'.
- -- Variable: interprogram-cut-function
- This variable provides a way of communicating killed text to other
- programs, when you are using a window system. Its value should be
- `nil' or a function of one required argument.
- If the value is a function, `kill-new' and `kill-append' call it
- with the new first element of the kill ring as the argument.
- The normal use of this function is to put newly killed text in the
- window system's clipboard. *Note Window System Selections::.
- File: elisp, Node: Internals of Kill Ring, Prev: Low-Level Kill Ring, Up: The Kill Ring
- 32.8.6 Internals of the Kill Ring
- ---------------------------------
- The variable `kill-ring' holds the kill ring contents, in the form of a
- list of strings. The most recent kill is always at the front of the
- list.
- The `kill-ring-yank-pointer' variable points to a link in the kill
- ring list, whose CAR is the text to yank next. We say it identifies
- the "front" of the ring. Moving `kill-ring-yank-pointer' to a
- different link is called "rotating the kill ring". We call the kill
- ring a "ring" because the functions that move the yank pointer wrap
- around from the end of the list to the beginning, or vice-versa.
- Rotation of the kill ring is virtual; it does not change the value of
- `kill-ring'.
- Both `kill-ring' and `kill-ring-yank-pointer' are Lisp variables
- whose values are normally lists. The word "pointer" in the name of the
- `kill-ring-yank-pointer' indicates that the variable's purpose is to
- identify one element of the list for use by the next yank command.
- The value of `kill-ring-yank-pointer' is always `eq' to one of the
- links in the kill ring list. The element it identifies is the CAR of
- that link. Kill commands, which change the kill ring, also set this
- variable to the value of `kill-ring'. The effect is to rotate the ring
- so that the newly killed text is at the front.
- Here is a diagram that shows the variable `kill-ring-yank-pointer'
- pointing to the second entry in the kill ring `("some text" "a
- different piece of text" "yet older text")'.
- kill-ring ---- kill-ring-yank-pointer
- | |
- | v
- | --- --- --- --- --- ---
- --> | | |------> | | |--> | | |--> nil
- --- --- --- --- --- ---
- | | |
- | | |
- | | -->"yet older text"
- | |
- | --> "a different piece of text"
- |
- --> "some text"
- This state of affairs might occur after `C-y' (`yank') immediately
- followed by `M-y' (`yank-pop').
- -- Variable: kill-ring
- This variable holds the list of killed text sequences, most
- recently killed first.
- -- Variable: kill-ring-yank-pointer
- This variable's value indicates which element of the kill ring is
- at the "front" of the ring for yanking. More precisely, the value
- is a tail of the value of `kill-ring', and its CAR is the kill
- string that `C-y' should yank.
- -- User Option: kill-ring-max
- The value of this variable is the maximum length to which the kill
- ring can grow, before elements are thrown away at the end. The
- default value for `kill-ring-max' is 60.
- File: elisp, Node: Undo, Next: Maintaining Undo, Prev: The Kill Ring, Up: Text
- 32.9 Undo
- =========
- Most buffers have an "undo list", which records all changes made to the
- buffer's text so that they can be undone. (The buffers that don't have
- one are usually special-purpose buffers for which Emacs assumes that
- undoing is not useful. In particular, any buffer whose name begins
- with a space has its undo recording off by default; see *note Buffer
- Names::.) All the primitives that modify the text in the buffer
- automatically add elements to the front of the undo list, which is in
- the variable `buffer-undo-list'.
- -- Variable: buffer-undo-list
- This buffer-local variable's value is the undo list of the current
- buffer. A value of `t' disables the recording of undo information.
- Here are the kinds of elements an undo list can have:
- `POSITION'
- This kind of element records a previous value of point; undoing
- this element moves point to POSITION. Ordinary cursor motion does
- not make any sort of undo record, but deletion operations use
- these entries to record where point was before the command.
- `(BEG . END)'
- This kind of element indicates how to delete text that was
- inserted. Upon insertion, the text occupied the range BEG-END in
- the buffer.
- `(TEXT . POSITION)'
- This kind of element indicates how to reinsert text that was
- deleted. The deleted text itself is the string TEXT. The place to
- reinsert it is `(abs POSITION)'. If POSITION is positive, point
- was at the beginning of the deleted text, otherwise it was at the
- end.
- `(t HIGH . LOW)'
- This kind of element indicates that an unmodified buffer became
- modified. The elements HIGH and LOW are two integers, each
- recording 16 bits of the visited file's modification time as of
- when it was previously visited or saved. `primitive-undo' uses
- those values to determine whether to mark the buffer as unmodified
- once again; it does so only if the file's modification time
- matches those numbers.
- `(nil PROPERTY VALUE BEG . END)'
- This kind of element records a change in a text property. Here's
- how you might undo the change:
- (put-text-property BEG END PROPERTY VALUE)
- `(MARKER . ADJUSTMENT)'
- This kind of element records the fact that the marker MARKER was
- relocated due to deletion of surrounding text, and that it moved
- ADJUSTMENT character positions. Undoing this element moves MARKER
- - ADJUSTMENT characters.
- `(apply FUNNAME . ARGS)'
- This is an extensible undo item, which is undone by calling
- FUNNAME with arguments ARGS.
- `(apply DELTA BEG END FUNNAME . ARGS)'
- This is an extensible undo item, which records a change limited to
- the range BEG to END, which increased the size of the buffer by
- DELTA. It is undone by calling FUNNAME with arguments ARGS.
- This kind of element enables undo limited to a region to determine
- whether the element pertains to that region.
- `nil'
- This element is a boundary. The elements between two boundaries
- are called a "change group"; normally, each change group
- corresponds to one keyboard command, and undo commands normally
- undo an entire group as a unit.
- -- Function: undo-boundary
- This function places a boundary element in the undo list. The undo
- command stops at such a boundary, and successive undo commands undo
- to earlier and earlier boundaries. This function returns `nil'.
- The editor command loop automatically calls `undo-boundary' just
- before executing each key sequence, so that each undo normally
- undoes the effects of one command. As an exception, the command
- `self-insert-command', which produces self-inserting input
- characters (*note Commands for Insertion::), may remove the
- boundary inserted by the command loop: a boundary is accepted for
- the first such character, the next 19 consecutive self-inserting
- input characters do not have boundaries, and then the 20th does;
- and so on as long as the self-inserting characters continue.
- Hence, sequences of consecutive character insertions can be undone
- as a group.
- All buffer modifications add a boundary whenever the previous
- undoable change was made in some other buffer. This is to ensure
- that each command makes a boundary in each buffer where it makes
- changes.
- Calling this function explicitly is useful for splitting the
- effects of a command into more than one unit. For example,
- `query-replace' calls `undo-boundary' after each replacement, so
- that the user can undo individual replacements one by one.
- -- Variable: undo-in-progress
- This variable is normally `nil', but the undo commands bind it to
- `t'. This is so that various kinds of change hooks can tell when
- they're being called for the sake of undoing.
- -- Function: primitive-undo count list
- This is the basic function for undoing elements of an undo list.
- It undoes the first COUNT elements of LIST, returning the rest of
- LIST.
- `primitive-undo' adds elements to the buffer's undo list when it
- changes the buffer. Undo commands avoid confusion by saving the
- undo list value at the beginning of a sequence of undo operations.
- Then the undo operations use and update the saved value. The new
- elements added by undoing are not part of this saved value, so
- they don't interfere with continuing to undo.
- This function does not bind `undo-in-progress'.
- File: elisp, Node: Maintaining Undo, Next: Filling, Prev: Undo, Up: Text
- 32.10 Maintaining Undo Lists
- ============================
- This section describes how to enable and disable undo information for a
- given buffer. It also explains how the undo list is truncated
- automatically so it doesn't get too big.
- Recording of undo information in a newly created buffer is normally
- enabled to start with; but if the buffer name starts with a space, the
- undo recording is initially disabled. You can explicitly enable or
- disable undo recording with the following two functions, or by setting
- `buffer-undo-list' yourself.
- -- Command: buffer-enable-undo &optional buffer-or-name
- This command enables recording undo information for buffer
- BUFFER-OR-NAME, so that subsequent changes can be undone. If no
- argument is supplied, then the current buffer is used. This
- function does nothing if undo recording is already enabled in the
- buffer. It returns `nil'.
- In an interactive call, BUFFER-OR-NAME is the current buffer. You
- cannot specify any other buffer.
- -- Command: buffer-disable-undo &optional buffer-or-name
- This function discards the undo list of BUFFER-OR-NAME, and
- disables further recording of undo information. As a result, it
- is no longer possible to undo either previous changes or any
- subsequent changes. If the undo list of BUFFER-OR-NAME is already
- disabled, this function has no effect.
- This function returns `nil'.
- As editing continues, undo lists get longer and longer. To prevent
- them from using up all available memory space, garbage collection trims
- them back to size limits you can set. (For this purpose, the "size" of
- an undo list measures the cons cells that make up the list, plus the
- strings of deleted text.) Three variables control the range of
- acceptable sizes: `undo-limit', `undo-strong-limit' and
- `undo-outer-limit'. In these variables, size is counted as the number
- of bytes occupied, which includes both saved text and other data.
- -- User Option: undo-limit
- This is the soft limit for the acceptable size of an undo list.
- The change group at which this size is exceeded is the last one
- kept.
- -- User Option: undo-strong-limit
- This is the upper limit for the acceptable size of an undo list.
- The change group at which this size is exceeded is discarded
- itself (along with all older change groups). There is one
- exception: the very latest change group is only discarded if it
- exceeds `undo-outer-limit'.
- -- User Option: undo-outer-limit
- If at garbage collection time the undo info for the current command
- exceeds this limit, Emacs discards the info and displays a warning.
- This is a last ditch limit to prevent memory overflow.
- -- User Option: undo-ask-before-discard
- If this variable is non-`nil', when the undo info exceeds
- `undo-outer-limit', Emacs asks in the echo area whether to discard
- the info. The default value is `nil', which means to discard it
- automatically.
- This option is mainly intended for debugging. Garbage collection
- is inhibited while the question is asked, which means that Emacs
- might leak memory if the user waits too long before answering the
- question.
- File: elisp, Node: Filling, Next: Margins, Prev: Maintaining Undo, Up: Text
- 32.11 Filling
- =============
- "Filling" means adjusting the lengths of lines (by moving the line
- breaks) so that they are nearly (but no greater than) a specified
- maximum width. Additionally, lines can be "justified", which means
- inserting spaces to make the left and/or right margins line up
- precisely. The width is controlled by the variable `fill-column'. For
- ease of reading, lines should be no longer than 70 or so columns.
- You can use Auto Fill mode (*note Auto Filling::) to fill text
- automatically as you insert it, but changes to existing text may leave
- it improperly filled. Then you must fill the text explicitly.
- Most of the commands in this section return values that are not
- meaningful. All the functions that do filling take note of the current
- left margin, current right margin, and current justification style
- (*note Margins::). If the current justification style is `none', the
- filling functions don't actually do anything.
- Several of the filling functions have an argument JUSTIFY. If it is
- non-`nil', that requests some kind of justification. It can be `left',
- `right', `full', or `center', to request a specific style of
- justification. If it is `t', that means to use the current
- justification style for this part of the text (see
- `current-justification', below). Any other value is treated as `full'.
- When you call the filling functions interactively, using a prefix
- argument implies the value `full' for JUSTIFY.
- -- Command: fill-paragraph &optional justify region
- This command fills the paragraph at or after point. If JUSTIFY is
- non-`nil', each line is justified as well. It uses the ordinary
- paragraph motion commands to find paragraph boundaries. *Note
- Paragraphs: (emacs)Paragraphs.
- When REGION is non-`nil', then if Transient Mark mode is enabled
- and the mark is active, this command calls `fill-region' to fill
- all the paragraphs in the region, instead of filling only the
- current paragraph. When this command is called interactively,
- REGION is `t'.
- -- Command: fill-region start end &optional justify nosqueeze to-eop
- This command fills each of the paragraphs in the region from START
- to END. It justifies as well if JUSTIFY is non-`nil'.
- If NOSQUEEZE is non-`nil', that means to leave whitespace other
- than line breaks untouched. If TO-EOP is non-`nil', that means to
- keep filling to the end of the paragraph--or the next hard
- newline, if `use-hard-newlines' is enabled (see below).
- The variable `paragraph-separate' controls how to distinguish
- paragraphs. *Note Standard Regexps::.
- -- Command: fill-individual-paragraphs start end &optional justify
- citation-regexp
- This command fills each paragraph in the region according to its
- individual fill prefix. Thus, if the lines of a paragraph were
- indented with spaces, the filled paragraph will remain indented in
- the same fashion.
- The first two arguments, START and END, are the beginning and end
- of the region to be filled. The third and fourth arguments,
- JUSTIFY and CITATION-REGEXP, are optional. If JUSTIFY is
- non-`nil', the paragraphs are justified as well as filled. If
- CITATION-REGEXP is non-`nil', it means the function is operating
- on a mail message and therefore should not fill the header lines.
- If CITATION-REGEXP is a string, it is used as a regular
- expression; if it matches the beginning of a line, that line is
- treated as a citation marker.
- Ordinarily, `fill-individual-paragraphs' regards each change in
- indentation as starting a new paragraph. If
- `fill-individual-varying-indent' is non-`nil', then only separator
- lines separate paragraphs. That mode can handle indented
- paragraphs with additional indentation on the first line.
- -- User Option: fill-individual-varying-indent
- This variable alters the action of `fill-individual-paragraphs' as
- described above.
- -- Command: fill-region-as-paragraph start end &optional justify
- nosqueeze squeeze-after
- This command considers a region of text as a single paragraph and
- fills it. If the region was made up of many paragraphs, the blank
- lines between paragraphs are removed. This function justifies as
- well as filling when JUSTIFY is non-`nil'.
- If NOSQUEEZE is non-`nil', that means to leave whitespace other
- than line breaks untouched. If SQUEEZE-AFTER is non-`nil', it
- specifies a position in the region, and means don't canonicalize
- spaces before that position.
- In Adaptive Fill mode, this command calls `fill-context-prefix' to
- choose a fill prefix by default. *Note Adaptive Fill::.
- -- Command: justify-current-line &optional how eop nosqueeze
- This command inserts spaces between the words of the current line
- so that the line ends exactly at `fill-column'. It returns `nil'.
- The argument HOW, if non-`nil' specifies explicitly the style of
- justification. It can be `left', `right', `full', `center', or
- `none'. If it is `t', that means to do follow specified
- justification style (see `current-justification', below). `nil'
- means to do full justification.
- If EOP is non-`nil', that means do only left-justification if
- `current-justification' specifies full justification. This is
- used for the last line of a paragraph; even if the paragraph as a
- whole is fully justified, the last line should not be.
- If NOSQUEEZE is non-`nil', that means do not change interior
- whitespace.
- -- User Option: default-justification
- This variable's value specifies the style of justification to use
- for text that doesn't specify a style with a text property. The
- possible values are `left', `right', `full', `center', or `none'.
- The default value is `left'.
- -- Function: current-justification
- This function returns the proper justification style to use for
- filling the text around point.
- This returns the value of the `justification' text property at
- point, or the variable DEFAULT-JUSTIFICATION if there is no such
- text property. However, it returns `nil' rather than `none' to
- mean "don't justify".
- -- User Option: sentence-end-double-space
- If this variable is non-`nil', a period followed by just one space
- does not count as the end of a sentence, and the filling functions
- avoid breaking the line at such a place.
- -- User Option: sentence-end-without-period
- If this variable is non-`nil', a sentence can end without a
- period. This is used for languages like Thai, where sentences end
- with a double space but without a period.
- -- User Option: sentence-end-without-space
- If this variable is non-`nil', it should be a string of characters
- that can end a sentence without following spaces.
- -- Variable: fill-paragraph-function
- This variable provides a way to override the filling of paragraphs.
- If its value is non-`nil', `fill-paragraph' calls this function to
- do the work. If the function returns a non-`nil' value,
- `fill-paragraph' assumes the job is done, and immediately returns
- that value.
- The usual use of this feature is to fill comments in programming
- language modes. If the function needs to fill a paragraph in the
- usual way, it can do so as follows:
- (let ((fill-paragraph-function nil))
- (fill-paragraph arg))
- -- Variable: fill-forward-paragraph-function
- This variable provides a way to override how the filling functions,
- such as `fill-region' and `fill-paragraph', move forward to the
- next paragraph. Its value should be a function, which is called
- with a single argument N, the number of paragraphs to move, and
- should return the difference between N and the number of
- paragraphs actually moved. The default value of this variable is
- `forward-paragraph'. *Note Paragraphs: (emacs)Paragraphs.
- -- Variable: use-hard-newlines
- If this variable is non-`nil', the filling functions do not delete
- newlines that have the `hard' text property. These "hard
- newlines" act as paragraph separators.
- File: elisp, Node: Margins, Next: Adaptive Fill, Prev: Filling, Up: Text
- 32.12 Margins for Filling
- =========================
- -- User Option: fill-prefix
- This buffer-local variable, if non-`nil', specifies a string of
- text that appears at the beginning of normal text lines and should
- be disregarded when filling them. Any line that fails to start
- with the fill prefix is considered the start of a paragraph; so is
- any line that starts with the fill prefix followed by additional
- whitespace. Lines that start with the fill prefix but no
- additional whitespace are ordinary text lines that can be filled
- together. The resulting filled lines also start with the fill
- prefix.
- The fill prefix follows the left margin whitespace, if any.
- -- User Option: fill-column
- This buffer-local variable specifies the maximum width of filled
- lines. Its value should be an integer, which is a number of
- columns. All the filling, justification, and centering commands
- are affected by this variable, including Auto Fill mode (*note
- Auto Filling::).
- As a practical matter, if you are writing text for other people to
- read, you should set `fill-column' to no more than 70. Otherwise
- the line will be too long for people to read comfortably, and this
- can make the text seem clumsy.
- The default value for `fill-column' is 70.
- -- Command: set-left-margin from to margin
- This sets the `left-margin' property on the text from FROM to TO
- to the value MARGIN. If Auto Fill mode is enabled, this command
- also refills the region to fit the new margin.
- -- Command: set-right-margin from to margin
- This sets the `right-margin' property on the text from FROM to TO
- to the value MARGIN. If Auto Fill mode is enabled, this command
- also refills the region to fit the new margin.
- -- Function: current-left-margin
- This function returns the proper left margin value to use for
- filling the text around point. The value is the sum of the
- `left-margin' property of the character at the start of the
- current line (or zero if none), and the value of the variable
- `left-margin'.
- -- Function: current-fill-column
- This function returns the proper fill column value to use for
- filling the text around point. The value is the value of the
- `fill-column' variable, minus the value of the `right-margin'
- property of the character after point.
- -- Command: move-to-left-margin &optional n force
- This function moves point to the left margin of the current line.
- The column moved to is determined by calling the function
- `current-left-margin'. If the argument N is non-`nil',
- `move-to-left-margin' moves forward N-1 lines first.
- If FORCE is non-`nil', that says to fix the line's indentation if
- that doesn't match the left margin value.
- -- Function: delete-to-left-margin &optional from to
- This function removes left margin indentation from the text between
- FROM and TO. The amount of indentation to delete is determined by
- calling `current-left-margin'. In no case does this function
- delete non-whitespace. If FROM and TO are omitted, they default
- to the whole buffer.
- -- Function: indent-to-left-margin
- This function adjusts the indentation at the beginning of the
- current line to the value specified by the variable `left-margin'.
- (That may involve either inserting or deleting whitespace.) This
- function is value of `indent-line-function' in Paragraph-Indent
- Text mode.
- -- User Option: left-margin
- This variable specifies the base left margin column. In
- Fundamental mode, `C-j' indents to this column. This variable
- automatically becomes buffer-local when set in any fashion.
- -- User Option: fill-nobreak-predicate
- This variable gives major modes a way to specify not to break a
- line at certain places. Its value should be a list of functions.
- Whenever filling considers breaking the line at a certain place in
- the buffer, it calls each of these functions with no arguments and
- with point located at that place. If any of the functions returns
- non-`nil', then the line won't be broken there.
- File: elisp, Node: Adaptive Fill, Next: Auto Filling, Prev: Margins, Up: Text
- 32.13 Adaptive Fill Mode
- ========================
- When "Adaptive Fill Mode" is enabled, Emacs determines the fill prefix
- automatically from the text in each paragraph being filled rather than
- using a predetermined value. During filling, this fill prefix gets
- inserted at the start of the second and subsequent lines of the
- paragraph as described in *note Filling::, and in *note Auto Filling::.
- -- User Option: adaptive-fill-mode
- Adaptive Fill mode is enabled when this variable is non-`nil'. It
- is `t' by default.
- -- Function: fill-context-prefix from to
- This function implements the heart of Adaptive Fill mode; it
- chooses a fill prefix based on the text between FROM and TO,
- typically the start and end of a paragraph. It does this by
- looking at the first two lines of the paragraph, based on the
- variables described below.
- Usually, this function returns the fill prefix, a string. However,
- before doing this, the function makes a final check (not specially
- mentioned in the following) that a line starting with this prefix
- wouldn't look like the start of a paragraph. Should this happen,
- the function signals the anomaly by returning `nil' instead.
- In detail, `fill-context-prefix' does this:
- 1. It takes a candidate for the fill prefix from the first
- line--it tries first the function in `adaptive-fill-function'
- (if any), then the regular expression `adaptive-fill-regexp'
- (see below). The first non-`nil' result of these, or the
- empty string if they're both `nil', becomes the first line's
- candidate.
- 2. If the paragraph has as yet only one line, the function tests
- the validity of the prefix candidate just found. The
- function then returns the candidate if it's valid, or a
- string of spaces otherwise. (see the description of
- `adaptive-fill-first-line-regexp' below).
- 3. When the paragraph already has two lines, the function next
- looks for a prefix candidate on the second line, in just the
- same way it did for the first line. If it doesn't find one,
- it returns `nil'.
- 4. The function now compares the two candidate prefixes
- heuristically: if the non-whitespace characters in the line 2
- candidate occur in the same order in the line 1 candidate,
- the function returns the line 2 candidate. Otherwise, it
- returns the largest initial substring which is common to both
- candidates (which might be the empty string).
- -- User Option: adaptive-fill-regexp
- Adaptive Fill mode matches this regular expression against the text
- starting after the left margin whitespace (if any) on a line; the
- characters it matches are that line's candidate for the fill
- prefix.
- The default value matches whitespace with certain punctuation
- characters intermingled.
- -- User Option: adaptive-fill-first-line-regexp
- Used only in one-line paragraphs, this regular expression acts as
- an additional check of the validity of the one available candidate
- fill prefix: the candidate must match this regular expression, or
- match `comment-start-skip'. If it doesn't, `fill-context-prefix'
- replaces the candidate with a string of spaces "of the same width"
- as it.
- The default value of this variable is `"\\`[ \t]*\\'"', which
- matches only a string of whitespace. The effect of this default
- is to force the fill prefixes found in one-line paragraphs always
- to be pure whitespace.
- -- User Option: adaptive-fill-function
- You can specify more complex ways of choosing a fill prefix
- automatically by setting this variable to a function. The
- function is called with point after the left margin (if any) of a
- line, and it must preserve point. It should return either "that
- line's" fill prefix or `nil', meaning it has failed to determine a
- prefix.
- File: elisp, Node: Auto Filling, Next: Sorting, Prev: Adaptive Fill, Up: Text
- 32.14 Auto Filling
- ==================
- Auto Fill mode is a minor mode that fills lines automatically as text
- is inserted. This section describes the hook used by Auto Fill mode.
- For a description of functions that you can call explicitly to fill and
- justify existing text, see *note Filling::.
- Auto Fill mode also enables the functions that change the margins and
- justification style to refill portions of the text. *Note Margins::.
- -- Variable: auto-fill-function
- The value of this buffer-local variable should be a function (of no
- arguments) to be called after self-inserting a character from the
- table `auto-fill-chars'. It may be `nil', in which case nothing
- special is done in that case.
- The value of `auto-fill-function' is `do-auto-fill' when Auto-Fill
- mode is enabled. That is a function whose sole purpose is to
- implement the usual strategy for breaking a line.
- -- Variable: normal-auto-fill-function
- This variable specifies the function to use for
- `auto-fill-function', if and when Auto Fill is turned on. Major
- modes can set buffer-local values for this variable to alter how
- Auto Fill works.
- -- Variable: auto-fill-chars
- A char table of characters which invoke `auto-fill-function' when
- self-inserted--space and newline in most language environments.
- They have an entry `t' in the table.
- File: elisp, Node: Sorting, Next: Columns, Prev: Auto Filling, Up: Text
- 32.15 Sorting Text
- ==================
- The sorting functions described in this section all rearrange text in a
- buffer. This is in contrast to the function `sort', which rearranges
- the order of the elements of a list (*note Rearrangement::). The
- values returned by these functions are not meaningful.
- -- Function: sort-subr reverse nextrecfun endrecfun &optional
- startkeyfun endkeyfun predicate
- This function is the general text-sorting routine that subdivides a
- buffer into records and then sorts them. Most of the commands in
- this section use this function.
- To understand how `sort-subr' works, consider the whole accessible
- portion of the buffer as being divided into disjoint pieces called
- "sort records". The records may or may not be contiguous, but they
- must not overlap. A portion of each sort record (perhaps all of
- it) is designated as the sort key. Sorting rearranges the records
- in order by their sort keys.
- Usually, the records are rearranged in order of ascending sort key.
- If the first argument to the `sort-subr' function, REVERSE, is
- non-`nil', the sort records are rearranged in order of descending
- sort key.
- The next four arguments to `sort-subr' are functions that are
- called to move point across a sort record. They are called many
- times from within `sort-subr'.
- 1. NEXTRECFUN is called with point at the end of a record. This
- function moves point to the start of the next record. The
- first record is assumed to start at the position of point
- when `sort-subr' is called. Therefore, you should usually
- move point to the beginning of the buffer before calling
- `sort-subr'.
- This function can indicate there are no more sort records by
- leaving point at the end of the buffer.
- 2. ENDRECFUN is called with point within a record. It moves
- point to the end of the record.
- 3. STARTKEYFUN is called to move point from the start of a
- record to the start of the sort key. This argument is
- optional; if it is omitted, the whole record is the sort key.
- If supplied, the function should either return a non-`nil'
- value to be used as the sort key, or return `nil' to indicate
- that the sort key is in the buffer starting at point. In the
- latter case, ENDKEYFUN is called to find the end of the sort
- key.
- 4. ENDKEYFUN is called to move point from the start of the sort
- key to the end of the sort key. This argument is optional.
- If STARTKEYFUN returns `nil' and this argument is omitted (or
- `nil'), then the sort key extends to the end of the record.
- There is no need for ENDKEYFUN if STARTKEYFUN returns a
- non-`nil' value.
- The argument PREDICATE is the function to use to compare keys. If
- keys are numbers, it defaults to `<'; otherwise it defaults to
- `string<'.
- As an example of `sort-subr', here is the complete function
- definition for `sort-lines':
- ;; Note that the first two lines of doc string
- ;; are effectively one line when viewed by a user.
- (defun sort-lines (reverse beg end)
- "Sort lines in region alphabetically;\
- argument means descending order.
- Called from a program, there are three arguments:
- REVERSE (non-nil means reverse order),\
- BEG and END (region to sort).
- The variable `sort-fold-case' determines\
- whether alphabetic case affects
- the sort order."
- (interactive "P\nr")
- (save-excursion
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- (let ((inhibit-field-text-motion t))
- (sort-subr reverse 'forward-line 'end-of-line)))))
- Here `forward-line' moves point to the start of the next record,
- and `end-of-line' moves point to the end of record. We do not pass
- the arguments STARTKEYFUN and ENDKEYFUN, because the entire record
- is used as the sort key.
- The `sort-paragraphs' function is very much the same, except that
- its `sort-subr' call looks like this:
- (sort-subr reverse
- (function
- (lambda ()
- (while (and (not (eobp))
- (looking-at paragraph-separate))
- (forward-line 1))))
- 'forward-paragraph)
- Markers pointing into any sort records are left with no useful
- position after `sort-subr' returns.
- -- User Option: sort-fold-case
- If this variable is non-`nil', `sort-subr' and the other buffer
- sorting functions ignore case when comparing strings.
- -- Command: sort-regexp-fields reverse record-regexp key-regexp start
- end
- This command sorts the region between START and END alphabetically
- as specified by RECORD-REGEXP and KEY-REGEXP. If REVERSE is a
- negative integer, then sorting is in reverse order.
- Alphabetical sorting means that two sort keys are compared by
- comparing the first characters of each, the second characters of
- each, and so on. If a mismatch is found, it means that the sort
- keys are unequal; the sort key whose character is less at the
- point of first mismatch is the lesser sort key. The individual
- characters are compared according to their numerical character
- codes in the Emacs character set.
- The value of the RECORD-REGEXP argument specifies how to divide
- the buffer into sort records. At the end of each record, a search
- is done for this regular expression, and the text that matches it
- is taken as the next record. For example, the regular expression
- `^.+$', which matches lines with at least one character besides a
- newline, would make each such line into a sort record. *Note
- Regular Expressions::, for a description of the syntax and meaning
- of regular expressions.
- The value of the KEY-REGEXP argument specifies what part of each
- record is the sort key. The KEY-REGEXP could match the whole
- record, or only a part. In the latter case, the rest of the
- record has no effect on the sorted order of records, but it is
- carried along when the record moves to its new position.
- The KEY-REGEXP argument can refer to the text matched by a
- subexpression of RECORD-REGEXP, or it can be a regular expression
- on its own.
- If KEY-REGEXP is:
- `\DIGIT'
- then the text matched by the DIGITth `\(...\)' parenthesis
- grouping in RECORD-REGEXP is the sort key.
- `\&'
- then the whole record is the sort key.
- a regular expression
- then `sort-regexp-fields' searches for a match for the regular
- expression within the record. If such a match is found, it
- is the sort key. If there is no match for KEY-REGEXP within
- a record then that record is ignored, which means its
- position in the buffer is not changed. (The other records
- may move around it.)
- For example, if you plan to sort all the lines in the region by the
- first word on each line starting with the letter `f', you should
- set RECORD-REGEXP to `^.*$' and set KEY-REGEXP to `\<f\w*\>'. The
- resulting expression looks like this:
- (sort-regexp-fields nil "^.*$" "\\<f\\w*\\>"
- (region-beginning)
- (region-end))
- If you call `sort-regexp-fields' interactively, it prompts for
- RECORD-REGEXP and KEY-REGEXP in the minibuffer.
- -- Command: sort-lines reverse start end
- This command alphabetically sorts lines in the region between
- START and END. If REVERSE is non-`nil', the sort is in reverse
- order.
- -- Command: sort-paragraphs reverse start end
- This command alphabetically sorts paragraphs in the region between
- START and END. If REVERSE is non-`nil', the sort is in reverse
- order.
- -- Command: sort-pages reverse start end
- This command alphabetically sorts pages in the region between
- START and END. If REVERSE is non-`nil', the sort is in reverse
- order.
- -- Command: sort-fields field start end
- This command sorts lines in the region between START and END,
- comparing them alphabetically by the FIELDth field of each line.
- Fields are separated by whitespace and numbered starting from 1.
- If FIELD is negative, sorting is by the -FIELDth field from the
- end of the line. This command is useful for sorting tables.
- -- Command: sort-numeric-fields field start end
- This command sorts lines in the region between START and END,
- comparing them numerically by the FIELDth field of each line.
- Fields are separated by whitespace and numbered starting from 1.
- The specified field must contain a number in each line of the
- region. Numbers starting with 0 are treated as octal, and numbers
- starting with `0x' are treated as hexadecimal.
- If FIELD is negative, sorting is by the -FIELDth field from the
- end of the line. This command is useful for sorting tables.
- -- User Option: sort-numeric-base
- This variable specifies the default radix for
- `sort-numeric-fields' to parse numbers.
- -- Command: sort-columns reverse &optional beg end
- This command sorts the lines in the region between BEG and END,
- comparing them alphabetically by a certain range of columns. The
- column positions of BEG and END bound the range of columns to sort
- on.
- If REVERSE is non-`nil', the sort is in reverse order.
- One unusual thing about this command is that the entire line
- containing position BEG, and the entire line containing position
- END, are included in the region sorted.
- Note that `sort-columns' rejects text that contains tabs, because
- tabs could be split across the specified columns. Use `M-x
- untabify' to convert tabs to spaces before sorting.
- When possible, this command actually works by calling the `sort'
- utility program.
- File: elisp, Node: Columns, Next: Indentation, Prev: Sorting, Up: Text
- 32.16 Counting Columns
- ======================
- The column functions convert between a character position (counting
- characters from the beginning of the buffer) and a column position
- (counting screen characters from the beginning of a line).
- These functions count each character according to the number of
- columns it occupies on the screen. This means control characters count
- as occupying 2 or 4 columns, depending upon the value of `ctl-arrow',
- and tabs count as occupying a number of columns that depends on the
- value of `tab-width' and on the column where the tab begins. *Note
- Usual Display::.
- Column number computations ignore the width of the window and the
- amount of horizontal scrolling. Consequently, a column value can be
- arbitrarily high. The first (or leftmost) column is numbered 0. They
- also ignore overlays and text properties, aside from invisibility.
- -- Function: current-column
- This function returns the horizontal position of point, measured in
- columns, counting from 0 at the left margin. The column position
- is the sum of the widths of all the displayed representations of
- the characters between the start of the current line and point.
- For an example of using `current-column', see the description of
- `count-lines' in *note Text Lines::.
- -- Command: move-to-column column &optional force
- This function moves point to COLUMN in the current line. The
- calculation of COLUMN takes into account the widths of the
- displayed representations of the characters between the start of
- the line and point.
- When called interactively, COLUMN is the value of prefix numeric
- argument. If COLUMN is not an integer, an error is signaled.
- If column COLUMN is beyond the end of the line, point moves to the
- end of the line. If COLUMN is negative, point moves to the
- beginning of the line.
- If it is impossible to move to column COLUMN because that is in
- the middle of a multicolumn character such as a tab, point moves
- to the end of that character. However, if FORCE is non-`nil', and
- COLUMN is in the middle of a tab, then `move-to-column' converts
- the tab into spaces so that it can move precisely to column
- COLUMN. Other multicolumn characters can cause anomalies despite
- FORCE, since there is no way to split them.
- The argument FORCE also has an effect if the line isn't long
- enough to reach column COLUMN; if it is `t', that means to add
- whitespace at the end of the line to reach that column.
- The return value is the column number actually moved to.
- File: elisp, Node: Indentation, Next: Case Changes, Prev: Columns, Up: Text
- 32.17 Indentation
- =================
- The indentation functions are used to examine, move to, and change
- whitespace that is at the beginning of a line. Some of the functions
- can also change whitespace elsewhere on a line. Columns and indentation
- count from zero at the left margin.
- * Menu:
- * Primitive Indent:: Functions used to count and insert indentation.
- * Mode-Specific Indent:: Customize indentation for different modes.
- * Region Indent:: Indent all the lines in a region.
- * Relative Indent:: Indent the current line based on previous lines.
- * Indent Tabs:: Adjustable, typewriter-like tab stops.
- * Motion by Indent:: Move to first non-blank character.
- File: elisp, Node: Primitive Indent, Next: Mode-Specific Indent, Up: Indentation
- 32.17.1 Indentation Primitives
- ------------------------------
- This section describes the primitive functions used to count and insert
- indentation. The functions in the following sections use these
- primitives. *Note Width::, for related functions.
- -- Function: current-indentation
- This function returns the indentation of the current line, which is
- the horizontal position of the first nonblank character. If the
- contents are entirely blank, then this is the horizontal position
- of the end of the line.
- -- Command: indent-to column &optional minimum
- This function indents from point with tabs and spaces until COLUMN
- is reached. If MINIMUM is specified and non-`nil', then at least
- that many spaces are inserted even if this requires going beyond
- COLUMN. Otherwise the function does nothing if point is already
- beyond COLUMN. The value is the column at which the inserted
- indentation ends.
- The inserted whitespace characters inherit text properties from the
- surrounding text (usually, from the preceding text only). *Note
- Sticky Properties::.
- -- User Option: indent-tabs-mode
- If this variable is non-`nil', indentation functions can insert
- tabs as well as spaces. Otherwise, they insert only spaces.
- Setting this variable automatically makes it buffer-local in the
- current buffer.
- File: elisp, Node: Mode-Specific Indent, Next: Region Indent, Prev: Primitive Indent, Up: Indentation
- 32.17.2 Indentation Controlled by Major Mode
- --------------------------------------------
- An important function of each major mode is to customize the <TAB> key
- to indent properly for the language being edited. This section
- describes the mechanism of the <TAB> key and how to control it. The
- functions in this section return unpredictable values.
- -- Command: indent-for-tab-command &optional rigid
- This is the command bound to <TAB> in most editing modes. Its
- usual action is to indent the current line, but it can
- alternatively insert a tab character or indent a region.
- Here is what it does:
- * First, it checks whether Transient Mark mode is enabled and
- the region is active. If so, it called `indent-region' to
- indent all the text in the region (*note Region Indent::).
- * Otherwise, if the indentation function in
- `indent-line-function' is `indent-to-left-margin' (a trivial
- command that inserts a tab character), or if the variable
- `tab-always-indent' specifies that a tab character ought to
- be inserted (see below), then it inserts a tab character.
- * Otherwise, it indents the current line; this is done by
- calling the function in `indent-line-function'. If the line
- is already indented, and the value of `tab-always-indent' is
- `complete' (see below), it tries completing the text at point.
- If RIGID is non-`nil' (interactively, with a prefix argument),
- then after this command indents a line or inserts a tab, it also
- rigidly indents the entire balanced expression which starts at the
- beginning of the current line, in order to reflect the new
- indentation. This argument is ignored if the command indents the
- region.
- -- Variable: indent-line-function
- This variable's value is the function to be used by
- `indent-for-tab-command', and various other indentation commands,
- to indent the current line. It is usually assigned by the major
- mode; for instance, Lisp mode sets it to `lisp-indent-line', C mode
- sets it to `c-indent-line', and so on. The default value is
- `indent-relative'. *Note Auto-Indentation::.
- -- Command: indent-according-to-mode
- This command calls the function in `indent-line-function' to
- indent the current line in a way appropriate for the current major
- mode.
- -- Command: newline-and-indent
- This function inserts a newline, then indents the new line (the one
- following the newline just inserted) according to the major mode.
- It does indentation by calling `indent-according-to-mode'.
- -- Command: reindent-then-newline-and-indent
- This command reindents the current line, inserts a newline at
- point, and then indents the new line (the one following the
- newline just inserted). It does indentation on both lines by
- calling `indent-according-to-mode'.
- -- User Option: tab-always-indent
- This variable can be used to customize the behavior of the <TAB>
- (`indent-for-tab-command') command. If the value is `t' (the
- default), the command normally just indents the current line. If
- the value is `nil', the command indents the current line only if
- point is at the left margin or in the line's indentation;
- otherwise, it inserts a tab character. If the value is
- `complete', the command first tries to indent the current line,
- and if the line was already indented, it calls
- `completion-at-point' to complete the text at point (*note
- Completion in Buffers::).
- File: elisp, Node: Region Indent, Next: Relative Indent, Prev: Mode-Specific Indent, Up: Indentation
- 32.17.3 Indenting an Entire Region
- ----------------------------------
- This section describes commands that indent all the lines in the
- region. They return unpredictable values.
- -- Command: indent-region start end &optional to-column
- This command indents each nonblank line starting between START
- (inclusive) and END (exclusive). If TO-COLUMN is `nil',
- `indent-region' indents each nonblank line by calling the current
- mode's indentation function, the value of `indent-line-function'.
- If TO-COLUMN is non-`nil', it should be an integer specifying the
- number of columns of indentation; then this function gives each
- line exactly that much indentation, by either adding or deleting
- whitespace.
- If there is a fill prefix, `indent-region' indents each line by
- making it start with the fill prefix.
- -- Variable: indent-region-function
- The value of this variable is a function that can be used by
- `indent-region' as a short cut. It should take two arguments, the
- start and end of the region. You should design the function so
- that it will produce the same results as indenting the lines of the
- region one by one, but presumably faster.
- If the value is `nil', there is no short cut, and `indent-region'
- actually works line by line.
- A short-cut function is useful in modes such as C mode and Lisp
- mode, where the `indent-line-function' must scan from the
- beginning of the function definition: applying it to each line
- would be quadratic in time. The short cut can update the scan
- information as it moves through the lines indenting them; this
- takes linear time. In a mode where indenting a line individually
- is fast, there is no need for a short cut.
- `indent-region' with a non-`nil' argument TO-COLUMN has a
- different meaning and does not use this variable.
- -- Command: indent-rigidly start end count
- This command indents all lines starting between START (inclusive)
- and END (exclusive) sideways by COUNT columns. This "preserves
- the shape" of the affected region, moving it as a rigid unit.
- Consequently, this command is useful not only for indenting
- regions of unindented text, but also for indenting regions of
- formatted code.
- For example, if COUNT is 3, this command adds 3 columns of
- indentation to each of the lines beginning in the region specified.
- In Mail mode, `C-c C-y' (`mail-yank-original') uses
- `indent-rigidly' to indent the text copied from the message being
- replied to.
- -- Command: indent-code-rigidly start end columns &optional
- nochange-regexp
- This is like `indent-rigidly', except that it doesn't alter lines
- that start within strings or comments.
- In addition, it doesn't alter a line if NOCHANGE-REGEXP matches at
- the beginning of the line (if NOCHANGE-REGEXP is non-`nil').
- File: elisp, Node: Relative Indent, Next: Indent Tabs, Prev: Region Indent, Up: Indentation
- 32.17.4 Indentation Relative to Previous Lines
- ----------------------------------------------
- This section describes two commands that indent the current line based
- on the contents of previous lines.
- -- Command: indent-relative &optional unindented-ok
- This command inserts whitespace at point, extending to the same
- column as the next "indent point" of the previous nonblank line.
- An indent point is a non-whitespace character following
- whitespace. The next indent point is the first one at a column
- greater than the current column of point. For example, if point
- is underneath and to the left of the first non-blank character of
- a line of text, it moves to that column by inserting whitespace.
- If the previous nonblank line has no next indent point (i.e., none
- at a great enough column position), `indent-relative' either does
- nothing (if UNINDENTED-OK is non-`nil') or calls
- `tab-to-tab-stop'. Thus, if point is underneath and to the right
- of the last column of a short line of text, this command ordinarily
- moves point to the next tab stop by inserting whitespace.
- The return value of `indent-relative' is unpredictable.
- In the following example, point is at the beginning of the second
- line:
- This line is indented twelve spaces.
- -!-The quick brown fox jumped.
- Evaluation of the expression `(indent-relative nil)' produces the
- following:
- This line is indented twelve spaces.
- -!-The quick brown fox jumped.
- In this next example, point is between the `m' and `p' of `jumped':
- This line is indented twelve spaces.
- The quick brown fox jum-!-ped.
- Evaluation of the expression `(indent-relative nil)' produces the
- following:
- This line is indented twelve spaces.
- The quick brown fox jum -!-ped.
- -- Command: indent-relative-maybe
- This command indents the current line like the previous nonblank
- line, by calling `indent-relative' with `t' as the UNINDENTED-OK
- argument. The return value is unpredictable.
- If the previous nonblank line has no indent points beyond the
- current column, this command does nothing.
- File: elisp, Node: Indent Tabs, Next: Motion by Indent, Prev: Relative Indent, Up: Indentation
- 32.17.5 Adjustable "Tab Stops"
- ------------------------------
- This section explains the mechanism for user-specified "tab stops" and
- the mechanisms that use and set them. The name "tab stops" is used
- because the feature is similar to that of the tab stops on a
- typewriter. The feature works by inserting an appropriate number of
- spaces and tab characters to reach the next tab stop column; it does not
- affect the display of tab characters in the buffer (*note Usual
- Display::). Note that the <TAB> character as input uses this tab stop
- feature only in a few major modes, such as Text mode. *Note Tab Stops:
- (emacs)Tab Stops.
- -- Command: tab-to-tab-stop
- This command inserts spaces or tabs before point, up to the next
- tab stop column defined by `tab-stop-list'. It searches the list
- for an element greater than the current column number, and uses
- that element as the column to indent to. It does nothing if no
- such element is found.
- -- User Option: tab-stop-list
- This variable is the list of tab stop columns used by
- `tab-to-tab-stops'. The elements should be integers in increasing
- order. The tab stop columns need not be evenly spaced.
- Use `M-x edit-tab-stops' to edit the location of tab stops
- interactively.
- File: elisp, Node: Motion by Indent, Prev: Indent Tabs, Up: Indentation
- 32.17.6 Indentation-Based Motion Commands
- -----------------------------------------
- These commands, primarily for interactive use, act based on the
- indentation in the text.
- -- Command: back-to-indentation
- This command moves point to the first non-whitespace character in
- the current line (which is the line in which point is located).
- It returns `nil'.
- -- Command: backward-to-indentation &optional arg
- This command moves point backward ARG lines and then to the first
- nonblank character on that line. It returns `nil'. If ARG is
- omitted or `nil', it defaults to 1.
- -- Command: forward-to-indentation &optional arg
- This command moves point forward ARG lines and then to the first
- nonblank character on that line. It returns `nil'. If ARG is
- omitted or `nil', it defaults to 1.
- File: elisp, Node: Case Changes, Next: Text Properties, Prev: Indentation, Up: Text
- 32.18 Case Changes
- ==================
- The case change commands described here work on text in the current
- buffer. *Note Case Conversion::, for case conversion functions that
- work on strings and characters. *Note Case Tables::, for how to
- customize which characters are upper or lower case and how to convert
- them.
- -- Command: capitalize-region start end
- This function capitalizes all words in the region defined by START
- and END. To capitalize means to convert each word's first
- character to upper case and convert the rest of each word to lower
- case. The function returns `nil'.
- If one end of the region is in the middle of a word, the part of
- the word within the region is treated as an entire word.
- When `capitalize-region' is called interactively, START and END
- are point and the mark, with the smallest first.
- ---------- Buffer: foo ----------
- This is the contents of the 5th foo.
- ---------- Buffer: foo ----------
- (capitalize-region 1 44)
- => nil
- ---------- Buffer: foo ----------
- This Is The Contents Of The 5th Foo.
- ---------- Buffer: foo ----------
- -- Command: downcase-region start end
- This function converts all of the letters in the region defined by
- START and END to lower case. The function returns `nil'.
- When `downcase-region' is called interactively, START and END are
- point and the mark, with the smallest first.
- -- Command: upcase-region start end
- This function converts all of the letters in the region defined by
- START and END to upper case. The function returns `nil'.
- When `upcase-region' is called interactively, START and END are
- point and the mark, with the smallest first.
- -- Command: capitalize-word count
- This function capitalizes COUNT words after point, moving point
- over as it does. To capitalize means to convert each word's first
- character to upper case and convert the rest of each word to lower
- case. If COUNT is negative, the function capitalizes the -COUNT
- previous words but does not move point. The value is `nil'.
- If point is in the middle of a word, the part of the word before
- point is ignored when moving forward. The rest is treated as an
- entire word.
- When `capitalize-word' is called interactively, COUNT is set to
- the numeric prefix argument.
- -- Command: downcase-word count
- This function converts the COUNT words after point to all lower
- case, moving point over as it does. If COUNT is negative, it
- converts the -COUNT previous words but does not move point. The
- value is `nil'.
- When `downcase-word' is called interactively, COUNT is set to the
- numeric prefix argument.
- -- Command: upcase-word count
- This function converts the COUNT words after point to all upper
- case, moving point over as it does. If COUNT is negative, it
- converts the -COUNT previous words but does not move point. The
- value is `nil'.
- When `upcase-word' is called interactively, COUNT is set to the
- numeric prefix argument.
- File: elisp, Node: Text Properties, Next: Substitution, Prev: Case Changes, Up: Text
- 32.19 Text Properties
- =====================
- Each character position in a buffer or a string can have a "text
- property list", much like the property list of a symbol (*note Property
- Lists::). The properties belong to a particular character at a
- particular place, such as, the letter `T' at the beginning of this
- sentence or the first `o' in `foo'--if the same character occurs in two
- different places, the two occurrences in general have different
- properties.
- Each property has a name and a value. Both of these can be any Lisp
- object, but the name is normally a symbol. Typically each property
- name symbol is used for a particular purpose; for instance, the text
- property `face' specifies the faces for displaying the character (*note
- Special Properties::). The usual way to access the property list is to
- specify a name and ask what value corresponds to it.
- If a character has a `category' property, we call it the "property
- category" of the character. It should be a symbol. The properties of
- the symbol serve as defaults for the properties of the character.
- Copying text between strings and buffers preserves the properties
- along with the characters; this includes such diverse functions as
- `substring', `insert', and `buffer-substring'.
- * Menu:
- * Examining Properties:: Looking at the properties of one character.
- * Changing Properties:: Setting the properties of a range of text.
- * Property Search:: Searching for where a property changes value.
- * Special Properties:: Particular properties with special meanings.
- * Format Properties:: Properties for representing formatting of text.
- * Sticky Properties:: How inserted text gets properties from
- neighboring text.
- * Lazy Properties:: Computing text properties in a lazy fashion
- only when text is examined.
- * Clickable Text:: Using text properties to make regions of text
- do something when you click on them.
- * Fields:: The `field' property defines
- fields within the buffer.
- * Not Intervals:: Why text properties do not use
- Lisp-visible text intervals.
- File: elisp, Node: Examining Properties, Next: Changing Properties, Up: Text Properties
- 32.19.1 Examining Text Properties
- ---------------------------------
- The simplest way to examine text properties is to ask for the value of
- a particular property of a particular character. For that, use
- `get-text-property'. Use `text-properties-at' to get the entire
- property list of a character. *Note Property Search::, for functions
- to examine the properties of a number of characters at once.
- These functions handle both strings and buffers. Keep in mind that
- positions in a string start from 0, whereas positions in a buffer start
- from 1.
- -- Function: get-text-property pos prop &optional object
- This function returns the value of the PROP property of the
- character after position POS in OBJECT (a buffer or string). The
- argument OBJECT is optional and defaults to the current buffer.
- If there is no PROP property strictly speaking, but the character
- has a property category that is a symbol, then `get-text-property'
- returns the PROP property of that symbol.
- -- Function: get-char-property position prop &optional object
- This function is like `get-text-property', except that it checks
- overlays first and then text properties. *Note Overlays::.
- The argument OBJECT may be a string, a buffer, or a window. If it
- is a window, then the buffer displayed in that window is used for
- text properties and overlays, but only the overlays active for that
- window are considered. If OBJECT is a buffer, then overlays in
- that buffer are considered first, in order of decreasing priority,
- followed by the text properties. If OBJECT is a string, only text
- properties are considered, since strings never have overlays.
- -- Function: get-char-property-and-overlay position prop &optional
- object
- This is like `get-char-property', but gives extra information
- about the overlay that the property value comes from.
- Its value is a cons cell whose CAR is the property value, the same
- value `get-char-property' would return with the same arguments.
- Its CDR is the overlay in which the property was found, or `nil',
- if it was found as a text property or not found at all.
- If POSITION is at the end of OBJECT, both the CAR and the CDR of
- the value are `nil'.
- -- Variable: char-property-alias-alist
- This variable holds an alist which maps property names to a list of
- alternative property names. If a character does not specify a
- direct value for a property, the alternative property names are
- consulted in order; the first non-`nil' value is used. This
- variable takes precedence over `default-text-properties', and
- `category' properties take precedence over this variable.
- -- Function: text-properties-at position &optional object
- This function returns the entire property list of the character at
- POSITION in the string or buffer OBJECT. If OBJECT is `nil', it
- defaults to the current buffer.
- -- Variable: default-text-properties
- This variable holds a property list giving default values for text
- properties. Whenever a character does not specify a value for a
- property, neither directly, through a category symbol, or through
- `char-property-alias-alist', the value stored in this list is used
- instead. Here is an example:
- (setq default-text-properties '(foo 69)
- char-property-alias-alist nil)
- ;; Make sure character 1 has no properties of its own.
- (set-text-properties 1 2 nil)
- ;; What we get, when we ask, is the default value.
- (get-text-property 1 'foo)
- => 69
- File: elisp, Node: Changing Properties, Next: Property Search, Prev: Examining Properties, Up: Text Properties
- 32.19.2 Changing Text Properties
- --------------------------------
- The primitives for changing properties apply to a specified range of
- text in a buffer or string. The function `set-text-properties' (see
- end of section) sets the entire property list of the text in that
- range; more often, it is useful to add, change, or delete just certain
- properties specified by name.
- Since text properties are considered part of the contents of the
- buffer (or string), and can affect how a buffer looks on the screen,
- any change in buffer text properties marks the buffer as modified.
- Buffer text property changes are undoable also (*note Undo::).
- Positions in a string start from 0, whereas positions in a buffer start
- from 1.
- -- Function: put-text-property start end prop value &optional object
- This function sets the PROP property to VALUE for the text between
- START and END in the string or buffer OBJECT. If OBJECT is `nil',
- it defaults to the current buffer.
- -- Function: add-text-properties start end props &optional object
- This function adds or overrides text properties for the text
- between START and END in the string or buffer OBJECT. If OBJECT
- is `nil', it defaults to the current buffer.
- The argument PROPS specifies which properties to add. It should
- have the form of a property list (*note Property Lists::): a list
- whose elements include the property names followed alternately by
- the corresponding values.
- The return value is `t' if the function actually changed some
- property's value; `nil' otherwise (if PROPS is `nil' or its values
- agree with those in the text).
- For example, here is how to set the `comment' and `face'
- properties of a range of text:
- (add-text-properties START END
- '(comment t face highlight))
- -- Function: remove-text-properties start end props &optional object
- This function deletes specified text properties from the text
- between START and END in the string or buffer OBJECT. If OBJECT
- is `nil', it defaults to the current buffer.
- The argument PROPS specifies which properties to delete. It
- should have the form of a property list (*note Property Lists::):
- a list whose elements are property names alternating with
- corresponding values. But only the names matter--the values that
- accompany them are ignored. For example, here's how to remove the
- `face' property.
- (remove-text-properties START END '(face nil))
- The return value is `t' if the function actually changed some
- property's value; `nil' otherwise (if PROPS is `nil' or if no
- character in the specified text had any of those properties).
- To remove all text properties from certain text, use
- `set-text-properties' and specify `nil' for the new property list.
- -- Function: remove-list-of-text-properties start end
- list-of-properties &optional object
- Like `remove-text-properties' except that LIST-OF-PROPERTIES is a
- list of property names only, not an alternating list of property
- names and values.
- -- Function: set-text-properties start end props &optional object
- This function completely replaces the text property list for the
- text between START and END in the string or buffer OBJECT. If
- OBJECT is `nil', it defaults to the current buffer.
- The argument PROPS is the new property list. It should be a list
- whose elements are property names alternating with corresponding
- values.
- After `set-text-properties' returns, all the characters in the
- specified range have identical properties.
- If PROPS is `nil', the effect is to get rid of all properties from
- the specified range of text. Here's an example:
- (set-text-properties START END nil)
- Do not rely on the return value of this function.
- The easiest way to make a string with text properties is with
- `propertize':
- -- Function: propertize string &rest properties
- This function returns a copy of STRING which has the text
- properties PROPERTIES. These properties apply to all the
- characters in the string that is returned. Here is an example that
- constructs a string with a `face' property and a `mouse-face'
- property:
- (propertize "foo" 'face 'italic
- 'mouse-face 'bold-italic)
- => #("foo" 0 3 (mouse-face bold-italic face italic))
- To put different properties on various parts of a string, you can
- construct each part with `propertize' and then combine them with
- `concat':
- (concat
- (propertize "foo" 'face 'italic
- 'mouse-face 'bold-italic)
- " and "
- (propertize "bar" 'face 'italic
- 'mouse-face 'bold-italic))
- => #("foo and bar"
- 0 3 (face italic mouse-face bold-italic)
- 3 8 nil
- 8 11 (face italic mouse-face bold-italic))
- *Note Buffer Contents::, for the function
- `buffer-substring-no-properties', which copies text from the buffer but
- does not copy its properties.
- File: elisp, Node: Property Search, Next: Special Properties, Prev: Changing Properties, Up: Text Properties
- 32.19.3 Text Property Search Functions
- --------------------------------------
- In typical use of text properties, most of the time several or many
- consecutive characters have the same value for a property. Rather than
- writing your programs to examine characters one by one, it is much
- faster to process chunks of text that have the same property value.
- Here are functions you can use to do this. They use `eq' for
- comparing property values. In all cases, OBJECT defaults to the
- current buffer.
- For good performance, it's very important to use the LIMIT argument
- to these functions, especially the ones that search for a single
- property--otherwise, they may spend a long time scanning to the end of
- the buffer, if the property you are interested in does not change.
- These functions do not move point; instead, they return a position
- (or `nil'). Remember that a position is always between two characters;
- the position returned by these functions is between two characters with
- different properties.
- -- Function: next-property-change pos &optional object limit
- The function scans the text forward from position POS in the
- string or buffer OBJECT until it finds a change in some text
- property, then returns the position of the change. In other
- words, it returns the position of the first character beyond POS
- whose properties are not identical to those of the character just
- after POS.
- If LIMIT is non-`nil', then the scan ends at position LIMIT. If
- there is no property change before that point, this function
- returns LIMIT.
- The value is `nil' if the properties remain unchanged all the way
- to the end of OBJECT and LIMIT is `nil'. If the value is
- non-`nil', it is a position greater than or equal to POS. The
- value equals POS only when LIMIT equals POS.
- Here is an example of how to scan the buffer by chunks of text
- within which all properties are constant:
- (while (not (eobp))
- (let ((plist (text-properties-at (point)))
- (next-change
- (or (next-property-change (point) (current-buffer))
- (point-max))))
- Process text from point to NEXT-CHANGE...
- (goto-char next-change)))
- -- Function: previous-property-change pos &optional object limit
- This is like `next-property-change', but scans back from POS
- instead of forward. If the value is non-`nil', it is a position
- less than or equal to POS; it equals POS only if LIMIT equals POS.
- -- Function: next-single-property-change pos prop &optional object
- limit
- The function scans text for a change in the PROP property, then
- returns the position of the change. The scan goes forward from
- position POS in the string or buffer OBJECT. In other words, this
- function returns the position of the first character beyond POS
- whose PROP property differs from that of the character just after
- POS.
- If LIMIT is non-`nil', then the scan ends at position LIMIT. If
- there is no property change before that point,
- `next-single-property-change' returns LIMIT.
- The value is `nil' if the property remains unchanged all the way to
- the end of OBJECT and LIMIT is `nil'. If the value is non-`nil',
- it is a position greater than or equal to POS; it equals POS only
- if LIMIT equals POS.
- -- Function: previous-single-property-change pos prop &optional object
- limit
- This is like `next-single-property-change', but scans back from
- POS instead of forward. If the value is non-`nil', it is a
- position less than or equal to POS; it equals POS only if LIMIT
- equals POS.
- -- Function: next-char-property-change pos &optional limit
- This is like `next-property-change' except that it considers
- overlay properties as well as text properties, and if no change is
- found before the end of the buffer, it returns the maximum buffer
- position rather than `nil' (in this sense, it resembles the
- corresponding overlay function `next-overlay-change', rather than
- `next-property-change'). There is no OBJECT operand because this
- function operates only on the current buffer. It returns the next
- address at which either kind of property changes.
- -- Function: previous-char-property-change pos &optional limit
- This is like `next-char-property-change', but scans back from POS
- instead of forward, and returns the minimum buffer position if no
- change is found.
- -- Function: next-single-char-property-change pos prop &optional
- object limit
- This is like `next-single-property-change' except that it
- considers overlay properties as well as text properties, and if no
- change is found before the end of the OBJECT, it returns the
- maximum valid position in OBJECT rather than `nil'. Unlike
- `next-char-property-change', this function _does_ have an OBJECT
- operand; if OBJECT is not a buffer, only text-properties are
- considered.
- -- Function: previous-single-char-property-change pos prop &optional
- object limit
- This is like `next-single-char-property-change', but scans back
- from POS instead of forward, and returns the minimum valid
- position in OBJECT if no change is found.
- -- Function: text-property-any start end prop value &optional object
- This function returns non-`nil' if at least one character between
- START and END has a property PROP whose value is VALUE. More
- precisely, it returns the position of the first such character.
- Otherwise, it returns `nil'.
- The optional fifth argument, OBJECT, specifies the string or
- buffer to scan. Positions are relative to OBJECT. The default
- for OBJECT is the current buffer.
- -- Function: text-property-not-all start end prop value &optional
- object
- This function returns non-`nil' if at least one character between
- START and END does not have a property PROP with value VALUE.
- More precisely, it returns the position of the first such
- character. Otherwise, it returns `nil'.
- The optional fifth argument, OBJECT, specifies the string or
- buffer to scan. Positions are relative to OBJECT. The default
- for OBJECT is the current buffer.
- File: elisp, Node: Special Properties, Next: Format Properties, Prev: Property Search, Up: Text Properties
- 32.19.4 Properties with Special Meanings
- ----------------------------------------
- Here is a table of text property names that have special built-in
- meanings. The following sections list a few additional special property
- names that control filling and property inheritance. All other names
- have no standard meaning, and you can use them as you like.
- Note: the properties `composition', `display', `invisible' and
- `intangible' can also cause point to move to an acceptable place, after
- each Emacs command. *Note Adjusting Point::.
- `category'
- If a character has a `category' property, we call it the "property
- category" of the character. It should be a symbol. The
- properties of this symbol serve as defaults for the properties of
- the character.
- `face'
- The `face' property controls the appearance of the character, such
- as its font and color. *Note Faces::. The value of the property
- can be the following:
- * A face name (a symbol or string).
- * A property list of face attributes. This has the form
- (KEYWORD VALUE ...), where each KEYWORD is a face attribute
- name and VALUE is a meaningful value for that attribute.
- With this feature, you do not need to create a face each time
- you want to specify a particular attribute for certain text.
- *Note Face Attributes::.
- * A list, where each element uses one of the two forms listed
- above.
- Font Lock mode (*note Font Lock Mode::) works in most buffers by
- dynamically updating the `face' property of characters based on
- the context.
- `font-lock-face'
- This property specifies a value for the `face' property that Font
- Lock mode should apply to the underlying text. It is one of the
- fontification methods used by Font Lock mode, and is useful for
- special modes that implement their own highlighting. *Note
- Precalculated Fontification::. When Font Lock mode is disabled,
- `font-lock-face' has no effect.
- `mouse-face'
- This property is used instead of `face' when the mouse is on or
- near the character. For this purpose, "near" means that all text
- between the character and where the mouse is have the same
- `mouse-face' property value.
- Emacs ignores all face attributes from the `mouse-face' property
- that alter the text size (e.g. `:height', `:weight', and
- `:slant'). Those attributes are always the same as for the
- unhighlighted text.
- `fontified'
- This property says whether the text is ready for display. If
- `nil', Emacs's redisplay routine calls the functions in
- `fontification-functions' (*note Auto Faces::) to prepare this
- part of the buffer before it is displayed. It is used internally
- by the "just in time" font locking code.
- `display'
- This property activates various features that change the way text
- is displayed. For example, it can make text appear taller or
- shorter, higher or lower, wider or narrow, or replaced with an
- image. *Note Display Property::.
- `help-echo'
- If text has a string as its `help-echo' property, then when you
- move the mouse onto that text, Emacs displays that string in the
- echo area, or in the tooltip window (*note Tooltips:
- (emacs)Tooltips.).
- If the value of the `help-echo' property is a function, that
- function is called with three arguments, WINDOW, OBJECT and POS
- and should return a help string or `nil' for none. The first
- argument, WINDOW is the window in which the help was found. The
- second, OBJECT, is the buffer, overlay or string which had the
- `help-echo' property. The POS argument is as follows:
- * If OBJECT is a buffer, POS is the position in the buffer.
- * If OBJECT is an overlay, that overlay has a `help-echo'
- property, and POS is the position in the overlay's buffer.
- * If OBJECT is a string (an overlay string or a string displayed
- with the `display' property), POS is the position in that
- string.
- If the value of the `help-echo' property is neither a function nor
- a string, it is evaluated to obtain a help string.
- You can alter the way help text is displayed by setting the
- variable `show-help-function' (*note Help display::).
- This feature is used in the mode line and for other active text.
- `keymap'
- The `keymap' property specifies an additional keymap for commands.
- When this keymap applies, it is used for key lookup before the
- minor mode keymaps and before the buffer's local map. *Note
- Active Keymaps::. If the property value is a symbol, the symbol's
- function definition is used as the keymap.
- The property's value for the character before point applies if it
- is non-`nil' and rear-sticky, and the property's value for the
- character after point applies if it is non-`nil' and front-sticky.
- (For mouse clicks, the position of the click is used instead of
- the position of point.)
- `local-map'
- This property works like `keymap' except that it specifies a
- keymap to use _instead of_ the buffer's local map. For most
- purposes (perhaps all purposes), it is better to use the `keymap'
- property.
- `syntax-table'
- The `syntax-table' property overrides what the syntax table says
- about this particular character. *Note Syntax Properties::.
- `read-only'
- If a character has the property `read-only', then modifying that
- character is not allowed. Any command that would do so gets an
- error, `text-read-only'. If the property value is a string, that
- string is used as the error message.
- Insertion next to a read-only character is an error if inserting
- ordinary text there would inherit the `read-only' property due to
- stickiness. Thus, you can control permission to insert next to
- read-only text by controlling the stickiness. *Note Sticky
- Properties::.
- Since changing properties counts as modifying the buffer, it is not
- possible to remove a `read-only' property unless you know the
- special trick: bind `inhibit-read-only' to a non-`nil' value and
- then remove the property. *Note Read Only Buffers::.
- `invisible'
- A non-`nil' `invisible' property can make a character invisible on
- the screen. *Note Invisible Text::, for details.
- `intangible'
- If a group of consecutive characters have equal and non-`nil'
- `intangible' properties, then you cannot place point between them.
- If you try to move point forward into the group, point actually
- moves to the end of the group. If you try to move point backward
- into the group, point actually moves to the start of the group.
- If consecutive characters have unequal non-`nil' `intangible'
- properties, they belong to separate groups; each group is
- separately treated as described above.
- When the variable `inhibit-point-motion-hooks' is non-`nil', the
- `intangible' property is ignored.
- Beware: this property operates at a very low level, and affects a
- lot of code in unexpected ways. So use it with extreme caution.
- A common misuse is to put an intangible property on invisible
- text, which is actually unnecessary since the command loop will
- move point outside of the invisible text at the end of each
- command anyway. *Note Adjusting Point::.
- `field'
- Consecutive characters with the same `field' property constitute a
- "field". Some motion functions including `forward-word' and
- `beginning-of-line' stop moving at a field boundary. *Note
- Fields::.
- `cursor'
- Normally, the cursor is displayed at the beginning or the end of
- any overlay and text property strings present at the current buffer
- position. You can place the cursor on any desired character of
- these strings by giving that character a non-`nil' `cursor' text
- property. In addition, if the value of the `cursor' property is
- an integer number, it specifies the number of buffer's character
- positions, starting with the position where the overlay or the
- `display' property begins, for which the cursor should be
- displayed on that character. Specifically, if the value of the
- `cursor' property of a character is the number N, the cursor will
- be displayed on this character for any buffer position in the
- range `[OVPOS..OVPOS+N)', where OVPOS is the overlay's starting
- position given by `overlay-start' (*note Managing Overlays::), or
- the position where the `display' text property begins in the
- buffer.
- In other words, the string character with the `cursor' property of
- any non-`nil' value is the character where to display the cursor.
- The value of the property says for which buffer positions to
- display the cursor there. If the value is an integer number N,
- the cursor is displayed there when point is anywhere between the
- beginning of the overlay or `display' property and N positions
- after that. If the value is anything else and non-`nil', the
- cursor is displayed there only when point is at the beginning of
- the `display' property or at `overlay-start'.
- When the buffer has many overlay strings (e.g., *note
- before-string: Overlay Properties.) or `display' properties that
- are strings, it is a good idea to use the `cursor' property on
- these strings to cue the Emacs display about the places where to
- put the cursor while traversing these strings. This directly
- communicates to the display engine where the Lisp program wants to
- put the cursor, or where the user would expect the cursor.
- `pointer'
- This specifies a specific pointer shape when the mouse pointer is
- over this text or image. *Note Pointer Shape::, for possible
- pointer shapes.
- `line-spacing'
- A newline can have a `line-spacing' text or overlay property that
- controls the height of the display line ending with that newline.
- The property value overrides the default frame line spacing and
- the buffer local `line-spacing' variable. *Note Line Height::.
- `line-height'
- A newline can have a `line-height' text or overlay property that
- controls the total height of the display line ending in that
- newline. *Note Line Height::.
- `wrap-prefix'
- If text has a `wrap-prefix' property, the prefix it defines will
- be added at display time to the beginning of every continuation
- line due to text wrapping (so if lines are truncated, the
- wrap-prefix is never used). It may be a string or an image (*note
- Other Display Specs::), or a stretch of whitespace such as
- specified by the `:width' or `:align-to' display properties (*note
- Specified Space::).
- A wrap-prefix may also be specified for an entire buffer using the
- `wrap-prefix' buffer-local variable (however, a `wrap-prefix'
- text-property takes precedence over the value of the `wrap-prefix'
- variable). *Note Truncation::.
- `line-prefix'
- If text has a `line-prefix' property, the prefix it defines will
- be added at display time to the beginning of every non-continuation
- line. It may be a string or an image (*note Other Display
- Specs::), or a stretch of whitespace such as specified by the
- `:width' or `:align-to' display properties (*note Specified
- Space::).
- A line-prefix may also be specified for an entire buffer using the
- `line-prefix' buffer-local variable (however, a `line-prefix'
- text-property takes precedence over the value of the `line-prefix'
- variable). *Note Truncation::.
- `modification-hooks'
- If a character has the property `modification-hooks', then its
- value should be a list of functions; modifying that character calls
- all of those functions before the actual modification. Each
- function receives two arguments: the beginning and end of the part
- of the buffer being modified. Note that if a particular
- modification hook function appears on several characters being
- modified by a single primitive, you can't predict how many times
- the function will be called. Furthermore, insertion will not
- modify any existing character, so this hook will only be run when
- removing some characters, replacing them with others, or changing
- their text-properties.
- If these functions modify the buffer, they should bind
- `inhibit-modification-hooks' to `t' around doing so, to avoid
- confusing the internal mechanism that calls these hooks.
- Overlays also support the `modification-hooks' property, but the
- details are somewhat different (*note Overlay Properties::).
- `insert-in-front-hooks'
- `insert-behind-hooks'
- The operation of inserting text in a buffer also calls the
- functions listed in the `insert-in-front-hooks' property of the
- following character and in the `insert-behind-hooks' property of
- the preceding character. These functions receive two arguments,
- the beginning and end of the inserted text. The functions are
- called _after_ the actual insertion takes place.
- See also *note Change Hooks::, for other hooks that are called
- when you change text in a buffer.
- `point-entered'
- `point-left'
- The special properties `point-entered' and `point-left' record
- hook functions that report motion of point. Each time point
- moves, Emacs compares these two property values:
- * the `point-left' property of the character after the old
- location, and
- * the `point-entered' property of the character after the new
- location.
- If these two values differ, each of them is called (if not `nil')
- with two arguments: the old value of point, and the new one.
- The same comparison is made for the characters before the old and
- new locations. The result may be to execute two `point-left'
- functions (which may be the same function) and/or two
- `point-entered' functions (which may be the same function). In
- any case, all the `point-left' functions are called first,
- followed by all the `point-entered' functions.
- It is possible to use `char-after' to examine characters at various
- buffer positions without moving point to those positions. Only an
- actual change in the value of point runs these hook functions.
- The variable `inhibit-point-motion-hooks' can inhibit running the
- `point-left' and `point-entered' hooks, see *note Inhibit point
- motion hooks::.
- `composition'
- This text property is used to display a sequence of characters as a
- single glyph composed from components. But the value of the
- property itself is completely internal to Emacs and should not be
- manipulated directly by, for instance, `put-text-property'.
- -- Variable: inhibit-point-motion-hooks
- When this variable is non-`nil', `point-left' and `point-entered'
- hooks are not run, and the `intangible' property has no effect.
- Do not set this variable globally; bind it with `let'.
- -- Variable: show-help-function
- If this variable is non-`nil', it specifies a function called to
- display help strings. These may be `help-echo' properties, menu
- help strings (*note Simple Menu Items::, *note Extended Menu
- Items::), or tool bar help strings (*note Tool Bar::). The
- specified function is called with one argument, the help string to
- display. Tooltip mode (*note Tooltips: (emacs)Tooltips.) provides
- an example.
- File: elisp, Node: Format Properties, Next: Sticky Properties, Prev: Special Properties, Up: Text Properties
- 32.19.5 Formatted Text Properties
- ---------------------------------
- These text properties affect the behavior of the fill commands. They
- are used for representing formatted text. *Note Filling::, and *note
- Margins::.
- `hard'
- If a newline character has this property, it is a "hard" newline.
- The fill commands do not alter hard newlines and do not move words
- across them. However, this property takes effect only if the
- `use-hard-newlines' minor mode is enabled. *Note Hard and Soft
- Newlines: (emacs)Hard and Soft Newlines.
- `right-margin'
- This property specifies an extra right margin for filling this
- part of the text.
- `left-margin'
- This property specifies an extra left margin for filling this part
- of the text.
- `justification'
- This property specifies the style of justification for filling
- this part of the text.
- File: elisp, Node: Sticky Properties, Next: Lazy Properties, Prev: Format Properties, Up: Text Properties
- 32.19.6 Stickiness of Text Properties
- -------------------------------------
- Self-inserting characters normally take on the same properties as the
- preceding character. This is called "inheritance" of properties.
- A Lisp program can do insertion with inheritance or without,
- depending on the choice of insertion primitive. The ordinary text
- insertion functions, such as `insert', do not inherit any properties.
- They insert text with precisely the properties of the string being
- inserted, and no others. This is correct for programs that copy text
- from one context to another--for example, into or out of the kill ring.
- To insert with inheritance, use the special primitives described in
- this section. Self-inserting characters inherit properties because
- they work using these primitives.
- When you do insertion with inheritance, _which_ properties are
- inherited, and from where, depends on which properties are "sticky".
- Insertion after a character inherits those of its properties that are
- "rear-sticky". Insertion before a character inherits those of its
- properties that are "front-sticky". When both sides offer different
- sticky values for the same property, the previous character's value
- takes precedence.
- By default, a text property is rear-sticky but not front-sticky;
- thus, the default is to inherit all the properties of the preceding
- character, and nothing from the following character.
- You can control the stickiness of various text properties with two
- specific text properties, `front-sticky' and `rear-nonsticky', and with
- the variable `text-property-default-nonsticky'. You can use the
- variable to specify a different default for a given property. You can
- use those two text properties to make any specific properties sticky or
- nonsticky in any particular part of the text.
- If a character's `front-sticky' property is `t', then all its
- properties are front-sticky. If the `front-sticky' property is a list,
- then the sticky properties of the character are those whose names are
- in the list. For example, if a character has a `front-sticky' property
- whose value is `(face read-only)', then insertion before the character
- can inherit its `face' property and its `read-only' property, but no
- others.
- The `rear-nonsticky' property works the opposite way. Most
- properties are rear-sticky by default, so the `rear-nonsticky' property
- says which properties are _not_ rear-sticky. If a character's
- `rear-nonsticky' property is `t', then none of its properties are
- rear-sticky. If the `rear-nonsticky' property is a list, properties
- are rear-sticky _unless_ their names are in the list.
- -- Variable: text-property-default-nonsticky
- This variable holds an alist which defines the default
- rear-stickiness of various text properties. Each element has the
- form `(PROPERTY . NONSTICKINESS)', and it defines the stickiness
- of a particular text property, PROPERTY.
- If NONSTICKINESS is non-`nil', this means that the property
- PROPERTY is rear-nonsticky by default. Since all properties are
- front-nonsticky by default, this makes PROPERTY nonsticky in both
- directions by default.
- The text properties `front-sticky' and `rear-nonsticky', when
- used, take precedence over the default NONSTICKINESS specified in
- `text-property-default-nonsticky'.
- Here are the functions that insert text with inheritance of
- properties:
- -- Function: insert-and-inherit &rest strings
- Insert the strings STRINGS, just like the function `insert', but
- inherit any sticky properties from the adjoining text.
- -- Function: insert-before-markers-and-inherit &rest strings
- Insert the strings STRINGS, just like the function
- `insert-before-markers', but inherit any sticky properties from the
- adjoining text.
- *Note Insertion::, for the ordinary insertion functions which do not
- inherit.
- File: elisp, Node: Lazy Properties, Next: Clickable Text, Prev: Sticky Properties, Up: Text Properties
- 32.19.7 Lazy Computation of Text Properties
- -------------------------------------------
- Instead of computing text properties for all the text in the buffer,
- you can arrange to compute the text properties for parts of the text
- when and if something depends on them.
- The primitive that extracts text from the buffer along with its
- properties is `buffer-substring'. Before examining the properties,
- this function runs the abnormal hook `buffer-access-fontify-functions'.
- -- Variable: buffer-access-fontify-functions
- This variable holds a list of functions for computing text
- properties. Before `buffer-substring' copies the text and text
- properties for a portion of the buffer, it calls all the functions
- in this list. Each of the functions receives two arguments that
- specify the range of the buffer being accessed. (The buffer
- itself is always the current buffer.)
- The function `buffer-substring-no-properties' does not call these
- functions, since it ignores text properties anyway.
- In order to prevent the hook functions from being called more than
- once for the same part of the buffer, you can use the variable
- `buffer-access-fontified-property'.
- -- Variable: buffer-access-fontified-property
- If this variable's value is non-`nil', it is a symbol which is used
- as a text property name. A non-`nil' value for that text property
- means, "the other text properties for this character have already
- been computed".
- If all the characters in the range specified for `buffer-substring'
- have a non-`nil' value for this property, `buffer-substring' does
- not call the `buffer-access-fontify-functions' functions. It
- assumes these characters already have the right text properties,
- and just copies the properties they already have.
- The normal way to use this feature is that the
- `buffer-access-fontify-functions' functions add this property, as
- well as others, to the characters they operate on. That way, they
- avoid being called over and over for the same text.
- File: elisp, Node: Clickable Text, Next: Fields, Prev: Lazy Properties, Up: Text Properties
- 32.19.8 Defining Clickable Text
- -------------------------------
- "Clickable text" is text that can be clicked, with either the mouse or
- via a keyboard command, to produce some result. Many major modes use
- clickable text to implement textual hyper-links, or "links" for short.
- The easiest way to insert and manipulate links is to use the
- `button' package. *Note Buttons::. In this section, we will explain
- how to manually set up clickable text in a buffer, using text
- properties. For simplicity, we will refer to the clickable text as a
- "link".
- Implementing a link involves three separate steps: (1) indicating
- clickability when the mouse moves over the link; (2) making <RET> or
- `Mouse-2' on that link do something; and (3) setting up a `follow-link'
- condition so that the link obeys `mouse-1-click-follows-link'.
- To indicate clickability, add the `mouse-face' text property to the
- text of the link; then Emacs will highlight the link when the mouse
- moves over it. In addition, you should define a tooltip or echo area
- message, using the `help-echo' text property. *Note Special
- Properties::. For instance, here is how Dired indicates that file
- names are clickable:
- (if (dired-move-to-filename)
- (add-text-properties
- (point)
- (save-excursion
- (dired-move-to-end-of-filename)
- (point))
- '(mouse-face highlight
- help-echo "mouse-2: visit this file in other window")))
- To make the link clickable, bind <RET> and `Mouse-2' to commands
- that perform the desired action. Each command should check to see
- whether it was called on a link, and act accordingly. For instance,
- Dired's major mode keymap binds `Mouse-2' to the following command:
- (defun dired-mouse-find-file-other-window (event)
- "In Dired, visit the file or directory name you click on."
- (interactive "e")
- (let ((window (posn-window (event-end event)))
- (pos (posn-point (event-end event)))
- file)
- (if (not (windowp window))
- (error "No file chosen"))
- (with-current-buffer (window-buffer window)
- (goto-char pos)
- (setq file (dired-get-file-for-visit)))
- (if (file-directory-p file)
- (or (and (cdr dired-subdir-alist)
- (dired-goto-subdir file))
- (progn
- (select-window window)
- (dired-other-window file)))
- (select-window window)
- (find-file-other-window (file-name-sans-versions file t)))))
- This command uses the functions `posn-window' and `posn-point' to
- determine where the click occurred, and `dired-get-file-for-visit' to
- determine which file to visit.
- Instead of binding the mouse command in a major mode keymap, you can
- bind it within the link text, using the `keymap' text property (*note
- Special Properties::). For instance:
- (let ((map (make-sparse-keymap)))
- (define-key map [mouse-2] 'operate-this-button)
- (put-text-property link-start link-end 'keymap map))
- With this method, you can easily define different commands for
- different links. Furthermore, the global definition of <RET> and
- `Mouse-2' remain available for the rest of the text in the buffer.
- The basic Emacs command for clicking on links is `Mouse-2'.
- However, for compatibility with other graphical applications, Emacs
- also recognizes `Mouse-1' clicks on links, provided the user clicks on
- the link quickly without moving the mouse. This behavior is controlled
- by the user option `mouse-1-click-follows-link'. *Note Mouse
- References: (emacs)Mouse References.
- To set up the link so that it obeys `mouse-1-click-follows-link',
- you must either (1) apply a `follow-link' text or overlay property to
- the link text, or (2) bind the `follow-link' event to a keymap (which
- can be a major mode keymap or a local keymap specified via the `keymap'
- text property). The value of the `follow-link' property, or the
- binding for the `follow-link' event, acts as a "condition" for the link
- action. This condition tells Emacs two things: the circumstances under
- which a `Mouse-1' click should be regarded as occurring "inside" the
- link, and how to compute an "action code" that says what to translate
- the `Mouse-1' click into. The link action condition can be one of the
- following:
- `mouse-face'
- If the condition is the symbol `mouse-face', a position is inside
- a link if there is a non-`nil' `mouse-face' property at that
- position. The action code is always `t'.
- For example, here is how Info mode handles <Mouse-1>:
- (define-key Info-mode-map [follow-link] 'mouse-face)
- a function
- If the condition is a function, FUNC, then a position POS is
- inside a link if `(FUNC POS)' evaluates to non-`nil'. The value
- returned by FUNC serves as the action code.
- For example, here is how pcvs enables `Mouse-1' to follow links on
- file names only:
- (define-key map [follow-link]
- (lambda (pos)
- (eq (get-char-property pos 'face) 'cvs-filename-face)))
- anything else
- If the condition value is anything else, then the position is
- inside a link and the condition itself is the action code.
- Clearly, you should specify this kind of condition only when
- applying the condition via a text or property overlay on the link
- text (so that it does not apply to the entire buffer).
- The action code tells `Mouse-1' how to follow the link:
- a string or vector
- If the action code is a string or vector, the `Mouse-1' event is
- translated into the first element of the string or vector; i.e.,
- the action of the `Mouse-1' click is the local or global binding of
- that character or symbol. Thus, if the action code is `"foo"',
- `Mouse-1' translates into `f'. If it is `[foo]', `Mouse-1'
- translates into <foo>.
- anything else
- For any other non-`nil' action code, the `Mouse-1' event is
- translated into a `Mouse-2' event at the same position.
- To define `Mouse-1' to activate a button defined with
- `define-button-type', give the button a `follow-link' property. The
- property value should be a link action condition, as described above.
- *Note Buttons::. For example, here is how Help mode handles `Mouse-1':
- (define-button-type 'help-xref
- 'follow-link t
- 'action #'help-button-action)
- To define `Mouse-1' on a widget defined with `define-widget', give
- the widget a `:follow-link' property. The property value should be a
- link action condition, as described above. For example, here is how
- the `link' widget specifies that a <Mouse-1> click shall be translated
- to <RET>:
- (define-widget 'link 'item
- "An embedded link."
- :button-prefix 'widget-link-prefix
- :button-suffix 'widget-link-suffix
- :follow-link "\C-m"
- :help-echo "Follow the link."
- :format "%[%t%]")
- -- Function: mouse-on-link-p pos
- This function returns non-`nil' if position POS in the current
- buffer is on a link. POS can also be a mouse event location, as
- returned by `event-start' (*note Accessing Mouse::).
- File: elisp, Node: Fields, Next: Not Intervals, Prev: Clickable Text, Up: Text Properties
- 32.19.9 Defining and Using Fields
- ---------------------------------
- A field is a range of consecutive characters in the buffer that are
- identified by having the same value (comparing with `eq') of the
- `field' property (either a text-property or an overlay property). This
- section describes special functions that are available for operating on
- fields.
- You specify a field with a buffer position, POS. We think of each
- field as containing a range of buffer positions, so the position you
- specify stands for the field containing that position.
- When the characters before and after POS are part of the same field,
- there is no doubt which field contains POS: the one those characters
- both belong to. When POS is at a boundary between fields, which field
- it belongs to depends on the stickiness of the `field' properties of
- the two surrounding characters (*note Sticky Properties::). The field
- whose property would be inherited by text inserted at POS is the field
- that contains POS.
- There is an anomalous case where newly inserted text at POS would
- not inherit the `field' property from either side. This happens if the
- previous character's `field' property is not rear-sticky, and the
- following character's `field' property is not front-sticky. In this
- case, POS belongs to neither the preceding field nor the following
- field; the field functions treat it as belonging to an empty field
- whose beginning and end are both at POS.
- In all of these functions, if POS is omitted or `nil', the value of
- point is used by default. If narrowing is in effect, then POS should
- fall within the accessible portion. *Note Narrowing::.
- -- Function: field-beginning &optional pos escape-from-edge limit
- This function returns the beginning of the field specified by POS.
- If POS is at the beginning of its field, and ESCAPE-FROM-EDGE is
- non-`nil', then the return value is always the beginning of the
- preceding field that _ends_ at POS, regardless of the stickiness
- of the `field' properties around POS.
- If LIMIT is non-`nil', it is a buffer position; if the beginning
- of the field is before LIMIT, then LIMIT will be returned instead.
- -- Function: field-end &optional pos escape-from-edge limit
- This function returns the end of the field specified by POS.
- If POS is at the end of its field, and ESCAPE-FROM-EDGE is
- non-`nil', then the return value is always the end of the following
- field that _begins_ at POS, regardless of the stickiness of the
- `field' properties around POS.
- If LIMIT is non-`nil', it is a buffer position; if the end of the
- field is after LIMIT, then LIMIT will be returned instead.
- -- Function: field-string &optional pos
- This function returns the contents of the field specified by POS,
- as a string.
- -- Function: field-string-no-properties &optional pos
- This function returns the contents of the field specified by POS,
- as a string, discarding text properties.
- -- Function: delete-field &optional pos
- This function deletes the text of the field specified by POS.
- -- Function: constrain-to-field new-pos old-pos &optional
- escape-from-edge only-in-line inhibit-capture-property
- This function "constrains" NEW-POS to the field that OLD-POS
- belongs to--in other words, it returns the position closest to
- NEW-POS that is in the same field as OLD-POS.
- If NEW-POS is `nil', then `constrain-to-field' uses the value of
- point instead, and moves point to the resulting position in
- addition to returning that position.
- If OLD-POS is at the boundary of two fields, then the acceptable
- final positions depend on the argument ESCAPE-FROM-EDGE. If
- ESCAPE-FROM-EDGE is `nil', then NEW-POS must be in the field whose
- `field' property equals what new characters inserted at OLD-POS
- would inherit. (This depends on the stickiness of the `field'
- property for the characters before and after OLD-POS.) If
- ESCAPE-FROM-EDGE is non-`nil', NEW-POS can be anywhere in the two
- adjacent fields. Additionally, if two fields are separated by
- another field with the special value `boundary', then any point
- within this special field is also considered to be "on the
- boundary".
- Commands like `C-a' with no argument, that normally move backward
- to a specific kind of location and stay there once there, probably
- should specify `nil' for ESCAPE-FROM-EDGE. Other motion commands
- that check fields should probably pass `t'.
- If the optional argument ONLY-IN-LINE is non-`nil', and
- constraining NEW-POS in the usual way would move it to a different
- line, NEW-POS is returned unconstrained. This used in commands
- that move by line, such as `next-line' and `beginning-of-line', so
- that they respect field boundaries only in the case where they can
- still move to the right line.
- If the optional argument INHIBIT-CAPTURE-PROPERTY is non-`nil',
- and OLD-POS has a non-`nil' property of that name, then any field
- boundaries are ignored.
- You can cause `constrain-to-field' to ignore all field boundaries
- (and so never constrain anything) by binding the variable
- `inhibit-field-text-motion' to a non-`nil' value.
- File: elisp, Node: Not Intervals, Prev: Fields, Up: Text Properties
- 32.19.10 Why Text Properties are not Intervals
- ----------------------------------------------
- Some editors that support adding attributes to text in the buffer do so
- by letting the user specify "intervals" within the text, and adding the
- properties to the intervals. Those editors permit the user or the
- programmer to determine where individual intervals start and end. We
- deliberately provided a different sort of interface in Emacs Lisp to
- avoid certain paradoxical behavior associated with text modification.
- If the actual subdivision into intervals is meaningful, that means
- you can distinguish between a buffer that is just one interval with a
- certain property, and a buffer containing the same text subdivided into
- two intervals, both of which have that property.
- Suppose you take the buffer with just one interval and kill part of
- the text. The text remaining in the buffer is one interval, and the
- copy in the kill ring (and the undo list) becomes a separate interval.
- Then if you yank back the killed text, you get two intervals with the
- same properties. Thus, editing does not preserve the distinction
- between one interval and two.
- Suppose we "fix" this problem by coalescing the two intervals when
- the text is inserted. That works fine if the buffer originally was a
- single interval. But suppose instead that we have two adjacent
- intervals with the same properties, and we kill the text of one interval
- and yank it back. The same interval-coalescence feature that rescues
- the other case causes trouble in this one: after yanking, we have just
- one interval. One again, editing does not preserve the distinction
- between one interval and two.
- Insertion of text at the border between intervals also raises
- questions that have no satisfactory answer.
- However, it is easy to arrange for editing to behave consistently for
- questions of the form, "What are the properties of this character?" So
- we have decided these are the only questions that make sense; we have
- not implemented asking questions about where intervals start or end.
- In practice, you can usually use the text property search functions
- in place of explicit interval boundaries. You can think of them as
- finding the boundaries of intervals, assuming that intervals are always
- coalesced whenever possible. *Note Property Search::.
- Emacs also provides explicit intervals as a presentation feature; see
- *note Overlays::.
- File: elisp, Node: Substitution, Next: Transposition, Prev: Text Properties, Up: Text
- 32.20 Substituting for a Character Code
- =======================================
- The following functions replace characters within a specified region
- based on their character codes.
- -- Function: subst-char-in-region start end old-char new-char
- &optional noundo
- This function replaces all occurrences of the character OLD-CHAR
- with the character NEW-CHAR in the region of the current buffer
- defined by START and END.
- If NOUNDO is non-`nil', then `subst-char-in-region' does not
- record the change for undo and does not mark the buffer as
- modified. This was useful for controlling the old selective
- display feature (*note Selective Display::).
- `subst-char-in-region' does not move point and returns `nil'.
- ---------- Buffer: foo ----------
- This is the contents of the buffer before.
- ---------- Buffer: foo ----------
- (subst-char-in-region 1 20 ?i ?X)
- => nil
- ---------- Buffer: foo ----------
- ThXs Xs the contents of the buffer before.
- ---------- Buffer: foo ----------
- -- Command: translate-region start end table
- This function applies a translation table to the characters in the
- buffer between positions START and END.
- The translation table TABLE is a string or a char-table; `(aref
- TABLE OCHAR)' gives the translated character corresponding to
- OCHAR. If TABLE is a string, any characters with codes larger
- than the length of TABLE are not altered by the translation.
- The return value of `translate-region' is the number of characters
- that were actually changed by the translation. This does not
- count characters that were mapped into themselves in the
- translation table.
- File: elisp, Node: Registers, Next: Base 64, Prev: Transposition, Up: Text
- 32.21 Registers
- ===============
- A register is a sort of variable used in Emacs editing that can hold a
- variety of different kinds of values. Each register is named by a
- single character. All ASCII characters and their meta variants (but
- with the exception of `C-g') can be used to name registers. Thus,
- there are 255 possible registers. A register is designated in Emacs
- Lisp by the character that is its name.
- -- Variable: register-alist
- This variable is an alist of elements of the form `(NAME .
- CONTENTS)'. Normally, there is one element for each Emacs
- register that has been used.
- The object NAME is a character (an integer) identifying the
- register.
- The CONTENTS of a register can have several possible types:
- a number
- A number stands for itself. If `insert-register' finds a number
- in the register, it converts the number to decimal.
- a marker
- A marker represents a buffer position to jump to.
- a string
- A string is text saved in the register.
- a rectangle
- A rectangle is represented by a list of strings.
- `(WINDOW-CONFIGURATION POSITION)'
- This represents a window configuration to restore in one frame,
- and a position to jump to in the current buffer.
- `(FRAME-CONFIGURATION POSITION)'
- This represents a frame configuration to restore, and a position
- to jump to in the current buffer.
- (file FILENAME)
- This represents a file to visit; jumping to this value visits file
- FILENAME.
- (file-query FILENAME POSITION)
- This represents a file to visit and a position in it; jumping to
- this value visits file FILENAME and goes to buffer position
- POSITION. Restoring this type of position asks the user for
- confirmation first.
- The functions in this section return unpredictable values unless
- otherwise stated.
- -- Function: get-register reg
- This function returns the contents of the register REG, or `nil'
- if it has no contents.
- -- Function: set-register reg value
- This function sets the contents of register REG to VALUE. A
- register can be set to any value, but the other register functions
- expect only certain data types. The return value is VALUE.
- -- Command: view-register reg
- This command displays what is contained in register REG.
- -- Command: insert-register reg &optional beforep
- This command inserts contents of register REG into the current
- buffer.
- Normally, this command puts point before the inserted text, and the
- mark after it. However, if the optional second argument BEFOREP
- is non-`nil', it puts the mark before and point after. You can
- pass a non-`nil' second argument BEFOREP to this function
- interactively by supplying any prefix argument.
- If the register contains a rectangle, then the rectangle is
- inserted with its upper left corner at point. This means that
- text is inserted in the current line and underneath it on
- successive lines.
- If the register contains something other than saved text (a
- string) or a rectangle (a list), currently useless things happen.
- This may be changed in the future.
- File: elisp, Node: Transposition, Next: Registers, Prev: Substitution, Up: Text
- 32.22 Transposition of Text
- ===========================
- This function can be used to transpose stretches of text:
- -- Function: transpose-regions start1 end1 start2 end2 &optional
- leave-markers
- This function exchanges two nonoverlapping portions of the buffer.
- Arguments START1 and END1 specify the bounds of one portion and
- arguments START2 and END2 specify the bounds of the other portion.
- Normally, `transpose-regions' relocates markers with the transposed
- text; a marker previously positioned within one of the two
- transposed portions moves along with that portion, thus remaining
- between the same two characters in their new position. However,
- if LEAVE-MARKERS is non-`nil', `transpose-regions' does not do
- this--it leaves all markers unrelocated.
- File: elisp, Node: Base 64, Next: Checksum/Hash, Prev: Registers, Up: Text
- 32.23 Base 64 Encoding
- ======================
- Base 64 code is used in email to encode a sequence of 8-bit bytes as a
- longer sequence of ASCII graphic characters. It is defined in Internet
- RFC(1)2045. This section describes the functions for converting to and
- from this code.
- -- Command: base64-encode-region beg end &optional no-line-break
- This function converts the region from BEG to END into base 64
- code. It returns the length of the encoded text. An error is
- signaled if a character in the region is multibyte, i.e. in a
- multibyte buffer the region must contain only characters from the
- charsets `ascii', `eight-bit-control' and `eight-bit-graphic'.
- Normally, this function inserts newline characters into the encoded
- text, to avoid overlong lines. However, if the optional argument
- NO-LINE-BREAK is non-`nil', these newlines are not added, so the
- output is just one long line.
- -- Function: base64-encode-string string &optional no-line-break
- This function converts the string STRING into base 64 code. It
- returns a string containing the encoded text. As for
- `base64-encode-region', an error is signaled if a character in the
- string is multibyte.
- Normally, this function inserts newline characters into the encoded
- text, to avoid overlong lines. However, if the optional argument
- NO-LINE-BREAK is non-`nil', these newlines are not added, so the
- result string is just one long line.
- -- Command: base64-decode-region beg end
- This function converts the region from BEG to END from base 64
- code into the corresponding decoded text. It returns the length of
- the decoded text.
- The decoding functions ignore newline characters in the encoded
- text.
- -- Function: base64-decode-string string
- This function converts the string STRING from base 64 code into
- the corresponding decoded text. It returns a unibyte string
- containing the decoded text.
- The decoding functions ignore newline characters in the encoded
- text.
- ---------- Footnotes ----------
- (1) An RFC, an acronym for "Request for Comments", is a numbered
- Internet informational document describing a standard. RFCs are
- usually written by technical experts acting on their own initiative,
- and are traditionally written in a pragmatic, experience-driven manner.
- File: elisp, Node: Checksum/Hash, Next: Parsing HTML/XML, Prev: Base 64, Up: Text
- 32.24 Checksum/Hash
- ===================
- Emacs has built-in support for computing "cryptographic hashes". A
- cryptographic hash, or "checksum", is a digital "fingerprint" of a
- piece of data (e.g. a block of text) which can be used to check that
- you have an unaltered copy of that data.
- Emacs supports several common cryptographic hash algorithms: MD5,
- SHA-1, SHA-2, SHA-224, SHA-256, SHA-384 and SHA-512. MD5 is the oldest
- of these algorithms, and is commonly used in "message digests" to check
- the integrity of messages transmitted over a network. MD5 is not
- "collision resistant" (i.e. it is possible to deliberately design
- different pieces of data which have the same MD5 hash), so you should
- not used it for anything security-related. A similar theoretical
- weakness also exists in SHA-1. Therefore, for security-related
- applications you should use the other hash types, such as SHA-2.
- -- Function: secure-hash algorithm object &optional start end binary
- This function returns a hash for OBJECT. The argument ALGORITHM
- is a symbol stating which hash to compute: one of `md5', `sha1',
- `sha224', `sha256', `sha384' or `sha512'. The argument OBJECT
- should be a buffer or a string.
- The optional arguments START and END are character positions
- specifying the portion of OBJECT to compute the message digest
- for. If they are `nil' or omitted, the hash is computed for the
- whole of OBJECT.
- If the argument BINARY is omitted or `nil', the function returns
- the "text form" of the hash, as an ordinary Lisp string. If
- BINARY is non-`nil', it returns the hash in "binary form", as a
- sequence of bytes stored in a unibyte string.
- This function does not compute the hash directly from the internal
- representation of OBJECT's text (*note Text Representations::).
- Instead, it encodes the text using a coding system (*note Coding
- Systems::), and computes the hash from that encoded text. If
- OBJECT is a buffer, the coding system used is the one which would
- be chosen by default for writing the text into a file. If OBJECT
- is a string, the user's preferred coding system is used (*note
- Recognize Coding: (emacs)Recognize Coding.).
- -- Function: md5 object &optional start end coding-system noerror
- This function returns an MD5 hash. It is semi-obsolete, since for
- most purposes it is equivalent to calling `secure-hash' with `md5'
- as the ALGORITHM argument. The OBJECT, START and END arguments
- have the same meanings as in `secure-hash'.
- If CODING-SYSTEM is non-`nil', it specifies a coding system to use
- to encode the text; if omitted or `nil', the default coding system
- is used, like in `secure-hash'.
- Normally, `md5' signals an error if the text can't be encoded
- using the specified or chosen coding system. However, if NOERROR
- is non-`nil', it silently uses `raw-text' coding instead.
- File: elisp, Node: Parsing HTML/XML, Next: Atomic Changes, Prev: Checksum/Hash, Up: Text
- 32.25 Parsing HTML and XML
- ==========================
- When Emacs is compiled with libxml2 support, the following functions
- are available to parse HTML or XML text into Lisp object trees.
- -- Function: libxml-parse-html-region start end &optional base-url
- This function parses the text between START and END as HTML, and
- returns a list representing the HTML "parse tree". It attempts to
- handle "real world" HTML by robustly coping with syntax mistakes.
- The optional argument BASE-URL, if non-`nil', should be a string
- specifying the base URL for relative URLs occurring in links.
- In the parse tree, each HTML node is represented by a list in which
- the first element is a symbol representing the node name, the
- second element is an alist of node attributes, and the remaining
- elements are the subnodes.
- The following example demonstrates this. Given this (malformed)
- HTML document:
- <html><head></head><body width=101><div class=thing>Foo<div>Yes
- A call to `libxml-parse-html-region' returns this:
- (html ()
- (head ())
- (body ((width . "101"))
- (div ((class . "thing"))
- "Foo"
- (div ()
- "Yes"))))
- -- Function: libxml-parse-xml-region start end &optional base-url
- This function is the same as `libxml-parse-html-region', except
- that it parses the text as XML rather than HTML (so it is stricter
- about syntax).
- File: elisp, Node: Atomic Changes, Next: Change Hooks, Prev: Parsing HTML/XML, Up: Text
- 32.26 Atomic Change Groups
- ==========================
- In database terminology, an "atomic" change is an indivisible
- change--it can succeed entirely or it can fail entirely, but it cannot
- partly succeed. A Lisp program can make a series of changes to one or
- several buffers as an "atomic change group", meaning that either the
- entire series of changes will be installed in their buffers or, in case
- of an error, none of them will be.
- To do this for one buffer, the one already current, simply write a
- call to `atomic-change-group' around the code that makes the changes,
- like this:
- (atomic-change-group
- (insert foo)
- (delete-region x y))
- If an error (or other nonlocal exit) occurs inside the body of
- `atomic-change-group', it unmakes all the changes in that buffer that
- were during the execution of the body. This kind of change group has
- no effect on any other buffers--any such changes remain.
- If you need something more sophisticated, such as to make changes in
- various buffers constitute one atomic group, you must directly call
- lower-level functions that `atomic-change-group' uses.
- -- Function: prepare-change-group &optional buffer
- This function sets up a change group for buffer BUFFER, which
- defaults to the current buffer. It returns a "handle" that
- represents the change group. You must use this handle to activate
- the change group and subsequently to finish it.
- To use the change group, you must "activate" it. You must do this
- before making any changes in the text of BUFFER.
- -- Function: activate-change-group handle
- This function activates the change group that HANDLE designates.
- After you activate the change group, any changes you make in that
- buffer become part of it. Once you have made all the desired changes
- in the buffer, you must "finish" the change group. There are two ways
- to do this: you can either accept (and finalize) all the changes, or
- cancel them all.
- -- Function: accept-change-group handle
- This function accepts all the changes in the change group
- specified by HANDLE, making them final.
- -- Function: cancel-change-group handle
- This function cancels and undoes all the changes in the change
- group specified by HANDLE.
- Your code should use `unwind-protect' to make sure the group is
- always finished. The call to `activate-change-group' should be inside
- the `unwind-protect', in case the user types `C-g' just after it runs.
- (This is one reason why `prepare-change-group' and
- `activate-change-group' are separate functions, because normally you
- would call `prepare-change-group' before the start of that
- `unwind-protect'.) Once you finish the group, don't use the handle
- again--in particular, don't try to finish the same group twice.
- To make a multibuffer change group, call `prepare-change-group' once
- for each buffer you want to cover, then use `nconc' to combine the
- returned values, like this:
- (nconc (prepare-change-group buffer-1)
- (prepare-change-group buffer-2))
- You can then activate the multibuffer change group with a single call
- to `activate-change-group', and finish it with a single call to
- `accept-change-group' or `cancel-change-group'.
- Nested use of several change groups for the same buffer works as you
- would expect. Non-nested use of change groups for the same buffer will
- get Emacs confused, so don't let it happen; the first change group you
- start for any given buffer should be the last one finished.
- File: elisp, Node: Change Hooks, Prev: Atomic Changes, Up: Text
- 32.27 Change Hooks
- ==================
- These hook variables let you arrange to take notice of all changes in
- all buffers (or in a particular buffer, if you make them buffer-local).
- See also *note Special Properties::, for how to detect changes to
- specific parts of the text.
- The functions you use in these hooks should save and restore the
- match data if they do anything that uses regular expressions;
- otherwise, they will interfere in bizarre ways with the editing
- operations that call them.
- -- Variable: before-change-functions
- This variable holds a list of functions to call before any buffer
- modification. Each function gets two arguments, the beginning and
- end of the region that is about to change, represented as
- integers. The buffer that is about to change is always the
- current buffer.
- -- Variable: after-change-functions
- This variable holds a list of functions to call after any buffer
- modification. Each function receives three arguments: the
- beginning and end of the region just changed, and the length of
- the text that existed before the change. All three arguments are
- integers. The buffer has been changed is always the current
- buffer.
- The length of the old text is the difference between the buffer
- positions before and after that text as it was before the change.
- As for the changed text, its length is simply the difference
- between the first two arguments.
- Output of messages into the `*Messages*' buffer does not call these
- functions.
- -- Macro: combine-after-change-calls body...
- The macro executes BODY normally, but arranges to call the
- after-change functions just once for a series of several
- changes--if that seems safe.
- If a program makes several text changes in the same area of the
- buffer, using the macro `combine-after-change-calls' around that
- part of the program can make it run considerably faster when
- after-change hooks are in use. When the after-change hooks are
- ultimately called, the arguments specify a portion of the buffer
- including all of the changes made within the
- `combine-after-change-calls' body.
- *Warning:* You must not alter the values of
- `after-change-functions' within the body of a
- `combine-after-change-calls' form.
- *Warning:* if the changes you combine occur in widely scattered
- parts of the buffer, this will still work, but it is not advisable,
- because it may lead to inefficient behavior for some change hook
- functions.
- -- Variable: first-change-hook
- This variable is a normal hook that is run whenever a buffer is
- changed that was previously in the unmodified state.
- -- Variable: inhibit-modification-hooks
- If this variable is non-`nil', all of the change hooks are
- disabled; none of them run. This affects all the hook variables
- described above in this section, as well as the hooks attached to
- certain special text properties (*note Special Properties::) and
- overlay properties (*note Overlay Properties::).
- Also, this variable is bound to non-`nil' while running those same
- hook variables, so that by default modifying the buffer from a
- modification hook does not cause other modification hooks to be
- run. If you do want modification hooks to be run in a particular
- piece of code that is itself run from a modification hook, then
- rebind locally `inhibit-modification-hooks' to `nil'.
- File: elisp, Node: Non-ASCII Characters, Next: Searching and Matching, Prev: Text, Up: Top
- 33 Non-ASCII Characters
- ***********************
- This chapter covers the special issues relating to characters and how
- they are stored in strings and buffers.
- * Menu:
- * Text Representations:: How Emacs represents text.
- * Converting Representations:: Converting unibyte to multibyte and vice versa.
- * Selecting a Representation:: Treating a byte sequence as unibyte or multi.
- * Character Codes:: How unibyte and multibyte relate to
- codes of individual characters.
- * Character Properties:: Character attributes that define their
- behavior and handling.
- * Character Sets:: The space of possible character codes
- is divided into various character sets.
- * Scanning Charsets:: Which character sets are used in a buffer?
- * Translation of Characters:: Translation tables are used for conversion.
- * Coding Systems:: Coding systems are conversions for saving files.
- * Input Methods:: Input methods allow users to enter various
- non-ASCII characters without special keyboards.
- * Locales:: Interacting with the POSIX locale.
- File: elisp, Node: Text Representations, Next: Converting Representations, Up: Non-ASCII Characters
- 33.1 Text Representations
- =========================
- Emacs buffers and strings support a large repertoire of characters from
- many different scripts, allowing users to type and display text in
- almost any known written language.
- To support this multitude of characters and scripts, Emacs closely
- follows the "Unicode Standard". The Unicode Standard assigns a unique
- number, called a "codepoint", to each and every character. The range
- of codepoints defined by Unicode, or the Unicode "codespace", is
- `0..#x10FFFF' (in hexadecimal notation), inclusive. Emacs extends this
- range with codepoints in the range `#x110000..#x3FFFFF', which it uses
- for representing characters that are not unified with Unicode and "raw
- 8-bit bytes" that cannot be interpreted as characters. Thus, a
- character codepoint in Emacs is a 22-bit integer number.
- To conserve memory, Emacs does not hold fixed-length 22-bit numbers
- that are codepoints of text characters within buffers and strings.
- Rather, Emacs uses a variable-length internal representation of
- characters, that stores each character as a sequence of 1 to 5 8-bit
- bytes, depending on the magnitude of its codepoint(1). For example,
- any ASCII character takes up only 1 byte, a Latin-1 character takes up
- 2 bytes, etc. We call this representation of text "multibyte".
- Outside Emacs, characters can be represented in many different
- encodings, such as ISO-8859-1, GB-2312, Big-5, etc. Emacs converts
- between these external encodings and its internal representation, as
- appropriate, when it reads text into a buffer or a string, or when it
- writes text to a disk file or passes it to some other process.
- Occasionally, Emacs needs to hold and manipulate encoded text or
- binary non-text data in its buffers or strings. For example, when
- Emacs visits a file, it first reads the file's text verbatim into a
- buffer, and only then converts it to the internal representation.
- Before the conversion, the buffer holds encoded text.
- Encoded text is not really text, as far as Emacs is concerned, but
- rather a sequence of raw 8-bit bytes. We call buffers and strings that
- hold encoded text "unibyte" buffers and strings, because Emacs treats
- them as a sequence of individual bytes. Usually, Emacs displays
- unibyte buffers and strings as octal codes such as `\237'. We
- recommend that you never use unibyte buffers and strings except for
- manipulating encoded text or binary non-text data.
- In a buffer, the buffer-local value of the variable
- `enable-multibyte-characters' specifies the representation used. The
- representation for a string is determined and recorded in the string
- when the string is constructed.
- -- Variable: enable-multibyte-characters
- This variable specifies the current buffer's text representation.
- If it is non-`nil', the buffer contains multibyte text; otherwise,
- it contains unibyte encoded text or binary non-text data.
- You cannot set this variable directly; instead, use the function
- `set-buffer-multibyte' to change a buffer's representation.
- -- Function: position-bytes position
- Buffer positions are measured in character units. This function
- returns the byte-position corresponding to buffer position
- POSITION in the current buffer. This is 1 at the start of the
- buffer, and counts upward in bytes. If POSITION is out of range,
- the value is `nil'.
- -- Function: byte-to-position byte-position
- Return the buffer position, in character units, corresponding to
- given BYTE-POSITION in the current buffer. If BYTE-POSITION is
- out of range, the value is `nil'. In a multibyte buffer, an
- arbitrary value of BYTE-POSITION can be not at character boundary,
- but inside a multibyte sequence representing a single character;
- in this case, this function returns the buffer position of the
- character whose multibyte sequence includes BYTE-POSITION. In
- other words, the value does not change for all byte positions that
- belong to the same character.
- -- Function: multibyte-string-p string
- Return `t' if STRING is a multibyte string, `nil' otherwise.
- -- Function: string-bytes string
- This function returns the number of bytes in STRING. If STRING is
- a multibyte string, this can be greater than `(length STRING)'.
- -- Function: unibyte-string &rest bytes
- This function concatenates all its argument BYTES and makes the
- result a unibyte string.
- ---------- Footnotes ----------
- (1) This internal representation is based on one of the encodings
- defined by the Unicode Standard, called "UTF-8", for representing any
- Unicode codepoint, but Emacs extends UTF-8 to represent the additional
- codepoints it uses for raw 8-bit bytes and characters not unified with
- Unicode.
- File: elisp, Node: Converting Representations, Next: Selecting a Representation, Prev: Text Representations, Up: Non-ASCII Characters
- 33.2 Converting Text Representations
- ====================================
- Emacs can convert unibyte text to multibyte; it can also convert
- multibyte text to unibyte, provided that the multibyte text contains
- only ASCII and 8-bit raw bytes. In general, these conversions happen
- when inserting text into a buffer, or when putting text from several
- strings together in one string. You can also explicitly convert a
- string's contents to either representation.
- Emacs chooses the representation for a string based on the text from
- which it is constructed. The general rule is to convert unibyte text
- to multibyte text when combining it with other multibyte text, because
- the multibyte representation is more general and can hold whatever
- characters the unibyte text has.
- When inserting text into a buffer, Emacs converts the text to the
- buffer's representation, as specified by `enable-multibyte-characters'
- in that buffer. In particular, when you insert multibyte text into a
- unibyte buffer, Emacs converts the text to unibyte, even though this
- conversion cannot in general preserve all the characters that might be
- in the multibyte text. The other natural alternative, to convert the
- buffer contents to multibyte, is not acceptable because the buffer's
- representation is a choice made by the user that cannot be overridden
- automatically.
- Converting unibyte text to multibyte text leaves ASCII characters
- unchanged, and converts bytes with codes 128 through 255 to the
- multibyte representation of raw eight-bit bytes.
- Converting multibyte text to unibyte converts all ASCII and
- eight-bit characters to their single-byte form, but loses information
- for non-ASCII characters by discarding all but the low 8 bits of each
- character's codepoint. Converting unibyte text to multibyte and back
- to unibyte reproduces the original unibyte text.
- The next two functions either return the argument STRING, or a newly
- created string with no text properties.
- -- Function: string-to-multibyte string
- This function returns a multibyte string containing the same
- sequence of characters as STRING. If STRING is a multibyte string,
- it is returned unchanged. The function assumes that STRING
- includes only ASCII characters and raw 8-bit bytes; the latter are
- converted to their multibyte representation corresponding to the
- codepoints `#x3FFF80' through `#x3FFFFF', inclusive (*note
- codepoints: Text Representations.).
- -- Function: string-to-unibyte string
- This function returns a unibyte string containing the same
- sequence of characters as STRING. It signals an error if STRING
- contains a non-ASCII character. If STRING is a unibyte string, it
- is returned unchanged. Use this function for STRING arguments
- that contain only ASCII and eight-bit characters.
- -- Function: byte-to-string byte
- This function returns a unibyte string containing a single byte of
- character data, CHARACTER. It signals an error if CHARACTER is
- not an integer between 0 and 255.
- -- Function: multibyte-char-to-unibyte char
- This converts the multibyte character CHAR to a unibyte character,
- and returns that character. If CHAR is neither ASCII nor
- eight-bit, the function returns -1.
- -- Function: unibyte-char-to-multibyte char
- This convert the unibyte character CHAR to a multibyte character,
- assuming CHAR is either ASCII or raw 8-bit byte.
- File: elisp, Node: Selecting a Representation, Next: Character Codes, Prev: Converting Representations, Up: Non-ASCII Characters
- 33.3 Selecting a Representation
- ===============================
- Sometimes it is useful to examine an existing buffer or string as
- multibyte when it was unibyte, or vice versa.
- -- Function: set-buffer-multibyte multibyte
- Set the representation type of the current buffer. If MULTIBYTE
- is non-`nil', the buffer becomes multibyte. If MULTIBYTE is
- `nil', the buffer becomes unibyte.
- This function leaves the buffer contents unchanged when viewed as a
- sequence of bytes. As a consequence, it can change the contents
- viewed as characters; for instance, a sequence of three bytes
- which is treated as one character in multibyte representation will
- count as three characters in unibyte representation. Eight-bit
- characters representing raw bytes are an exception. They are
- represented by one byte in a unibyte buffer, but when the buffer
- is set to multibyte, they are converted to two-byte sequences, and
- vice versa.
- This function sets `enable-multibyte-characters' to record which
- representation is in use. It also adjusts various data in the
- buffer (including overlays, text properties and markers) so that
- they cover the same text as they did before.
- You cannot use `set-buffer-multibyte' on an indirect buffer,
- because indirect buffers always inherit the representation of the
- base buffer.
- -- Function: string-as-unibyte string
- If STRING is already a unibyte string, this function returns
- STRING itself. Otherwise, it returns a new string with the same
- bytes as STRING, but treating each byte as a separate character
- (so that the value may have more characters than STRING); as an
- exception, each eight-bit character representing a raw byte is
- converted into a single byte. The newly-created string contains no
- text properties.
- -- Function: string-as-multibyte string
- If STRING is a multibyte string, this function returns STRING
- itself. Otherwise, it returns a new string with the same bytes as
- STRING, but treating each multibyte sequence as one character.
- This means that the value may have fewer characters than STRING
- has. If a byte sequence in STRING is invalid as a multibyte
- representation of a single character, each byte in the sequence is
- treated as a raw 8-bit byte. The newly-created string contains no
- text properties.
- File: elisp, Node: Character Codes, Next: Character Properties, Prev: Selecting a Representation, Up: Non-ASCII Characters
- 33.4 Character Codes
- ====================
- The unibyte and multibyte text representations use different character
- codes. The valid character codes for unibyte representation range from
- 0 to `#xFF' (255)--the values that can fit in one byte. The valid
- character codes for multibyte representation range from 0 to
- `#x3FFFFF'. In this code space, values 0 through `#x7F' (127) are for
- ASCII characters, and values `#x80' (128) through `#x3FFF7F' (4194175)
- are for non-ASCII characters.
- Emacs character codes are a superset of the Unicode standard.
- Values 0 through `#x10FFFF' (1114111) correspond to Unicode characters
- of the same codepoint; values `#x110000' (1114112) through `#x3FFF7F'
- (4194175) represent characters that are not unified with Unicode; and
- values `#x3FFF80' (4194176) through `#x3FFFFF' (4194303) represent
- eight-bit raw bytes.
- -- Function: characterp charcode
- This returns `t' if CHARCODE is a valid character, and `nil'
- otherwise.
- (characterp 65)
- => t
- (characterp 4194303)
- => t
- (characterp 4194304)
- => nil
- -- Function: max-char
- This function returns the largest value that a valid character
- codepoint can have.
- (characterp (max-char))
- => t
- (characterp (1+ (max-char)))
- => nil
- -- Function: get-byte &optional pos string
- This function returns the byte at character position POS in the
- current buffer. If the current buffer is unibyte, this is
- literally the byte at that position. If the buffer is multibyte,
- byte values of ASCII characters are the same as character
- codepoints, whereas eight-bit raw bytes are converted to their
- 8-bit codes. The function signals an error if the character at
- POS is non-ASCII.
- The optional argument STRING means to get a byte value from that
- string instead of the current buffer.
- Local Variables:
- coding: iso-8859-1
- End:
|