gnus.texi 734 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232
  1. \input texinfo @c -*-texinfo-*- -*- coding: iso-latin-1 -*-
  2. @setfilename ../info/gnus
  3. @settitle Gnus Manual
  4. @synindex fn cp
  5. @synindex vr cp
  6. @synindex pg cp
  7. @dircategory Emacs
  8. @direntry
  9. * Gnus: (gnus). The newsreader Gnus.
  10. @end direntry
  11. @iftex
  12. @finalout
  13. @end iftex
  14. @setchapternewpage odd
  15. @iftex
  16. @iflatex
  17. \documentclass[twoside,a4paper,openright,11pt]{book}
  18. \usepackage[latin1]{inputenc}
  19. \usepackage{pagestyle}
  20. \usepackage{epsfig}
  21. \usepackage{bembo}
  22. \usepackage{pixidx}
  23. \makeindex
  24. \begin{document}
  25. \newcommand{\gnuschaptername}{}
  26. \newcommand{\gnussectionname}{}
  27. \newcommand{\gnusbackslash}{/}
  28. \newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
  29. \newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
  30. \newcommand{\gnuskindex}[1]{\index{#1}}
  31. \newcommand{\gnusindex}[1]{\index{#1}}
  32. \newcommand{\gnustt}[1]{{\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}}
  33. \newcommand{\gnuscode}[1]{\gnustt{#1}}
  34. \newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}''}
  35. \newcommand{\gnuslisp}[1]{\gnustt{#1}}
  36. \newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
  37. \newcommand{\gnusfile}[1]{`\gnustt{#1}'}
  38. \newcommand{\gnusdfn}[1]{\textit{#1}}
  39. \newcommand{\gnusi}[1]{\textit{#1}}
  40. \newcommand{\gnusstrong}[1]{\textbf{#1}}
  41. \newcommand{\gnusemph}[1]{\textit{#1}}
  42. \newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}}
  43. \newcommand{\gnussc}[1]{\textsc{#1}}
  44. \newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
  45. \newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
  46. \newcommand{\gnusresult}[1]{\gnustt{=> #1}}
  47. \newcommand{\gnusbullet}{{${\bullet}$}}
  48. \newcommand{\gnusdollar}{\$}
  49. \newcommand{\gnusampersand}{\&}
  50. \newcommand{\gnuspercent}{\%}
  51. \newcommand{\gnushash}{\#}
  52. \newcommand{\gnushat}{\symbol{"5E}}
  53. \newcommand{\gnusunderline}{\symbol{"5F}}
  54. \newcommand{\gnusnot}{$\neg$}
  55. \newcommand{\gnustilde}{\symbol{"7E}}
  56. \newcommand{\gnusless}{{$<$}}
  57. \newcommand{\gnusgreater}{{$>$}}
  58. \newcommand{\gnusbraceleft}{{$>$}}
  59. \newcommand{\gnusbraceright}{{$>$}}
  60. \newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head.eps,height=1cm}}}
  61. \newcommand{\gnusinteresting}{
  62. \marginpar[\mbox{}\hfill\gnushead]{\gnushead}
  63. }
  64. \newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
  65. \newcommand{\gnuspagechapter}[1]{
  66. {\mbox{}}
  67. }
  68. \newdimen{\gnusdimen}
  69. \gnusdimen 0pt
  70. \newcommand{\gnuschapter}[2]{
  71. \gnuscleardoublepage
  72. \ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi
  73. \chapter{#2}
  74. \renewcommand{\gnussectionname}{}
  75. \renewcommand{\gnuschaptername}{#2}
  76. \thispagestyle{empty}
  77. \hspace*{-2cm}
  78. \begin{picture}(500,500)(0,0)
  79. \put(480,350){\makebox(0,0)[tr]{#1}}
  80. \put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}
  81. \end{picture}
  82. \clearpage
  83. }
  84. \newcommand{\gnusfigure}[3]{
  85. \begin{figure}
  86. \mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2)
  87. #3
  88. \end{picture}
  89. \caption{#1}
  90. \end{figure}
  91. }
  92. \newcommand{\gnusicon}[1]{
  93. \marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=tmp/#1-up.ps,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=tmp/#1-up.ps,height=1cm}}}
  94. }
  95. \newcommand{\gnuspicon}[1]{
  96. \margindex{\epsfig{figure=#1,width=2cm}}
  97. }
  98. \newcommand{\gnusxface}[2]{
  99. \margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}}
  100. }
  101. \newcommand{\gnussmiley}[2]{
  102. \margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}}
  103. }
  104. \newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}
  105. \newcommand{\gnussection}[1]{
  106. \renewcommand{\gnussectionname}{#1}
  107. \section{#1}
  108. }
  109. \newenvironment{codelist}%
  110. {\begin{list}{}{
  111. }
  112. }{\end{list}}
  113. \newenvironment{kbdlist}%
  114. {\begin{list}{}{
  115. \labelwidth=0cm
  116. }
  117. }{\end{list}}
  118. \newenvironment{dfnlist}%
  119. {\begin{list}{}{
  120. }
  121. }{\end{list}}
  122. \newenvironment{stronglist}%
  123. {\begin{list}{}{
  124. }
  125. }{\end{list}}
  126. \newenvironment{samplist}%
  127. {\begin{list}{}{
  128. }
  129. }{\end{list}}
  130. \newenvironment{varlist}%
  131. {\begin{list}{}{
  132. }
  133. }{\end{list}}
  134. \newenvironment{emphlist}%
  135. {\begin{list}{}{
  136. }
  137. }{\end{list}}
  138. \newlength\gnusheadtextwidth
  139. \setlength{\gnusheadtextwidth}{\headtextwidth}
  140. \addtolength{\gnusheadtextwidth}{1cm}
  141. \newpagestyle{gnuspreamble}%
  142. {
  143. {
  144. \ifodd\count0
  145. {
  146. \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}
  147. }
  148. \else
  149. {
  150. \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}
  151. }
  152. }
  153. \fi
  154. }
  155. }
  156. {
  157. \ifodd\count0
  158. \mbox{} \hfill
  159. \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
  160. \else
  161. \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
  162. \hfill \mbox{}
  163. \fi
  164. }
  165. \newpagestyle{gnusindex}%
  166. {
  167. {
  168. \ifodd\count0
  169. {
  170. \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}
  171. }
  172. \else
  173. {
  174. \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
  175. }
  176. \fi
  177. }
  178. }
  179. {
  180. \ifodd\count0
  181. \mbox{} \hfill
  182. \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
  183. \else
  184. \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
  185. \hfill \mbox{}
  186. \fi
  187. }
  188. \newpagestyle{gnus}%
  189. {
  190. {
  191. \ifodd\count0
  192. {
  193. \makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}}
  194. }
  195. \else
  196. {
  197. \makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}
  198. }
  199. \fi
  200. }
  201. }
  202. {
  203. \ifodd\count0
  204. \mbox{} \hfill
  205. \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
  206. \else
  207. \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
  208. \hfill \mbox{}
  209. \fi
  210. }
  211. \pagenumbering{roman}
  212. \pagestyle{gnuspreamble}
  213. @end iflatex
  214. @end iftex
  215. @iftex
  216. @iflatex
  217. \begin{titlepage}
  218. {
  219. %\addtolength{\oddsidemargin}{-5cm}
  220. %\addtolength{\evensidemargin}{-5cm}
  221. \parindent=0cm
  222. \addtolength{\textheight}{2cm}
  223. \gnustitle{\gnustitlename}\\
  224. \rule{15cm}{1mm}\\
  225. \vfill
  226. \hspace*{0cm}\epsfig{figure=ps/gnus-big-logo.eps,height=15cm}
  227. \vfill
  228. \rule{15cm}{1mm}\\
  229. \gnusauthor{by Lars Magne Ingebrigtsen}
  230. \newpage
  231. }
  232. \mbox{}
  233. \vfill
  234. \thispagestyle{empty}
  235. Copyright \copyright{} 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.
  236. Permission is granted to copy, distribute and/or modify this document
  237. under the terms of the GNU Free Documentation License, Version 1.1 or
  238. any later version published by the Free Software Foundation; with no
  239. Invariant Sections, with the Front-Cover texts being ``A GNU
  240. Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
  241. license is included in the section entitled ``GNU Free Documentation
  242. License'' in the Emacs manual.
  243. (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
  244. this GNU Manual, like GNU software. Copies published by the Free
  245. Software Foundation raise funds for GNU development.''
  246. This document is part of a collection distributed under the GNU Free
  247. Documentation License. If you want to distribute this document
  248. separately from the collection, you can do so by adding a copy of the
  249. license to the document, as described in section 6 of the license.
  250. \newpage
  251. \end{titlepage}
  252. @end iflatex
  253. @end iftex
  254. @ifnottex
  255. This file documents Gnus, the GNU Emacs newsreader.
  256. Copyright (C) 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.
  257. Permission is granted to copy, distribute and/or modify this document
  258. under the terms of the GNU Free Documentation License, Version 1.1 or
  259. any later version published by the Free Software Foundation; with the
  260. Invariant Sections being none, with the Front-Cover texts being ``A GNU
  261. Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
  262. license is included in the section entitled ``GNU Free Documentation
  263. License'' in the Emacs manual.
  264. (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
  265. this GNU Manual, like GNU software. Copies published by the Free
  266. Software Foundation raise funds for GNU development.''
  267. This document is part of a collection distributed under the GNU Free
  268. Documentation License. If you want to distribute this document
  269. separately from the collection, you can do so by adding a copy of the
  270. license to the document, as described in section 6 of the license.
  271. @end ifnottex
  272. @tex
  273. @titlepage
  274. @title Gnus Manual
  275. @author by Lars Magne Ingebrigtsen
  276. @page
  277. @vskip 0pt plus 1filll
  278. Copyright @copyright{} 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.
  279. Permission is granted to copy, distribute and/or modify this document
  280. under the terms of the GNU Free Documentation License, Version 1.1 or
  281. any later version published by the Free Software Foundation; with no
  282. Invariant Sections, with the Front-Cover texts being ``A GNU
  283. Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
  284. license is included in the section entitled ``GNU Free Documentation
  285. License'' in the Emacs manual.
  286. (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
  287. this GNU Manual, like GNU software. Copies published by the Free
  288. Software Foundation raise funds for GNU development.''
  289. This document is part of a collection distributed under the GNU Free
  290. Documentation License. If you want to distribute this document
  291. separately from the collection, you can do so by adding a copy of the
  292. license to the document, as described in section 6 of the license.
  293. @end titlepage
  294. @page
  295. @end tex
  296. @node Top
  297. @top The Gnus Newsreader
  298. @ifinfo
  299. You can read news (and mail) from within Emacs by using Gnus. The news
  300. can be gotten by any nefarious means you can think of---@sc{nntp}, local
  301. spool or your mbox file. All at the same time, if you want to push your
  302. luck.
  303. This manual corresponds to Gnus 5.9.0.
  304. @end ifinfo
  305. @iftex
  306. @iflatex
  307. \tableofcontents
  308. \gnuscleardoublepage
  309. @end iflatex
  310. Gnus is the advanced, self-documenting, customizable, extensible
  311. unreal-time newsreader for GNU Emacs.
  312. Oops. That sounds oddly familiar, so let's start over again to avoid
  313. being accused of plagiarism:
  314. Gnus is a message-reading laboratory. It will let you look at just
  315. about anything as if it were a newsgroup. You can read mail with it,
  316. you can browse directories with it, you can @code{ftp} with it---you
  317. can even read news with it!
  318. Gnus tries to empower people who read news the same way Emacs empowers
  319. people who edit text. Gnus sets no limits to what the user should be
  320. allowed to do. Users are encouraged to extend Gnus to make it behave
  321. like they want it to behave. A program should not control people;
  322. people should be empowered to do what they want by using (or abusing)
  323. the program.
  324. @end iftex
  325. @menu
  326. * Starting Up:: Finding news can be a pain.
  327. * The Group Buffer:: Selecting, subscribing and killing groups.
  328. * The Summary Buffer:: Reading, saving and posting articles.
  329. * The Article Buffer:: Displaying and handling articles.
  330. * Composing Messages:: Information on sending mail and news.
  331. * Select Methods:: Gnus reads all messages from various select methods.
  332. * Scoring:: Assigning values to articles.
  333. * Various:: General purpose settings.
  334. * The End:: Farewell and goodbye.
  335. * Appendices:: Terminology, Emacs intro, FAQ, History, Internals.
  336. * Index:: Variable, function and concept index.
  337. * Key Index:: Key Index.
  338. @detailmenu
  339. --- The Detailed Node Listing ---
  340. Starting Gnus
  341. * Finding the News:: Choosing a method for getting news.
  342. * The First Time:: What does Gnus do the first time you start it?
  343. * The Server is Down:: How can I read my mail then?
  344. * Slave Gnusae:: You can have more than one Gnus active at a time.
  345. * Fetching a Group:: Starting Gnus just to read a group.
  346. * New Groups:: What is Gnus supposed to do with new groups?
  347. * Startup Files:: Those pesky startup files---@file{.newsrc}.
  348. * Auto Save:: Recovering from a crash.
  349. * The Active File:: Reading the active file over a slow line Takes Time.
  350. * Changing Servers:: You may want to move from one server to another.
  351. * Startup Variables:: Other variables you might change.
  352. New Groups
  353. * Checking New Groups:: Determining what groups are new.
  354. * Subscription Methods:: What Gnus should do with new groups.
  355. * Filtering New Groups:: Making Gnus ignore certain new groups.
  356. The Group Buffer
  357. * Group Buffer Format:: Information listed and how you can change it.
  358. * Group Maneuvering:: Commands for moving in the group buffer.
  359. * Selecting a Group:: Actually reading news.
  360. * Group Data:: Changing the info for a group.
  361. * Subscription Commands:: Unsubscribing, killing, subscribing.
  362. * Group Levels:: Levels? What are those, then?
  363. * Group Score:: A mechanism for finding out what groups you like.
  364. * Marking Groups:: You can mark groups for later processing.
  365. * Foreign Groups:: Creating and editing groups.
  366. * Group Parameters:: Each group may have different parameters set.
  367. * Listing Groups:: Gnus can list various subsets of the groups.
  368. * Sorting Groups:: Re-arrange the group order.
  369. * Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
  370. * Browse Foreign Server:: You can browse a server. See what it has to offer.
  371. * Exiting Gnus:: Stop reading news and get some work done.
  372. * Group Topics:: A folding group mode divided into topics.
  373. * Misc Group Stuff:: Other stuff that you can to do.
  374. Group Buffer Format
  375. * Group Line Specification:: Deciding how the group buffer is to look.
  376. * Group Modeline Specification:: The group buffer modeline.
  377. * Group Highlighting:: Having nice colors in the group buffer.
  378. Group Topics
  379. * Topic Variables:: How to customize the topics the Lisp Way.
  380. * Topic Commands:: Interactive E-Z commands.
  381. * Topic Sorting:: Sorting each topic individually.
  382. * Topic Topology:: A map of the world.
  383. * Topic Parameters:: Parameters that apply to all groups in a topic.
  384. Misc Group Stuff
  385. * Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
  386. * Group Information:: Information and help on groups and Gnus.
  387. * Group Timestamp:: Making Gnus keep track of when you last read a group.
  388. * File Commands:: Reading and writing the Gnus files.
  389. The Summary Buffer
  390. * Summary Buffer Format:: Deciding how the summary buffer is to look.
  391. * Summary Maneuvering:: Moving around the summary buffer.
  392. * Choosing Articles:: Reading articles.
  393. * Paging the Article:: Scrolling the current article.
  394. * Reply Followup and Post:: Posting articles.
  395. * Marking Articles:: Marking articles as read, expirable, etc.
  396. * Limiting:: You can limit the summary buffer.
  397. * Threading:: How threads are made.
  398. * Sorting:: How articles and threads are sorted.
  399. * Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
  400. * Article Caching:: You may store articles in a cache.
  401. * Persistent Articles:: Making articles expiry-resistant.
  402. * Article Backlog:: Having already read articles hang around.
  403. * Saving Articles:: Ways of customizing article saving.
  404. * Decoding Articles:: Gnus can treat series of (uu)encoded articles.
  405. * Article Treatment:: The article buffer can be mangled at will.
  406. * MIME Commands:: Doing MIMEy things with the articles.
  407. * Charsets:: Character set issues.
  408. * Article Commands:: Doing various things with the article buffer.
  409. * Summary Sorting:: Sorting the summary buffer in various ways.
  410. * Finding the Parent:: No child support? Get the parent.
  411. * Alternative Approaches:: Reading using non-default summaries.
  412. * Tree Display:: A more visual display of threads.
  413. * Mail Group Commands:: Some commands can only be used in mail groups.
  414. * Various Summary Stuff:: What didn't fit anywhere else.
  415. * Exiting the Summary Buffer:: Returning to the Group buffer.
  416. * Crosspost Handling:: How crossposted articles are dealt with.
  417. * Duplicate Suppression:: An alternative when crosspost handling fails.
  418. Summary Buffer Format
  419. * Summary Buffer Lines:: You can specify how summary lines should look.
  420. * To From Newsgroups:: How to not display your own name.
  421. * Summary Buffer Mode Line:: You can say how the mode line should look.
  422. * Summary Highlighting:: Making the summary buffer all pretty and nice.
  423. Choosing Articles
  424. * Choosing Commands:: Commands for choosing articles.
  425. * Choosing Variables:: Variables that influence these commands.
  426. Reply, Followup and Post
  427. * Summary Mail Commands:: Sending mail.
  428. * Summary Post Commands:: Sending news.
  429. * Summary Message Commands:: Other Message-related commands.
  430. * Canceling and Superseding:: ``Whoops, I shouldn't have called him that.''
  431. Marking Articles
  432. * Unread Articles:: Marks for unread articles.
  433. * Read Articles:: Marks for read articles.
  434. * Other Marks:: Marks that do not affect readedness.
  435. * Setting Marks:: How to set and remove marks.
  436. * Generic Marking Commands:: How to customize the marking.
  437. * Setting Process Marks:: How to mark articles for later processing.
  438. Threading
  439. * Customizing Threading:: Variables you can change to affect the threading.
  440. * Thread Commands:: Thread based commands in the summary buffer.
  441. Customizing Threading
  442. * Loose Threads:: How Gnus gathers loose threads into bigger threads.
  443. * Filling In Threads:: Making the threads displayed look fuller.
  444. * More Threading:: Even more variables for fiddling with threads.
  445. * Low-Level Threading:: You thought it was over... but you were wrong!
  446. Decoding Articles
  447. * Uuencoded Articles:: Uudecode articles.
  448. * Shell Archives:: Unshar articles.
  449. * PostScript Files:: Split PostScript.
  450. * Other Files:: Plain save and binhex.
  451. * Decoding Variables:: Variables for a happy decoding.
  452. * Viewing Files:: You want to look at the result of the decoding?
  453. Decoding Variables
  454. * Rule Variables:: Variables that say how a file is to be viewed.
  455. * Other Decode Variables:: Other decode variables.
  456. * Uuencoding and Posting:: Variables for customizing uuencoding.
  457. Article Treatment
  458. * Article Highlighting:: You want to make the article look like fruit salad.
  459. * Article Fontisizing:: Making emphasized text look nice.
  460. * Article Hiding:: You also want to make certain info go away.
  461. * Article Washing:: Lots of way-neat functions to make life better.
  462. * Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
  463. * Article Date:: Grumble, UT!
  464. * Article Signature:: What is a signature?
  465. * Article Miscellania:: Various other stuff.
  466. Alternative Approaches
  467. * Pick and Read:: First mark articles and then read them.
  468. * Binary Groups:: Auto-decode all articles.
  469. Various Summary Stuff
  470. * Summary Group Information:: Information oriented commands.
  471. * Searching for Articles:: Multiple article commands.
  472. * Summary Generation Commands:: (Re)generating the summary buffer.
  473. * Really Various Summary Commands:: Those pesky non-conformant commands.
  474. The Article Buffer
  475. * Hiding Headers:: Deciding what headers should be displayed.
  476. * Using MIME:: Pushing articles through @sc{mime} before reading them.
  477. * Customizing Articles:: Tailoring the look of the articles.
  478. * Article Keymap:: Keystrokes available in the article buffer.
  479. * Misc Article:: Other stuff.
  480. Composing Messages
  481. * Mail:: Mailing and replying.
  482. * Posting Server:: What server should you post via?
  483. * Mail and Post:: Mailing and posting at the same time.
  484. * Archived Messages:: Where Gnus stores the messages you've sent.
  485. * Posting Styles:: An easier way to specify who you are.
  486. * Drafts:: Postponing messages and rejected messages.
  487. * Rejected Articles:: What happens if the server doesn't like your article?
  488. Select Methods
  489. * The Server Buffer:: Making and editing virtual servers.
  490. * Getting News:: Reading USENET news with Gnus.
  491. * Getting Mail:: Reading your personal mail with Gnus.
  492. * Browsing the Web:: Getting messages from a plethora of Web sources.
  493. * Other Sources:: Reading directories, files, SOUP packets.
  494. * Combined Groups:: Combining groups into one group.
  495. * Gnus Unplugged:: Reading news and mail offline.
  496. The Server Buffer
  497. * Server Buffer Format:: You can customize the look of this buffer.
  498. * Server Commands:: Commands to manipulate servers.
  499. * Example Methods:: Examples server specifications.
  500. * Creating a Virtual Server:: An example session.
  501. * Server Variables:: Which variables to set.
  502. * Servers and Methods:: You can use server names as select methods.
  503. * Unavailable Servers:: Some servers you try to contact may be down.
  504. Getting News
  505. * NNTP:: Reading news from an @sc{nntp} server.
  506. * News Spool:: Reading news from the local spool.
  507. Getting Mail
  508. * Mail in a Newsreader:: Important introductory notes.
  509. * Getting Started Reading Mail:: A simple cookbook example.
  510. * Splitting Mail:: How to create mail groups.
  511. * Mail Sources:: How to tell Gnus where to get mail from.
  512. * Mail Back End Variables:: Variables for customizing mail handling.
  513. * Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
  514. * Group Mail Splitting:: Use group customize to drive mail splitting.
  515. * Incorporating Old Mail:: What about the old mail you have?
  516. * Expiring Mail:: Getting rid of unwanted mail.
  517. * Washing Mail:: Removing cruft from the mail you get.
  518. * Duplicates:: Dealing with duplicated mail.
  519. * Not Reading Mail:: Using mail back ends for reading other files.
  520. * Choosing a Mail Back End:: Gnus can read a variety of mail formats.
  521. Mail Sources
  522. * Mail Source Specifiers:: How to specify what a mail source is.
  523. * Mail Source Customization:: Some variables that influence things.
  524. * Fetching Mail:: Using the mail source specifiers.
  525. Choosing a Mail Back End
  526. * Unix Mail Box:: Using the (quite) standard Un*x mbox.
  527. * Rmail Babyl:: Emacs programs use the rmail babyl format.
  528. * Mail Spool:: Store your mail in a private spool?
  529. * MH Spool:: An mhspool-like back end.
  530. * Mail Folders:: Having one file for each group.
  531. * Comparing Mail Back Ends:: An in-depth looks at pros and cons.
  532. Browsing the Web
  533. * Web Searches:: Creating groups from articles that match a string.
  534. * Slashdot:: Reading the Slashdot comments.
  535. * Ultimate:: The Ultimate Bulletin Board systems.
  536. * Web Archive:: Reading mailing list archived on web.
  537. Other Sources
  538. * Directory Groups:: You can read a directory as if it was a newsgroup.
  539. * Anything Groups:: Dired? Who needs dired?
  540. * Document Groups:: Single files can be the basis of a group.
  541. * SOUP:: Reading @sc{soup} packets ``offline''.
  542. * Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
  543. * IMAP:: Using Gnus as a @sc{imap} client.
  544. Document Groups
  545. * Document Server Internals:: How to add your own document types.
  546. SOUP
  547. * SOUP Commands:: Commands for creating and sending @sc{soup} packets
  548. * SOUP Groups:: A back end for reading @sc{soup} packets.
  549. * SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.
  550. @sc{imap}
  551. * Splitting in IMAP:: Splitting mail with nnimap.
  552. * Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.
  553. * Expunging mailboxes:: Equivalent of a "compress mailbox" button.
  554. Combined Groups
  555. * Virtual Groups:: Combining articles from many groups.
  556. * Kibozed Groups:: Looking through parts of the newsfeed for articles.
  557. Gnus Unplugged
  558. * Agent Basics:: How it all is supposed to work.
  559. * Agent Categories:: How to tell the Gnus Agent what to download.
  560. * Agent Commands:: New commands for all the buffers.
  561. * Agent Expiry:: How to make old articles go away.
  562. * Agent and IMAP:: How to use the Agent with IMAP.
  563. * Outgoing Messages:: What happens when you post/mail something?
  564. * Agent Variables:: Customizing is fun.
  565. * Example Setup:: An example @file{.gnus.el} file for offline people.
  566. * Batching Agents:: How to fetch news from a @code{cron} job.
  567. * Agent Caveats:: What you think it'll do and what it does.
  568. Agent Categories
  569. * Category Syntax:: What a category looks like.
  570. * The Category Buffer:: A buffer for maintaining categories.
  571. * Category Variables:: Customize'r'Us.
  572. Agent Commands
  573. * Group Agent Commands::
  574. * Summary Agent Commands::
  575. * Server Agent Commands::
  576. Scoring
  577. * Summary Score Commands:: Adding score entries for the current group.
  578. * Group Score Commands:: General score commands.
  579. * Score Variables:: Customize your scoring. (My, what terminology).
  580. * Score File Format:: What a score file may contain.
  581. * Score File Editing:: You can edit score files by hand as well.
  582. * Adaptive Scoring:: Big Sister Gnus knows what you read.
  583. * Home Score File:: How to say where new score entries are to go.
  584. * Followups To Yourself:: Having Gnus notice when people answer you.
  585. * Scoring Tips:: How to score effectively.
  586. * Reverse Scoring:: That problem child of old is not problem.
  587. * Global Score Files:: Earth-spanning, ear-splitting score files.
  588. * Kill Files:: They are still here, but they can be ignored.
  589. * Converting Kill Files:: Translating kill files to score files.
  590. * GroupLens:: Getting predictions on what you like to read.
  591. * Advanced Scoring:: Using logical expressions to build score rules.
  592. * Score Decays:: It can be useful to let scores wither away.
  593. GroupLens
  594. * Using GroupLens:: How to make Gnus use GroupLens.
  595. * Rating Articles:: Letting GroupLens know how you rate articles.
  596. * Displaying Predictions:: Displaying predictions given by GroupLens.
  597. * GroupLens Variables:: Customizing GroupLens.
  598. Advanced Scoring
  599. * Advanced Scoring Syntax:: A definition.
  600. * Advanced Scoring Examples:: What they look like.
  601. * Advanced Scoring Tips:: Getting the most out of it.
  602. Various
  603. * Process/Prefix:: A convention used by many treatment commands.
  604. * Interactive:: Making Gnus ask you many questions.
  605. * Symbolic Prefixes:: How to supply some Gnus functions with options.
  606. * Formatting Variables:: You can specify what buffers should look like.
  607. * Windows Configuration:: Configuring the Gnus buffer windows.
  608. * Faces and Fonts:: How to change how faces look.
  609. * Compilation:: How to speed Gnus up.
  610. * Mode Lines:: Displaying information in the mode lines.
  611. * Highlighting and Menus:: Making buffers look all nice and cozy.
  612. * Buttons:: Get tendinitis in ten easy steps!
  613. * Daemons:: Gnus can do things behind your back.
  614. * NoCeM:: How to avoid spam and other fatty foods.
  615. * Undo:: Some actions can be undone.
  616. * Moderation:: What to do if you're a moderator.
  617. * XEmacs Enhancements:: There are more pictures and stuff under XEmacs.
  618. * Fuzzy Matching:: What's the big fuzz?
  619. * Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email.
  620. * Various Various:: Things that are really various.
  621. Formatting Variables
  622. * Formatting Basics:: A formatting variable is basically a format string.
  623. * Mode Line Formatting:: Some rules about mode line formatting variables.
  624. * Advanced Formatting:: Modifying output in various ways.
  625. * User-Defined Specs:: Having Gnus call your own functions.
  626. * Formatting Fonts:: Making the formatting look colorful and nice.
  627. XEmacs Enhancements
  628. * Picons:: How to display pictures of what your reading.
  629. * Smileys:: Show all those happy faces the way they were meant to be shown.
  630. * Toolbar:: Click'n'drool.
  631. * XVarious:: Other XEmacsy Gnusey variables.
  632. Picons
  633. * Picon Basics:: What are picons and How do I get them.
  634. * Picon Requirements:: Don't go further if you aren't using XEmacs.
  635. * Easy Picons:: Displaying Picons---the easy way.
  636. * Hard Picons:: The way you should do it. You'll learn something.
  637. * Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with.
  638. Appendices
  639. * History:: How Gnus got where it is today.
  640. * On Writing Manuals:: Why this is not a beginner's guide.
  641. * Terminology:: We use really difficult, like, words here.
  642. * Customization:: Tailoring Gnus to your needs.
  643. * Troubleshooting:: What you might try if things do not work.
  644. * Gnus Reference Guide:: Rilly, rilly technical stuff.
  645. * Emacs for Heathens:: A short introduction to Emacsian terms.
  646. * Frequently Asked Questions:: A question-and-answer session.
  647. History
  648. * Gnus Versions:: What Gnus versions have been released.
  649. * Other Gnus Versions:: Other Gnus versions that also have been released.
  650. * Why?:: What's the point of Gnus?
  651. * Compatibility:: Just how compatible is Gnus with @sc{gnus}?
  652. * Conformity:: Gnus tries to conform to all standards.
  653. * Emacsen:: Gnus can be run on a few modern Emacsen.
  654. * Gnus Development:: How Gnus is developed.
  655. * Contributors:: Oodles of people.
  656. * New Features:: Pointers to some of the new stuff in Gnus.
  657. New Features
  658. * ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.
  659. * September Gnus:: The Thing Formally Known As Gnus 5.2/5.3.
  660. * Red Gnus:: Third time best---Gnus 5.4/5.5.
  661. * Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.
  662. * Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.
  663. Customization
  664. * Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
  665. * Slow Terminal Connection:: You run a remote Emacs.
  666. * Little Disk Space:: You feel that having large setup files is icky.
  667. * Slow Machine:: You feel like buying a faster machine.
  668. Gnus Reference Guide
  669. * Gnus Utility Functions:: Common functions and variable to use.
  670. * Back End Interface:: How Gnus communicates with the servers.
  671. * Score File Syntax:: A BNF definition of the score file standard.
  672. * Headers:: How Gnus stores headers internally.
  673. * Ranges:: A handy format for storing mucho numbers.
  674. * Group Info:: The group info format.
  675. * Extended Interactive:: Symbolic prefixes and stuff.
  676. * Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.
  677. * Various File Formats:: Formats of files that Gnus use.
  678. Back End Interface
  679. * Required Back End Functions:: Functions that must be implemented.
  680. * Optional Back End Functions:: Functions that need not be implemented.
  681. * Error Messaging:: How to get messages and report errors.
  682. * Writing New Back Ends:: Extending old back ends.
  683. * Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end.
  684. * Mail-like Back Ends:: Some tips on mail back ends.
  685. Various File Formats
  686. * Active File Format:: Information on articles and groups available.
  687. * Newsgroups File Format:: Group descriptions.
  688. Emacs for Heathens
  689. * Keystrokes:: Entering text and executing commands.
  690. * Emacs Lisp:: The built-in Emacs programming language.
  691. @end detailmenu
  692. @end menu
  693. @node Starting Up
  694. @chapter Starting Gnus
  695. @cindex starting up
  696. @kindex M-x gnus
  697. @findex gnus
  698. If your system administrator has set things up properly, starting Gnus
  699. and reading news is extremely easy---you just type @kbd{M-x gnus} in
  700. your Emacs.
  701. @findex gnus-other-frame
  702. @kindex M-x gnus-other-frame
  703. If you want to start Gnus in a different frame, you can use the command
  704. @kbd{M-x gnus-other-frame} instead.
  705. If things do not go smoothly at startup, you have to twiddle some
  706. variables in your @file{~/.gnus} file. This file is similar to
  707. @file{~/.emacs}, but is read when gnus starts.
  708. If you puzzle at any terms used in this manual, please refer to the
  709. terminology section (@pxref{Terminology}).
  710. @menu
  711. * Finding the News:: Choosing a method for getting news.
  712. * The First Time:: What does Gnus do the first time you start it?
  713. * The Server is Down:: How can I read my mail then?
  714. * Slave Gnusae:: You can have more than one Gnus active at a time.
  715. * Fetching a Group:: Starting Gnus just to read a group.
  716. * New Groups:: What is Gnus supposed to do with new groups?
  717. * Startup Files:: Those pesky startup files---@file{.newsrc}.
  718. * Auto Save:: Recovering from a crash.
  719. * The Active File:: Reading the active file over a slow line Takes Time.
  720. * Changing Servers:: You may want to move from one server to another.
  721. * Startup Variables:: Other variables you might change.
  722. @end menu
  723. @node Finding the News
  724. @section Finding the News
  725. @cindex finding news
  726. @vindex gnus-select-method
  727. @c @head
  728. The @code{gnus-select-method} variable says where Gnus should look for
  729. news. This variable should be a list where the first element says
  730. @dfn{how} and the second element says @dfn{where}. This method is your
  731. native method. All groups not fetched with this method are
  732. foreign groups.
  733. For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is where
  734. you want to get your daily dosage of news from, you'd say:
  735. @lisp
  736. (setq gnus-select-method '(nntp "news.somewhere.edu"))
  737. @end lisp
  738. If you want to read directly from the local spool, say:
  739. @lisp
  740. (setq gnus-select-method '(nnspool ""))
  741. @end lisp
  742. If you can use a local spool, you probably should, as it will almost
  743. certainly be much faster.
  744. @vindex gnus-nntpserver-file
  745. @cindex NNTPSERVER
  746. @cindex @sc{nntp} server
  747. If this variable is not set, Gnus will take a look at the
  748. @code{NNTPSERVER} environment variable. If that variable isn't set,
  749. Gnus will see whether @code{gnus-nntpserver-file}
  750. (@file{/etc/nntpserver} by default) has any opinions on the matter. If
  751. that fails as well, Gnus will try to use the machine running Emacs as an @sc{nntp} server. That's a long shot, though.
  752. @vindex gnus-nntp-server
  753. If @code{gnus-nntp-server} is set, this variable will override
  754. @code{gnus-select-method}. You should therefore set
  755. @code{gnus-nntp-server} to @code{nil}, which is what it is by default.
  756. @vindex gnus-secondary-servers
  757. @vindex gnus-nntp-server
  758. You can also make Gnus prompt you interactively for the name of an
  759. @sc{nntp} server. If you give a non-numerical prefix to @code{gnus}
  760. (i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
  761. in the @code{gnus-secondary-servers} list (if any). You can also just
  762. type in the name of any server you feel like visiting. (Note that this
  763. will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x
  764. gnus} later in the same Emacs session, Gnus will contact the same
  765. server.)
  766. @findex gnus-group-browse-foreign-server
  767. @kindex B @r{(Group)}
  768. However, if you use one @sc{nntp} server regularly and are just
  769. interested in a couple of groups from a different server, you would be
  770. better served by using the @kbd{B} command in the group buffer. It will
  771. let you have a look at what groups are available, and you can subscribe
  772. to any of the groups you want to. This also makes @file{.newsrc}
  773. maintenance much tidier. @xref{Foreign Groups}.
  774. @vindex gnus-secondary-select-methods
  775. @c @head
  776. A slightly different approach to foreign groups is to set the
  777. @code{gnus-secondary-select-methods} variable. The select methods
  778. listed in this variable are in many ways just as native as the
  779. @code{gnus-select-method} server. They will also be queried for active
  780. files during startup (if that's required), and new newsgroups that
  781. appear on these servers will be subscribed (or not) just as native
  782. groups are.
  783. For instance, if you use the @code{nnmbox} back end to read your mail,
  784. you would typically set this variable to
  785. @lisp
  786. (setq gnus-secondary-select-methods '((nnmbox "")))
  787. @end lisp
  788. @node The First Time
  789. @section The First Time
  790. @cindex first time usage
  791. If no startup files exist, Gnus will try to determine what groups should
  792. be subscribed by default.
  793. @vindex gnus-default-subscribed-newsgroups
  794. If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
  795. will subscribe you to just those groups in that list, leaving the rest
  796. killed. Your system administrator should have set this variable to
  797. something useful.
  798. Since she hasn't, Gnus will just subscribe you to a few arbitrarily
  799. picked groups (i.e., @samp{*.newusers}). (@dfn{Arbitrary} is defined
  800. here as @dfn{whatever Lars thinks you should read}.)
  801. You'll also be subscribed to the Gnus documentation group, which should
  802. help you with most common problems.
  803. If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
  804. use the normal functions for handling new groups, and not do anything
  805. special.
  806. @node The Server is Down
  807. @section The Server is Down
  808. @cindex server errors
  809. If the default server is down, Gnus will understandably have some
  810. problems starting. However, if you have some mail groups in addition to
  811. the news groups, you may want to start Gnus anyway.
  812. Gnus, being the trusting sort of program, will ask whether to proceed
  813. without a native select method if that server can't be contacted. This
  814. will happen whether the server doesn't actually exist (i.e., you have
  815. given the wrong address) or the server has just momentarily taken ill
  816. for some reason or other. If you decide to continue and have no foreign
  817. groups, you'll find it difficult to actually do anything in the group
  818. buffer. But, hey, that's your problem. Blllrph!
  819. @findex gnus-no-server
  820. @kindex M-x gnus-no-server
  821. @c @head
  822. If you know that the server is definitely down, or you just want to read
  823. your mail without bothering with the server at all, you can use the
  824. @code{gnus-no-server} command to start Gnus. That might come in handy
  825. if you're in a hurry as well. This command will not attempt to contact
  826. your primary server---instead, it will just activate all groups on level
  827. 1 and 2. (You should preferably keep no native groups on those two
  828. levels.)
  829. @node Slave Gnusae
  830. @section Slave Gnusae
  831. @cindex slave
  832. You might want to run more than one Emacs with more than one Gnus at the
  833. same time. If you are using different @file{.newsrc} files (e.g., if you
  834. are using the two different Gnusae to read from two different servers),
  835. that is no problem whatsoever. You just do it.
  836. The problem appears when you want to run two Gnusae that use the same
  837. @code{.newsrc} file.
  838. To work around that problem some, we here at the Think-Tank at the Gnus
  839. Towers have come up with a new concept: @dfn{Masters} and
  840. @dfn{slaves}. (We have applied for a patent on this concept, and have
  841. taken out a copyright on those words. If you wish to use those words in
  842. conjunction with each other, you have to send $1 per usage instance to
  843. me. Usage of the patent (@dfn{Master/Slave Relationships In Computer
  844. Applications}) will be much more expensive, of course.)
  845. Anyway, you start one Gnus up the normal way with @kbd{M-x gnus} (or
  846. however you do it). Each subsequent slave Gnusae should be started with
  847. @kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc}
  848. files, but instead save @dfn{slave files} that contain information only
  849. on what groups have been read in the slave session. When a master Gnus
  850. starts, it will read (and delete) these slave files, incorporating all
  851. information from them. (The slave files will be read in the sequence
  852. they were created, so the latest changes will have precedence.)
  853. Information from the slave files has, of course, precedence over the
  854. information in the normal (i.e., master) @code{.newsrc} file.
  855. @node Fetching a Group
  856. @section Fetching a Group
  857. @cindex fetching a group
  858. @findex gnus-fetch-group
  859. It is sometimes convenient to be able to just say ``I want to read this
  860. group and I don't care whether Gnus has been started or not''. This is
  861. perhaps more useful for people who write code than for users, but the
  862. command @code{gnus-fetch-group} provides this functionality in any case.
  863. It takes the group name as a parameter.
  864. @node New Groups
  865. @section New Groups
  866. @cindex new groups
  867. @cindex subscription
  868. @vindex gnus-check-new-newsgroups
  869. If you are satisfied that you really never want to see any new groups,
  870. you can set @code{gnus-check-new-newsgroups} to @code{nil}. This will
  871. also save you some time at startup. Even if this variable is
  872. @code{nil}, you can always subscribe to the new groups just by pressing
  873. @kbd{U} in the group buffer (@pxref{Group Maintenance}). This variable
  874. is @code{ask-server} by default. If you set this variable to
  875. @code{always}, then Gnus will query the back ends for new groups even
  876. when you do the @kbd{g} command (@pxref{Scanning New Messages}).
  877. @menu
  878. * Checking New Groups:: Determining what groups are new.
  879. * Subscription Methods:: What Gnus should do with new groups.
  880. * Filtering New Groups:: Making Gnus ignore certain new groups.
  881. @end menu
  882. @node Checking New Groups
  883. @subsection Checking New Groups
  884. Gnus normally determines whether a group is new or not by comparing the
  885. list of groups from the active file(s) with the lists of subscribed and
  886. dead groups. This isn't a particularly fast method. If
  887. @code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
  888. server for new groups since the last time. This is both faster and
  889. cheaper. This also means that you can get rid of the list of killed
  890. groups altogether, so you may set @code{gnus-save-killed-list} to
  891. @code{nil}, which will save time both at startup, at exit, and all over.
  892. Saves disk space, too. Why isn't this the default, then?
  893. Unfortunately, not all servers support this command.
  894. I bet I know what you're thinking now: How do I find out whether my
  895. server supports @code{ask-server}? No? Good, because I don't have a
  896. fail-safe answer. I would suggest just setting this variable to
  897. @code{ask-server} and see whether any new groups appear within the next
  898. few days. If any do, then it works. If none do, then it doesn't
  899. work. I could write a function to make Gnus guess whether the server
  900. supports @code{ask-server}, but it would just be a guess. So I won't.
  901. You could @code{telnet} to the server and say @code{HELP} and see
  902. whether it lists @samp{NEWGROUPS} among the commands it understands. If
  903. it does, then it might work. (But there are servers that lists
  904. @samp{NEWGROUPS} without supporting the function properly.)
  905. This variable can also be a list of select methods. If so, Gnus will
  906. issue an @code{ask-server} command to each of the select methods, and
  907. subscribe them (or not) using the normal methods. This might be handy
  908. if you are monitoring a few servers for new groups. A side effect is
  909. that startup will take much longer, so you can meditate while waiting.
  910. Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
  911. @node Subscription Methods
  912. @subsection Subscription Methods
  913. @vindex gnus-subscribe-newsgroup-method
  914. What Gnus does when it encounters a new group is determined by the
  915. @code{gnus-subscribe-newsgroup-method} variable.
  916. This variable should contain a function. This function will be called
  917. with the name of the new group as the only parameter.
  918. Some handy pre-fab functions are:
  919. @table @code
  920. @item gnus-subscribe-zombies
  921. @vindex gnus-subscribe-zombies
  922. Make all new groups zombies. This is the default. You can browse the
  923. zombies later (with @kbd{A z}) and either kill them all off properly
  924. (with @kbd{S z}), or subscribe to them (with @kbd{u}).
  925. @item gnus-subscribe-randomly
  926. @vindex gnus-subscribe-randomly
  927. Subscribe all new groups in arbitrary order. This really means that all
  928. new groups will be added at ``the top'' of the group buffer.
  929. @item gnus-subscribe-alphabetically
  930. @vindex gnus-subscribe-alphabetically
  931. Subscribe all new groups in alphabetical order.
  932. @item gnus-subscribe-hierarchically
  933. @vindex gnus-subscribe-hierarchically
  934. Subscribe all new groups hierarchically. The difference between this
  935. function and @code{gnus-subscribe-alphabetically} is slight.
  936. @code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
  937. alphabetical fashion, while this function will enter groups into its
  938. hierarchy. So if you want to have the @samp{rec} hierarchy before the
  939. @samp{comp} hierarchy, this function will not mess that configuration
  940. up. Or something like that.
  941. @item gnus-subscribe-interactively
  942. @vindex gnus-subscribe-interactively
  943. Subscribe new groups interactively. This means that Gnus will ask
  944. you about @strong{all} new groups. The groups you choose to subscribe
  945. to will be subscribed hierarchically.
  946. @item gnus-subscribe-killed
  947. @vindex gnus-subscribe-killed
  948. Kill all new groups.
  949. @item gnus-subscribe-topics
  950. @vindex gnus-subscribe-topics
  951. Put the groups into the topic that has a matching @code{subscribe} topic
  952. parameter (@pxref{Topic Parameters}). For instance, a @code{subscribe}
  953. topic parameter that looks like
  954. @example
  955. "nnslashdot"
  956. @end example
  957. will mean that all groups that match that regex will be subscribed under
  958. that topic.
  959. If no topics match the groups, the groups will be subscribed in the
  960. top-level topic.
  961. @end table
  962. @vindex gnus-subscribe-hierarchical-interactive
  963. A closely related variable is
  964. @code{gnus-subscribe-hierarchical-interactive}. (That's quite a
  965. mouthful.) If this variable is non-@code{nil}, Gnus will ask you in a
  966. hierarchical fashion whether to subscribe to new groups or not. Gnus
  967. will ask you for each sub-hierarchy whether you want to descend the
  968. hierarchy or not.
  969. One common mistake is to set the variable a few paragraphs above
  970. (@code{gnus-subscribe-newsgroup-method}) to
  971. @code{gnus-subscribe-hierarchical-interactive}. This is an error. This
  972. will not work. This is ga-ga. So don't do it.
  973. @node Filtering New Groups
  974. @subsection Filtering New Groups
  975. A nice and portable way to control which new newsgroups should be
  976. subscribed (or ignored) is to put an @dfn{options} line at the start of
  977. the @file{.newsrc} file. Here's an example:
  978. @example
  979. options -n !alt.all !rec.all sci.all
  980. @end example
  981. @vindex gnus-subscribe-options-newsgroup-method
  982. This line obviously belongs to a serious-minded intellectual scientific
  983. person (or she may just be plain old boring), because it says that all
  984. groups that have names beginning with @samp{alt} and @samp{rec} should
  985. be ignored, and all groups with names beginning with @samp{sci} should
  986. be subscribed. Gnus will not use the normal subscription method for
  987. subscribing these groups.
  988. @code{gnus-subscribe-options-newsgroup-method} is used instead. This
  989. variable defaults to @code{gnus-subscribe-alphabetically}.
  990. @vindex gnus-options-not-subscribe
  991. @vindex gnus-options-subscribe
  992. If you don't want to mess with your @file{.newsrc} file, you can just
  993. set the two variables @code{gnus-options-subscribe} and
  994. @code{gnus-options-not-subscribe}. These two variables do exactly the
  995. same as the @file{.newsrc} @samp{options -n} trick. Both are regexps,
  996. and if the new group matches the former, it will be unconditionally
  997. subscribed, and if it matches the latter, it will be ignored.
  998. @vindex gnus-auto-subscribed-groups
  999. Yet another variable that meddles here is
  1000. @code{gnus-auto-subscribed-groups}. It works exactly like
  1001. @code{gnus-options-subscribe}, and is therefore really superfluous, but I
  1002. thought it would be nice to have two of these. This variable is more
  1003. meant for setting some ground rules, while the other variable is used
  1004. more for user fiddling. By default this variable makes all new groups
  1005. that come from mail back ends (@code{nnml}, @code{nnbabyl},
  1006. @code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed. If you
  1007. don't like that, just set this variable to @code{nil}.
  1008. New groups that match this regexp are subscribed using
  1009. @code{gnus-subscribe-options-newsgroup-method}.
  1010. @node Changing Servers
  1011. @section Changing Servers
  1012. @cindex changing servers
  1013. Sometimes it is necessary to move from one @sc{nntp} server to another.
  1014. This happens very rarely, but perhaps you change jobs, or one server is
  1015. very flaky and you want to use another.
  1016. Changing the server is pretty easy, right? You just change
  1017. @code{gnus-select-method} to point to the new server?
  1018. @emph{Wrong!}
  1019. Article numbers are not (in any way) kept synchronized between different
  1020. @sc{nntp} servers, and the only way Gnus keeps track of what articles
  1021. you have read is by keeping track of article numbers. So when you
  1022. change @code{gnus-select-method}, your @file{.newsrc} file becomes
  1023. worthless.
  1024. Gnus provides a few functions to attempt to translate a @file{.newsrc}
  1025. file from one server to another. They all have one thing in
  1026. common---they take a looong time to run. You don't want to use these
  1027. functions more than absolutely necessary.
  1028. @kindex M-x gnus-change-server
  1029. @findex gnus-change-server
  1030. If you have access to both servers, Gnus can request the headers for all
  1031. the articles you have read and compare @code{Message-ID}s and map the
  1032. article numbers of the read articles and article marks. The @kbd{M-x
  1033. gnus-change-server} command will do this for all your native groups. It
  1034. will prompt for the method you want to move to.
  1035. @kindex M-x gnus-group-move-group-to-server
  1036. @findex gnus-group-move-group-to-server
  1037. You can also move individual groups with the @kbd{M-x
  1038. gnus-group-move-group-to-server} command. This is useful if you want to
  1039. move a (foreign) group from one server to another.
  1040. @kindex M-x gnus-group-clear-data-on-native-groups
  1041. @findex gnus-group-clear-data-on-native-groups
  1042. If you don't have access to both the old and new server, all your marks
  1043. and read ranges have become worthless. You can use the @kbd{M-x
  1044. gnus-group-clear-data-on-native-groups} command to clear out all data
  1045. that you have on your native groups. Use with caution.
  1046. After changing servers, you @strong{must} move the cache hierarchy away,
  1047. since the cached articles will have wrong article numbers, which will
  1048. affect which articles Gnus thinks are read.
  1049. @node Startup Files
  1050. @section Startup Files
  1051. @cindex startup files
  1052. @cindex .newsrc
  1053. @cindex .newsrc.el
  1054. @cindex .newsrc.eld
  1055. Now, you all know about the @file{.newsrc} file. All subscription
  1056. information is traditionally stored in this file.
  1057. Things got a bit more complicated with @sc{gnus}. In addition to
  1058. keeping the @file{.newsrc} file updated, it also used a file called
  1059. @file{.newsrc.el} for storing all the information that didn't fit into
  1060. the @file{.newsrc} file. (Actually, it also duplicated everything in
  1061. the @file{.newsrc} file.) @sc{gnus} would read whichever one of these
  1062. files was the most recently saved, which enabled people to swap between
  1063. @sc{gnus} and other newsreaders.
  1064. That was kinda silly, so Gnus went one better: In addition to the
  1065. @file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
  1066. @file{.newsrc.eld}. It will read whichever of these files that are most
  1067. recent, but it will never write a @file{.newsrc.el} file. You should
  1068. never delete the @file{.newsrc.eld} file---it contains much information
  1069. not stored in the @file{.newsrc} file.
  1070. @vindex gnus-save-newsrc-file
  1071. @vindex gnus-read-newsrc-file
  1072. You can turn off writing the @file{.newsrc} file by setting
  1073. @code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
  1074. the file and save some space, as well as exiting from Gnus faster.
  1075. However, this will make it impossible to use other newsreaders than
  1076. Gnus. But hey, who would want to, right? Similarly, setting
  1077. @code{gnus-read-newsrc-file} to @code{nil} makes Gnus ignore the
  1078. @file{.newsrc} file and any @file{.newsrc-SERVER} files, which is
  1079. convenient if you have a tendency to use Netscape once in a while.
  1080. @vindex gnus-save-killed-list
  1081. If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
  1082. will not save the list of killed groups to the startup file. This will
  1083. save both time (when starting and quitting) and space (on disk). It
  1084. will also mean that Gnus has no record of what groups are new or old,
  1085. so the automatic new groups subscription methods become meaningless.
  1086. You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
  1087. @code{ask-server} if you set this variable to @code{nil} (@pxref{New
  1088. Groups}). This variable can also be a regular expression. If that's
  1089. the case, remove all groups that do not match this regexp before
  1090. saving. This can be useful in certain obscure situations that involve
  1091. several servers where not all servers support @code{ask-server}.
  1092. @vindex gnus-startup-file
  1093. The @code{gnus-startup-file} variable says where the startup files are.
  1094. The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
  1095. file being whatever that one is, with a @samp{.eld} appended.
  1096. @vindex gnus-save-newsrc-hook
  1097. @vindex gnus-save-quick-newsrc-hook
  1098. @vindex gnus-save-standard-newsrc-hook
  1099. @code{gnus-save-newsrc-hook} is called before saving any of the newsrc
  1100. files, while @code{gnus-save-quick-newsrc-hook} is called just before
  1101. saving the @file{.newsrc.eld} file, and
  1102. @code{gnus-save-standard-newsrc-hook} is called just before saving the
  1103. @file{.newsrc} file. The latter two are commonly used to turn version
  1104. control on or off. Version control is on by default when saving the
  1105. startup files. If you want to turn backup creation off, say something like:
  1106. @lisp
  1107. (defun turn-off-backup ()
  1108. (set (make-local-variable 'backup-inhibited) t))
  1109. (add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
  1110. (add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
  1111. @end lisp
  1112. @vindex gnus-init-file
  1113. When Gnus starts, it will read the @code{gnus-site-init-file}
  1114. (@file{.../site-lisp/gnus} by default) and @code{gnus-init-file}
  1115. (@file{~/.gnus} by default) files. These are normal Emacs Lisp files
  1116. and can be used to avoid cluttering your @file{~/.emacs} and
  1117. @file{site-init} files with Gnus stuff. Gnus will also check for files
  1118. with the same names as these, but with @file{.elc} and @file{.el}
  1119. suffixes. In other words, if you have set @code{gnus-init-file} to
  1120. @file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
  1121. and finally @file{~/.gnus} (in this order).
  1122. @node Auto Save
  1123. @section Auto Save
  1124. @cindex dribble file
  1125. @cindex auto-save
  1126. Whenever you do something that changes the Gnus data (reading articles,
  1127. catching up, killing/subscribing groups), the change is added to a
  1128. special @dfn{dribble buffer}. This buffer is auto-saved the normal
  1129. Emacs way. If your Emacs should crash before you have saved the
  1130. @file{.newsrc} files, all changes you have made can be recovered from
  1131. this file.
  1132. If Gnus detects this file at startup, it will ask the user whether to
  1133. read it. The auto save file is deleted whenever the real startup file is
  1134. saved.
  1135. @vindex gnus-use-dribble-file
  1136. If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
  1137. maintain a dribble buffer. The default is @code{t}.
  1138. @vindex gnus-dribble-directory
  1139. Gnus will put the dribble file(s) in @code{gnus-dribble-directory}. If
  1140. this variable is @code{nil}, which it is by default, Gnus will dribble
  1141. into the directory where the @file{.newsrc} file is located. (This is
  1142. normally the user's home directory.) The dribble file will get the same
  1143. file permissions as the @code{.newsrc} file.
  1144. @vindex gnus-always-read-dribble-file
  1145. If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will
  1146. read the dribble file on startup without querying the user.
  1147. @node The Active File
  1148. @section The Active File
  1149. @cindex active file
  1150. @cindex ignored groups
  1151. When Gnus starts, or indeed whenever it tries to determine whether new
  1152. articles have arrived, it reads the active file. This is a very large
  1153. file that lists all the active groups and articles on the server.
  1154. @vindex gnus-ignored-newsgroups
  1155. Before examining the active file, Gnus deletes all lines that match the
  1156. regexp @code{gnus-ignored-newsgroups}. This is done primarily to reject
  1157. any groups with bogus names, but you can use this variable to make Gnus
  1158. ignore hierarchies you aren't ever interested in. However, this is not
  1159. recommended. In fact, it's highly discouraged. Instead, @pxref{New
  1160. Groups} for an overview of other variables that can be used instead.
  1161. @c This variable is
  1162. @c @code{nil} by default, and will slow down active file handling somewhat
  1163. @c if you set it to anything else.
  1164. @vindex gnus-read-active-file
  1165. @c @head
  1166. The active file can be rather Huge, so if you have a slow network, you
  1167. can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
  1168. reading the active file. This variable is @code{some} by default.
  1169. Gnus will try to make do by getting information just on the groups that
  1170. you actually subscribe to.
  1171. Note that if you subscribe to lots and lots of groups, setting this
  1172. variable to @code{nil} will probably make Gnus slower, not faster. At
  1173. present, having this variable @code{nil} will slow Gnus down
  1174. considerably, unless you read news over a 2400 baud modem.
  1175. This variable can also have the value @code{some}. Gnus will then
  1176. attempt to read active info only on the subscribed groups. On some
  1177. servers this is quite fast (on sparkling, brand new INN servers that
  1178. support the @code{LIST ACTIVE group} command), on others this isn't fast
  1179. at all. In any case, @code{some} should be faster than @code{nil}, and
  1180. is certainly faster than @code{t} over slow lines.
  1181. Some news servers (old versions of Leafnode and old versions of INN, for
  1182. instance) do not support the @code{LIST ACTIVE group}. For these
  1183. servers, @code{nil} is probably the most efficient value for this
  1184. variable.
  1185. If this variable is @code{nil}, Gnus will ask for group info in total
  1186. lock-step, which isn't very fast. If it is @code{some} and you use an
  1187. @sc{nntp} server, Gnus will pump out commands as fast as it can, and
  1188. read all the replies in one swoop. This will normally result in better
  1189. performance, but if the server does not support the aforementioned
  1190. @code{LIST ACTIVE group} command, this isn't very nice to the server.
  1191. If you think that starting up Gnus takes too long, try all the three
  1192. different values for this variable and see what works best for you.
  1193. In any case, if you use @code{some} or @code{nil}, you should definitely
  1194. kill all groups that you aren't interested in to speed things up.
  1195. Note that this variable also affects active file retrieval from
  1196. secondary select methods.
  1197. @node Startup Variables
  1198. @section Startup Variables
  1199. @table @code
  1200. @item gnus-load-hook
  1201. @vindex gnus-load-hook
  1202. A hook run while Gnus is being loaded. Note that this hook will
  1203. normally be run just once in each Emacs session, no matter how many
  1204. times you start Gnus.
  1205. @item gnus-before-startup-hook
  1206. @vindex gnus-before-startup-hook
  1207. A hook run after starting up Gnus successfully.
  1208. @item gnus-startup-hook
  1209. @vindex gnus-startup-hook
  1210. A hook run as the very last thing after starting up Gnus
  1211. @item gnus-started-hook
  1212. @vindex gnus-started-hook
  1213. A hook that is run as the very last thing after starting up Gnus
  1214. successfully.
  1215. @item gnus-setup-news-hook
  1216. @vindex gnus-setup-news-hook
  1217. A hook that is run after reading the @file{.newsrc} file(s), but before
  1218. generating the group buffer.
  1219. @item gnus-check-bogus-newsgroups
  1220. @vindex gnus-check-bogus-newsgroups
  1221. If non-@code{nil}, Gnus will check for and delete all bogus groups at
  1222. startup. A @dfn{bogus group} is a group that you have in your
  1223. @file{.newsrc} file, but doesn't exist on the news server. Checking for
  1224. bogus groups can take quite a while, so to save time and resources it's
  1225. best to leave this option off, and do the checking for bogus groups once
  1226. in a while from the group buffer instead (@pxref{Group Maintenance}).
  1227. @item gnus-inhibit-startup-message
  1228. @vindex gnus-inhibit-startup-message
  1229. If non-@code{nil}, the startup message won't be displayed. That way,
  1230. your boss might not notice as easily that you are reading news instead
  1231. of doing your job. Note that this variable is used before
  1232. @file{.gnus.el} is loaded, so it should be set in @code{.emacs} instead.
  1233. @item gnus-no-groups-message
  1234. @vindex gnus-no-groups-message
  1235. Message displayed by Gnus when no groups are available.
  1236. @item gnus-play-startup-jingle
  1237. @vindex gnus-play-startup-jingle
  1238. If non-@code{nil}, play the Gnus jingle at startup.
  1239. @item gnus-startup-jingle
  1240. @vindex gnus-startup-jingle
  1241. Jingle to be played if the above variable is non-@code{nil}. The
  1242. default is @samp{Tuxedomoon.Jingle4.au}.
  1243. @end table
  1244. @node The Group Buffer
  1245. @chapter The Group Buffer
  1246. @cindex group buffer
  1247. The @dfn{group buffer} lists all (or parts) of the available groups. It
  1248. is the first buffer shown when Gnus starts, and will never be killed as
  1249. long as Gnus is active.
  1250. @iftex
  1251. @iflatex
  1252. \gnusfigure{The Group Buffer}{320}{
  1253. \put(75,50){\epsfig{figure=tmp/group.ps,height=9cm}}
  1254. \put(120,37){\makebox(0,0)[t]{Buffer name}}
  1255. \put(120,38){\vector(1,2){10}}
  1256. \put(40,60){\makebox(0,0)[r]{Mode line}}
  1257. \put(40,58){\vector(1,0){30}}
  1258. \put(200,28){\makebox(0,0)[t]{Native select method}}
  1259. \put(200,26){\vector(-1,2){15}}
  1260. }
  1261. @end iflatex
  1262. @end iftex
  1263. @menu
  1264. * Group Buffer Format:: Information listed and how you can change it.
  1265. * Group Maneuvering:: Commands for moving in the group buffer.
  1266. * Selecting a Group:: Actually reading news.
  1267. * Group Data:: Changing the info for a group.
  1268. * Subscription Commands:: Unsubscribing, killing, subscribing.
  1269. * Group Levels:: Levels? What are those, then?
  1270. * Group Score:: A mechanism for finding out what groups you like.
  1271. * Marking Groups:: You can mark groups for later processing.
  1272. * Foreign Groups:: Creating and editing groups.
  1273. * Group Parameters:: Each group may have different parameters set.
  1274. * Listing Groups:: Gnus can list various subsets of the groups.
  1275. * Sorting Groups:: Re-arrange the group order.
  1276. * Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
  1277. * Browse Foreign Server:: You can browse a server. See what it has to offer.
  1278. * Exiting Gnus:: Stop reading news and get some work done.
  1279. * Group Topics:: A folding group mode divided into topics.
  1280. * Misc Group Stuff:: Other stuff that you can to do.
  1281. @end menu
  1282. @node Group Buffer Format
  1283. @section Group Buffer Format
  1284. @menu
  1285. * Group Line Specification:: Deciding how the group buffer is to look.
  1286. * Group Modeline Specification:: The group buffer modeline.
  1287. * Group Highlighting:: Having nice colors in the group buffer.
  1288. @end menu
  1289. @node Group Line Specification
  1290. @subsection Group Line Specification
  1291. @cindex group buffer format
  1292. The default format of the group buffer is nice and dull, but you can
  1293. make it as exciting and ugly as you feel like.
  1294. Here's a couple of example group lines:
  1295. @example
  1296. 25: news.announce.newusers
  1297. * 0: alt.fan.andrea-dworkin
  1298. @end example
  1299. Quite simple, huh?
  1300. You can see that there are 25 unread articles in
  1301. @samp{news.announce.newusers}. There are no unread articles, but some
  1302. ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
  1303. asterisk at the beginning of the line?).
  1304. @vindex gnus-group-line-format
  1305. You can change that format to whatever you want by fiddling with the
  1306. @code{gnus-group-line-format} variable. This variable works along the
  1307. lines of a @code{format} specification, which is pretty much the same as
  1308. a @code{printf} specifications, for those of you who use (feh!) C.
  1309. @xref{Formatting Variables}.
  1310. @samp{%M%S%5y: %(%g%)\n} is the value that produced those lines above.
  1311. There should always be a colon on the line; the cursor always moves to
  1312. the colon after performing an operation. Nothing else is required---not
  1313. even the group name. All displayed text is just window dressing, and is
  1314. never examined by Gnus. Gnus stores all real information it needs using
  1315. text properties.
  1316. (Note that if you make a really strange, wonderful, spreadsheet-like
  1317. layout, everybody will believe you are hard at work with the accounting
  1318. instead of wasting time reading news.)
  1319. Here's a list of all available format characters:
  1320. @table @samp
  1321. @item M
  1322. An asterisk if the group only has marked articles.
  1323. @item S
  1324. Whether the group is subscribed.
  1325. @item L
  1326. Level of subscribedness.
  1327. @item N
  1328. Number of unread articles.
  1329. @item I
  1330. Number of dormant articles.
  1331. @item T
  1332. Number of ticked articles.
  1333. @item R
  1334. Number of read articles.
  1335. @item t
  1336. Estimated total number of articles. (This is really @var{max-number}
  1337. minus @var{min-number} plus 1.)
  1338. @item y
  1339. Number of unread, unticked, non-dormant articles.
  1340. @item i
  1341. Number of ticked and dormant articles.
  1342. @item g
  1343. Full group name.
  1344. @item G
  1345. Group name.
  1346. @item D
  1347. Newsgroup description.
  1348. @item o
  1349. @samp{m} if moderated.
  1350. @item O
  1351. @samp{(m)} if moderated.
  1352. @item s
  1353. Select method.
  1354. @item n
  1355. Select from where.
  1356. @item z
  1357. A string that looks like @samp{<%s:%n>} if a foreign select method is
  1358. used.
  1359. @item P
  1360. Indentation based on the level of the topic (@pxref{Group Topics}).
  1361. @item c
  1362. @vindex gnus-group-uncollapsed-levels
  1363. Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels}
  1364. variable says how many levels to leave at the end of the group name.
  1365. The default is 1---this will mean that group names like
  1366. @samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}.
  1367. @item m
  1368. @vindex gnus-new-mail-mark
  1369. @cindex %
  1370. @samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
  1371. the group lately.
  1372. @item p
  1373. @samp{#} (@code{gnus-process-mark}) if the group is process marked.
  1374. @item d
  1375. A string that says when you last read the group (@pxref{Group
  1376. Timestamp}).
  1377. @item u
  1378. User defined specifier. The next character in the format string should
  1379. be a letter. Gnus will call the function
  1380. @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
  1381. following @samp{%u}. The function will be passed a single dummy
  1382. parameter as argument. The function should return a string, which will
  1383. be inserted into the buffer just like information from any other
  1384. specifier.
  1385. @end table
  1386. @cindex *
  1387. All the ``number-of'' specs will be filled with an asterisk (@samp{*})
  1388. if no info is available---for instance, if it is a non-activated foreign
  1389. group, or a bogus native group.
  1390. @node Group Modeline Specification
  1391. @subsection Group Modeline Specification
  1392. @cindex group modeline
  1393. @vindex gnus-group-mode-line-format
  1394. The mode line can be changed by setting
  1395. @code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}). It
  1396. doesn't understand that many format specifiers:
  1397. @table @samp
  1398. @item S
  1399. The native news server.
  1400. @item M
  1401. The native select method.
  1402. @end table
  1403. @node Group Highlighting
  1404. @subsection Group Highlighting
  1405. @cindex highlighting
  1406. @cindex group highlighting
  1407. @vindex gnus-group-highlight
  1408. Highlighting in the group buffer is controlled by the
  1409. @code{gnus-group-highlight} variable. This is an alist with elements
  1410. that look like @code{(@var{form} . @var{face})}. If @var{form} evaluates to
  1411. something non-@code{nil}, the @var{face} will be used on the line.
  1412. Here's an example value for this variable that might look nice if the
  1413. background is dark:
  1414. @lisp
  1415. (cond (window-system
  1416. (setq custom-background-mode 'light)
  1417. (defface my-group-face-1
  1418. '((t (:foreground "Red" :bold t))) "First group face")
  1419. (defface my-group-face-2
  1420. '((t (:foreground "DarkSeaGreen4" :bold t))) "Second group face")
  1421. (defface my-group-face-3
  1422. '((t (:foreground "Green4" :bold t))) "Third group face")
  1423. (defface my-group-face-4
  1424. '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
  1425. (defface my-group-face-5
  1426. '((t (:foreground "Blue" :bold t))) "Fifth group face")))
  1427. (setq gnus-group-highlight
  1428. '(((> unread 200) . my-group-face-1)
  1429. ((and (< level 3) (zerop unread)) . my-group-face-2)
  1430. ((< level 3) . my-group-face-3)
  1431. ((zerop unread) . my-group-face-4)
  1432. (t . my-group-face-5)))
  1433. @end lisp
  1434. Also @pxref{Faces and Fonts}.
  1435. Variables that are dynamically bound when the forms are evaluated
  1436. include:
  1437. @table @code
  1438. @item group
  1439. The group name.
  1440. @item unread
  1441. The number of unread articles in the group.
  1442. @item method
  1443. The select method.
  1444. @item mailp
  1445. Whether the group is a mail group.
  1446. @item level
  1447. The level of the group.
  1448. @item score
  1449. The score of the group.
  1450. @item ticked
  1451. The number of ticked articles in the group.
  1452. @item total
  1453. The total number of articles in the group. Or rather, MAX-NUMBER minus
  1454. MIN-NUMBER plus one.
  1455. @item topic
  1456. When using the topic minor mode, this variable is bound to the current
  1457. topic being inserted.
  1458. @end table
  1459. When the forms are @code{eval}ed, point is at the beginning of the line
  1460. of the group in question, so you can use many of the normal Gnus
  1461. functions for snarfing info on the group.
  1462. @vindex gnus-group-update-hook
  1463. @findex gnus-group-highlight-line
  1464. @code{gnus-group-update-hook} is called when a group line is changed.
  1465. It will not be called when @code{gnus-visual} is @code{nil}. This hook
  1466. calls @code{gnus-group-highlight-line} by default.
  1467. @node Group Maneuvering
  1468. @section Group Maneuvering
  1469. @cindex group movement
  1470. All movement commands understand the numeric prefix and will behave as
  1471. expected, hopefully.
  1472. @table @kbd
  1473. @item n
  1474. @kindex n @r{(Group)}
  1475. @findex gnus-group-next-unread-group
  1476. Go to the next group that has unread articles
  1477. (@code{gnus-group-next-unread-group}).
  1478. @item p
  1479. @itemx @key{DEL}
  1480. @kindex @key{DEL} @r{(Group)}
  1481. @kindex p @r{(Group)}
  1482. @findex gnus-group-prev-unread-group
  1483. Go to the previous group that has unread articles
  1484. (@code{gnus-group-prev-unread-group}).
  1485. @item N
  1486. @kindex N @r{(Group)}
  1487. @findex gnus-group-next-group
  1488. Go to the next group (@code{gnus-group-next-group}).
  1489. @item P
  1490. @kindex P @r{(Group)}
  1491. @findex gnus-group-prev-group
  1492. Go to the previous group (@code{gnus-group-prev-group}).
  1493. @item M-n
  1494. @kindex M-n @r{(Group)}
  1495. @findex gnus-group-next-unread-group-same-level
  1496. Go to the next unread group on the same (or lower) level
  1497. (@code{gnus-group-next-unread-group-same-level}).
  1498. @item M-p
  1499. @kindex M-p @r{(Group)}
  1500. @findex gnus-group-prev-unread-group-same-level
  1501. Go to the previous unread group on the same (or lower) level
  1502. (@code{gnus-group-prev-unread-group-same-level}).
  1503. @end table
  1504. Three commands for jumping to groups:
  1505. @table @kbd
  1506. @item j
  1507. @kindex j @r{(Group)}
  1508. @findex gnus-group-jump-to-group
  1509. Jump to a group (and make it visible if it isn't already)
  1510. (@code{gnus-group-jump-to-group}). Killed groups can be jumped to, just
  1511. like living groups.
  1512. @item ,
  1513. @kindex , @r{(Group)}
  1514. @findex gnus-group-best-unread-group
  1515. Jump to the unread group with the lowest level
  1516. (@code{gnus-group-best-unread-group}).
  1517. @item .
  1518. @kindex . @r{(Group)}
  1519. @findex gnus-group-first-unread-group
  1520. Jump to the first group with unread articles
  1521. (@code{gnus-group-first-unread-group}).
  1522. @end table
  1523. @vindex gnus-group-goto-unread
  1524. If @code{gnus-group-goto-unread} is @code{nil}, all the movement
  1525. commands will move to the next group, not the next unread group. Even
  1526. the commands that say they move to the next unread group. The default
  1527. is @code{t}.
  1528. @node Selecting a Group
  1529. @section Selecting a Group
  1530. @cindex group selection
  1531. @table @kbd
  1532. @item @key{SPC}
  1533. @kindex @key{SPC} @r{(Group)}
  1534. @findex gnus-group-read-group
  1535. Select the current group, switch to the summary buffer and display the
  1536. first unread article (@code{gnus-group-read-group}). If there are no
  1537. unread articles in the group, or if you give a non-numerical prefix to
  1538. this command, Gnus will offer to fetch all the old articles in this
  1539. group from the server. If you give a numerical prefix @var{N}, @var{N}
  1540. determines the number of articles Gnus will fetch. If @var{N} is
  1541. positive, Gnus fetches the @var{N} newest articles, if @var{N} is
  1542. negative, Gnus fetches the @code{abs(@var{N})} oldest articles.
  1543. Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers old
  1544. articles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u
  1545. - 4 2 SPC} fetches the 42 oldest ones.
  1546. When you are in the group (in the Summary buffer), you can type
  1547. @kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the old
  1548. ones.
  1549. @item @key{RET}
  1550. @kindex @key{RET} @r{(Group)}
  1551. @findex gnus-group-select-group
  1552. Select the current group and switch to the summary buffer
  1553. (@code{gnus-group-select-group}). Takes the same arguments as
  1554. @code{gnus-group-read-group}---the only difference is that this command
  1555. does not display the first unread article automatically upon group
  1556. entry.
  1557. @item M-@key{RET}
  1558. @kindex M-@key{RET} @r{(Group)}
  1559. @findex gnus-group-quick-select-group
  1560. This does the same as the command above, but tries to do it with the
  1561. minimum amount of fuzz (@code{gnus-group-quick-select-group}). No
  1562. scoring/killing will be performed, there will be no highlights and no
  1563. expunging. This might be useful if you're in a real hurry and have to
  1564. enter some humongous group. If you give a 0 prefix to this command
  1565. (i.e., @kbd{0 M-@key{RET}}), Gnus won't even generate the summary buffer,
  1566. which is useful if you want to toggle threading before generating the
  1567. summary buffer (@pxref{Summary Generation Commands}).
  1568. @item M-@key{SPC}
  1569. @kindex M-@key{SPC} @r{(Group)}
  1570. @findex gnus-group-visible-select-group
  1571. This is yet one more command that does the same as the @key{RET}
  1572. command, but this one does it without expunging and hiding dormants
  1573. (@code{gnus-group-visible-select-group}).
  1574. @item C-M-@key{RET}
  1575. @kindex C-M-@key{RET} @r{(Group)}
  1576. @findex gnus-group-select-group-ephemerally
  1577. Finally, this command selects the current group ephemerally without
  1578. doing any processing of its contents
  1579. (@code{gnus-group-select-group-ephemerally}). Even threading has been
  1580. turned off. Everything you do in the group after selecting it in this
  1581. manner will have no permanent effects.
  1582. @end table
  1583. @vindex gnus-large-newsgroup
  1584. The @code{gnus-large-newsgroup} variable says what Gnus should consider
  1585. to be a big group. This is 200 by default. If the group has more
  1586. (unread and/or ticked) articles than this, Gnus will query the user
  1587. before entering the group. The user can then specify how many articles
  1588. should be fetched from the server. If the user specifies a negative
  1589. number (@code{-n}), the @code{n} oldest articles will be fetched. If it
  1590. is positive, the @code{n} articles that have arrived most recently will
  1591. be fetched.
  1592. @vindex gnus-select-group-hook
  1593. @vindex gnus-auto-select-first
  1594. @code{gnus-auto-select-first} control whether any articles are selected
  1595. automatically when entering a group with the @key{SPC} command.
  1596. @table @code
  1597. @item nil
  1598. Don't select any articles when entering the group. Just display the
  1599. full summary buffer.
  1600. @item t
  1601. Select the first unread article when entering the group.
  1602. @item best
  1603. Select the highest scored article in the group when entering the
  1604. group.
  1605. @end table
  1606. This variable can also be a function. In that case, that function will
  1607. be called to place point on a subject line, and/or select some article.
  1608. Useful functions include:
  1609. @table @code
  1610. @item gnus-summary-first-unread-subject
  1611. Place point on the subject line of the first unread article, but
  1612. don't select the article.
  1613. @item gnus-summary-first-unread-article
  1614. Select the first unread article.
  1615. @item gnus-summary-best-unread-article
  1616. Select the highest-scored unread article.
  1617. @end table
  1618. If you want to prevent automatic selection in some group (say, in a
  1619. binary group with Huge articles) you can set this variable to @code{nil}
  1620. in @code{gnus-select-group-hook}, which is called when a group is
  1621. selected.
  1622. @node Subscription Commands
  1623. @section Subscription Commands
  1624. @cindex subscription
  1625. @table @kbd
  1626. @item S t
  1627. @itemx u
  1628. @kindex S t @r{(Group)}
  1629. @kindex u @r{(Group)}
  1630. @findex gnus-group-unsubscribe-current-group
  1631. @c @icon{gnus-group-unsubscribe}
  1632. Toggle subscription to the current group
  1633. (@code{gnus-group-unsubscribe-current-group}).
  1634. @item S s
  1635. @itemx U
  1636. @kindex S s @r{(Group)}
  1637. @kindex U @r{(Group)}
  1638. @findex gnus-group-unsubscribe-group
  1639. Prompt for a group to subscribe, and then subscribe it. If it was
  1640. subscribed already, unsubscribe it instead
  1641. (@code{gnus-group-unsubscribe-group}).
  1642. @item S k
  1643. @itemx C-k
  1644. @kindex S k @r{(Group)}
  1645. @kindex C-k @r{(Group)}
  1646. @findex gnus-group-kill-group
  1647. @c @icon{gnus-group-kill-group}
  1648. Kill the current group (@code{gnus-group-kill-group}).
  1649. @item S y
  1650. @itemx C-y
  1651. @kindex S y @r{(Group)}
  1652. @kindex C-y @r{(Group)}
  1653. @findex gnus-group-yank-group
  1654. Yank the last killed group (@code{gnus-group-yank-group}).
  1655. @item C-x C-t
  1656. @kindex C-x C-t @r{(Group)}
  1657. @findex gnus-group-transpose-groups
  1658. Transpose two groups (@code{gnus-group-transpose-groups}). This isn't
  1659. really a subscription command, but you can use it instead of a
  1660. kill-and-yank sequence sometimes.
  1661. @item S w
  1662. @itemx C-w
  1663. @kindex S w @r{(Group)}
  1664. @kindex C-w @r{(Group)}
  1665. @findex gnus-group-kill-region
  1666. Kill all groups in the region (@code{gnus-group-kill-region}).
  1667. @item S z
  1668. @kindex S z @r{(Group)}
  1669. @findex gnus-group-kill-all-zombies
  1670. Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
  1671. @item S C-k
  1672. @kindex S C-k @r{(Group)}
  1673. @findex gnus-group-kill-level
  1674. Kill all groups on a certain level (@code{gnus-group-kill-level}).
  1675. These groups can't be yanked back after killing, so this command should
  1676. be used with some caution. The only time where this command comes in
  1677. really handy is when you have a @file{.newsrc} with lots of unsubscribed
  1678. groups that you want to get rid off. @kbd{S C-k} on level 7 will
  1679. kill off all unsubscribed groups that do not have message numbers in the
  1680. @file{.newsrc} file.
  1681. @end table
  1682. Also @pxref{Group Levels}.
  1683. @node Group Data
  1684. @section Group Data
  1685. @table @kbd
  1686. @item c
  1687. @kindex c @r{(Group)}
  1688. @findex gnus-group-catchup-current
  1689. @vindex gnus-group-catchup-group-hook
  1690. @c @icon{gnus-group-catchup-current}
  1691. Mark all unticked articles in this group as read
  1692. (@code{gnus-group-catchup-current}).
  1693. @code{gnus-group-catchup-group-hook} is called when catching up a group from
  1694. the group buffer.
  1695. @item C
  1696. @kindex C @r{(Group)}
  1697. @findex gnus-group-catchup-current-all
  1698. Mark all articles in this group, even the ticked ones, as read
  1699. (@code{gnus-group-catchup-current-all}).
  1700. @item M-c
  1701. @kindex M-c @r{(Group)}
  1702. @findex gnus-group-clear-data
  1703. Clear the data from the current group---nix out marks and the list of
  1704. read articles (@code{gnus-group-clear-data}).
  1705. @item M-x gnus-group-clear-data-on-native-groups
  1706. @kindex M-x gnus-group-clear-data-on-native-groups
  1707. @findex gnus-group-clear-data-on-native-groups
  1708. If you have switched from one @sc{nntp} server to another, all your marks
  1709. and read ranges have become worthless. You can use this command to
  1710. clear out all data that you have on your native groups. Use with
  1711. caution.
  1712. @end table
  1713. @node Group Levels
  1714. @section Group Levels
  1715. @cindex group level
  1716. @cindex level
  1717. All groups have a level of @dfn{subscribedness}. For instance, if a
  1718. group is on level 2, it is more subscribed than a group on level 5. You
  1719. can ask Gnus to just list groups on a given level or lower
  1720. (@pxref{Listing Groups}), or to just check for new articles in groups on
  1721. a given level or lower (@pxref{Scanning New Messages}).
  1722. Remember: The higher the level of the group, the less important it is.
  1723. @table @kbd
  1724. @item S l
  1725. @kindex S l @r{(Group)}
  1726. @findex gnus-group-set-current-level
  1727. Set the level of the current group. If a numeric prefix is given, the
  1728. next @var{n} groups will have their levels set. The user will be
  1729. prompted for a level.
  1730. @end table
  1731. @vindex gnus-level-killed
  1732. @vindex gnus-level-zombie
  1733. @vindex gnus-level-unsubscribed
  1734. @vindex gnus-level-subscribed
  1735. Gnus considers groups from levels 1 to
  1736. @code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
  1737. @code{gnus-level-subscribed} (exclusive) and
  1738. @code{gnus-level-unsubscribed} (inclusive) (default 7) to be
  1739. unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
  1740. (default 8) and @code{gnus-level-killed} to be killed (completely dead)
  1741. (default 9). Gnus treats subscribed and unsubscribed groups exactly the
  1742. same, but zombie and killed groups have no information on what articles
  1743. you have read, etc, stored. This distinction between dead and living
  1744. groups isn't done because it is nice or clever, it is done purely for
  1745. reasons of efficiency.
  1746. It is recommended that you keep all your mail groups (if any) on quite
  1747. low levels (e.g. 1 or 2).
  1748. Maybe the following description of the default behavior of Gnus helps to
  1749. understand what these levels are all about. By default, Gnus shows you
  1750. subscribed nonempty groups, but by hitting @kbd{L} you can have it show
  1751. empty subscribed groups and unsubscribed groups, too. Type @kbd{l} to
  1752. go back to showing nonempty subscribed groups again. Thus, unsubscribed
  1753. groups are hidden, in a way.
  1754. Zombie and killed groups are similar to unsubscribed groups in that they
  1755. are hidden by default. But they are different from subscribed and
  1756. unsubscribed groups in that Gnus doesn't ask the news server for
  1757. information (number of messages, number of unread messages) on zombie
  1758. and killed groups. Normally, you use @kbd{C-k} to kill the groups you
  1759. aren't interested in. If most groups are killed, Gnus is faster.
  1760. Why does Gnus distinguish between zombie and killed groups? Well, when
  1761. a new group arrives on the server, Gnus by default makes it a zombie
  1762. group. This means that you are normally not bothered with new groups,
  1763. but you can type @kbd{A z} to get a list of all new groups. Subscribe
  1764. the ones you like and kill the ones you don't want. (@kbd{A k} shows a
  1765. list of killed groups.)
  1766. If you want to play with the level variables, you should show some care.
  1767. Set them once, and don't touch them ever again. Better yet, don't touch
  1768. them at all unless you know exactly what you're doing.
  1769. @vindex gnus-level-default-unsubscribed
  1770. @vindex gnus-level-default-subscribed
  1771. Two closely related variables are @code{gnus-level-default-subscribed}
  1772. (default 3) and @code{gnus-level-default-unsubscribed} (default 6),
  1773. which are the levels that new groups will be put on if they are
  1774. (un)subscribed. These two variables should, of course, be inside the
  1775. relevant valid ranges.
  1776. @vindex gnus-keep-same-level
  1777. If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
  1778. will only move to groups of the same level (or lower). In
  1779. particular, going from the last article in one group to the next group
  1780. will go to the next group of the same level (or lower). This might be
  1781. handy if you want to read the most important groups before you read the
  1782. rest.
  1783. If this variable is @code{best}, Gnus will make the next newsgroup the
  1784. one with the best level.
  1785. @vindex gnus-group-default-list-level
  1786. All groups with a level less than or equal to
  1787. @code{gnus-group-default-list-level} will be listed in the group buffer
  1788. by default.
  1789. @vindex gnus-group-list-inactive-groups
  1790. If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
  1791. groups will be listed along with the unread groups. This variable is
  1792. @code{t} by default. If it is @code{nil}, inactive groups won't be
  1793. listed.
  1794. @vindex gnus-group-use-permanent-levels
  1795. If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
  1796. give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
  1797. use this level as the ``work'' level.
  1798. @vindex gnus-activate-level
  1799. Gnus will normally just activate (i. e., query the server about) groups
  1800. on level @code{gnus-activate-level} or less. If you don't want to
  1801. activate unsubscribed groups, for instance, you might set this variable
  1802. to 5. The default is 6.
  1803. @node Group Score
  1804. @section Group Score
  1805. @cindex group score
  1806. @cindex group rank
  1807. @cindex rank
  1808. You would normally keep important groups on high levels, but that scheme
  1809. is somewhat restrictive. Don't you wish you could have Gnus sort the
  1810. group buffer according to how often you read groups, perhaps? Within
  1811. reason?
  1812. This is what @dfn{group score} is for. You can have Gnus assign a score
  1813. to each group through the mechanism described below. You can then sort
  1814. the group buffer based on this score. Alternatively, you can sort on
  1815. score and then level. (Taken together, the level and the score is
  1816. called the @dfn{rank} of the group. A group that is on level 4 and has
  1817. a score of 1 has a higher rank than a group on level 5 that has a score
  1818. of 300. (The level is the most significant part and the score is the
  1819. least significant part.))
  1820. @findex gnus-summary-bubble-group
  1821. If you want groups you read often to get higher scores than groups you
  1822. read seldom you can add the @code{gnus-summary-bubble-group} function to
  1823. the @code{gnus-summary-exit-hook} hook. This will result (after
  1824. sorting) in a bubbling sort of action. If you want to see that in
  1825. action after each summary exit, you can add
  1826. @code{gnus-group-sort-groups-by-rank} or
  1827. @code{gnus-group-sort-groups-by-score} to the same hook, but that will
  1828. slow things down somewhat.
  1829. @node Marking Groups
  1830. @section Marking Groups
  1831. @cindex marking groups
  1832. If you want to perform some command on several groups, and they appear
  1833. subsequently in the group buffer, you would normally just give a
  1834. numerical prefix to the command. Most group commands will then do your
  1835. bidding on those groups.
  1836. However, if the groups are not in sequential order, you can still
  1837. perform a command on several groups. You simply mark the groups first
  1838. with the process mark and then execute the command.
  1839. @table @kbd
  1840. @item #
  1841. @kindex # @r{(Group)}
  1842. @itemx M m
  1843. @kindex M m @r{(Group)}
  1844. @findex gnus-group-mark-group
  1845. Set the mark on the current group (@code{gnus-group-mark-group}).
  1846. @item M-#
  1847. @kindex M-# @r{(Group)}
  1848. @itemx M u
  1849. @kindex M u @r{(Group)}
  1850. @findex gnus-group-unmark-group
  1851. Remove the mark from the current group
  1852. (@code{gnus-group-unmark-group}).
  1853. @item M U
  1854. @kindex M U @r{(Group)}
  1855. @findex gnus-group-unmark-all-groups
  1856. Remove the mark from all groups (@code{gnus-group-unmark-all-groups}).
  1857. @item M w
  1858. @kindex M w @r{(Group)}
  1859. @findex gnus-group-mark-region
  1860. Mark all groups between point and mark (@code{gnus-group-mark-region}).
  1861. @item M b
  1862. @kindex M b @r{(Group)}
  1863. @findex gnus-group-mark-buffer
  1864. Mark all groups in the buffer (@code{gnus-group-mark-buffer}).
  1865. @item M r
  1866. @kindex M r @r{(Group)}
  1867. @findex gnus-group-mark-regexp
  1868. Mark all groups that match some regular expression
  1869. (@code{gnus-group-mark-regexp}).
  1870. @end table
  1871. Also @pxref{Process/Prefix}.
  1872. @findex gnus-group-universal-argument
  1873. If you want to execute some command on all groups that have been marked
  1874. with the process mark, you can use the @kbd{M-&}
  1875. (@code{gnus-group-universal-argument}) command. It will prompt you for
  1876. the command to be executed.
  1877. @node Foreign Groups
  1878. @section Foreign Groups
  1879. @cindex foreign groups
  1880. Below are some group mode commands for making and editing general foreign
  1881. groups, as well as commands to ease the creation of a few
  1882. special-purpose groups. All these commands insert the newly created
  1883. groups under point---@code{gnus-subscribe-newsgroup-method} is not
  1884. consulted.
  1885. @table @kbd
  1886. @item G m
  1887. @kindex G m @r{(Group)}
  1888. @findex gnus-group-make-group
  1889. @cindex making groups
  1890. Make a new group (@code{gnus-group-make-group}). Gnus will prompt you
  1891. for a name, a method and possibly an @dfn{address}. For an easier way
  1892. to subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}.
  1893. @item G r
  1894. @kindex G r @r{(Group)}
  1895. @findex gnus-group-rename-group
  1896. @cindex renaming groups
  1897. Rename the current group to something else
  1898. (@code{gnus-group-rename-group}). This is valid only on some
  1899. groups---mail groups mostly. This command might very well be quite slow
  1900. on some back ends.
  1901. @item G c
  1902. @kindex G c @r{(Group)}
  1903. @cindex customizing
  1904. @findex gnus-group-customize
  1905. Customize the group parameters (@code{gnus-group-customize}).
  1906. @item G e
  1907. @kindex G e @r{(Group)}
  1908. @findex gnus-group-edit-group-method
  1909. @cindex renaming groups
  1910. Enter a buffer where you can edit the select method of the current
  1911. group (@code{gnus-group-edit-group-method}).
  1912. @item G p
  1913. @kindex G p @r{(Group)}
  1914. @findex gnus-group-edit-group-parameters
  1915. Enter a buffer where you can edit the group parameters
  1916. (@code{gnus-group-edit-group-parameters}).
  1917. @item G E
  1918. @kindex G E @r{(Group)}
  1919. @findex gnus-group-edit-group
  1920. Enter a buffer where you can edit the group info
  1921. (@code{gnus-group-edit-group}).
  1922. @item G d
  1923. @kindex G d @r{(Group)}
  1924. @findex gnus-group-make-directory-group
  1925. @cindex nndir
  1926. Make a directory group (@pxref{Directory Groups}). You will be prompted
  1927. for a directory name (@code{gnus-group-make-directory-group}).
  1928. @item G h
  1929. @kindex G h @r{(Group)}
  1930. @cindex help group
  1931. @findex gnus-group-make-help-group
  1932. Make the Gnus help group (@code{gnus-group-make-help-group}).
  1933. @item G a
  1934. @kindex G a @r{(Group)}
  1935. @cindex (ding) archive
  1936. @cindex archive group
  1937. @findex gnus-group-make-archive-group
  1938. @vindex gnus-group-archive-directory
  1939. @vindex gnus-group-recent-archive-directory
  1940. Make a Gnus archive group (@code{gnus-group-make-archive-group}). By
  1941. default a group pointing to the most recent articles will be created
  1942. (@code{gnus-group-recent-archive-directory}), but given a prefix, a full
  1943. group will be created from @code{gnus-group-archive-directory}.
  1944. @item G k
  1945. @kindex G k @r{(Group)}
  1946. @findex gnus-group-make-kiboze-group
  1947. @cindex nnkiboze
  1948. Make a kiboze group. You will be prompted for a name, for a regexp to
  1949. match groups to be ``included'' in the kiboze group, and a series of
  1950. strings to match on headers (@code{gnus-group-make-kiboze-group}).
  1951. @xref{Kibozed Groups}.
  1952. @item G D
  1953. @kindex G D @r{(Group)}
  1954. @findex gnus-group-enter-directory
  1955. @cindex nneething
  1956. Read an arbitrary directory as if it were a newsgroup with the
  1957. @code{nneething} back end (@code{gnus-group-enter-directory}).
  1958. @xref{Anything Groups}.
  1959. @item G f
  1960. @kindex G f @r{(Group)}
  1961. @findex gnus-group-make-doc-group
  1962. @cindex ClariNet Briefs
  1963. @cindex nndoc
  1964. Make a group based on some file or other
  1965. (@code{gnus-group-make-doc-group}). If you give a prefix to this
  1966. command, you will be prompted for a file name and a file type.
  1967. Currently supported types are @code{babyl}, @code{mbox}, @code{digest},
  1968. @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs},
  1969. @code{rfc934}, @code{rfc822-forward}, @code{nsmail} and @code{forward}.
  1970. If you run this command without a prefix, Gnus will guess at the file
  1971. type. @xref{Document Groups}.
  1972. @item G u
  1973. @kindex G u @r{(Group)}
  1974. @vindex gnus-useful-groups
  1975. @findex gnus-group-make-useful-group
  1976. Create one of the groups mentioned in @code{gnus-useful-groups}
  1977. (@code{gnus-group-make-useful-group}).
  1978. @item G w
  1979. @kindex G w @r{(Group)}
  1980. @findex gnus-group-make-web-group
  1981. @cindex DejaNews
  1982. @cindex Alta Vista
  1983. @cindex InReference
  1984. @cindex nnweb
  1985. Make an ephemeral group based on a web search
  1986. (@code{gnus-group-make-web-group}). If you give a prefix to this
  1987. command, make a solid group instead. You will be prompted for the
  1988. search engine type and the search string. Valid search engine types
  1989. include @code{dejanews}, @code{altavista} and @code{reference}.
  1990. @xref{Web Searches}.
  1991. If you use the @code{dejanews} search engine, you can limit the search
  1992. to a particular group by using a match string like
  1993. @samp{~g alt.sysadmin.recovery shaving}.
  1994. @item G @key{DEL}
  1995. @kindex G @key{DEL} @r{(Group)}
  1996. @findex gnus-group-delete-group
  1997. This function will delete the current group
  1998. (@code{gnus-group-delete-group}). If given a prefix, this function will
  1999. actually delete all the articles in the group, and forcibly remove the
  2000. group itself from the face of the Earth. Use a prefix only if you are
  2001. absolutely sure of what you are doing. This command can't be used on
  2002. read-only groups (like @code{nntp} group), though.
  2003. @item G V
  2004. @kindex G V @r{(Group)}
  2005. @findex gnus-group-make-empty-virtual
  2006. Make a new, fresh, empty @code{nnvirtual} group
  2007. (@code{gnus-group-make-empty-virtual}). @xref{Virtual Groups}.
  2008. @item G v
  2009. @kindex G v @r{(Group)}
  2010. @findex gnus-group-add-to-virtual
  2011. Add the current group to an @code{nnvirtual} group
  2012. (@code{gnus-group-add-to-virtual}). Uses the process/prefix convention.
  2013. @end table
  2014. @xref{Select Methods}, for more information on the various select
  2015. methods.
  2016. @vindex gnus-activate-foreign-newsgroups
  2017. If @code{gnus-activate-foreign-newsgroups} is a positive number,
  2018. Gnus will check all foreign groups with this level or lower at startup.
  2019. This might take quite a while, especially if you subscribe to lots of
  2020. groups from different @sc{nntp} servers. Also @pxref{Group Levels};
  2021. @code{gnus-activate-level} also affects activation of foreign
  2022. newsgroups.
  2023. @node Group Parameters
  2024. @section Group Parameters
  2025. @cindex group parameters
  2026. The group parameters store information local to a particular group.
  2027. Here's an example group parameter list:
  2028. @example
  2029. ((to-address . "ding@@gnus.org")
  2030. (auto-expire . t))
  2031. @end example
  2032. We see that each element consists of a "dotted pair"---the thing before
  2033. the dot is the key, while the thing after the dot is the value. All the
  2034. parameters have this form @emph{except} local variable specs, which are
  2035. not dotted pairs, but proper lists.
  2036. The following group parameters can be used:
  2037. @table @code
  2038. @item to-address
  2039. @cindex to-address
  2040. Address used by when doing followups and new posts.
  2041. @example
  2042. (to-address . "some@@where.com")
  2043. @end example
  2044. This is primarily useful in mail groups that represent closed mailing
  2045. lists---mailing lists where it's expected that everybody that writes to
  2046. the mailing list is subscribed to it. Since using this parameter
  2047. ensures that the mail only goes to the mailing list itself, it means
  2048. that members won't receive two copies of your followups.
  2049. Using @code{to-address} will actually work whether the group is foreign
  2050. or not. Let's say there's a group on the server that is called
  2051. @samp{fa.4ad-l}. This is a real newsgroup, but the server has gotten
  2052. the articles from a mail-to-news gateway. Posting directly to this
  2053. group is therefore impossible---you have to send mail to the mailing
  2054. list address instead.
  2055. Some parameters have corresponding customizable variables, each of which
  2056. is an alist of regexps and values.
  2057. @item to-list
  2058. @cindex to-list
  2059. Address used when doing @kbd{a} in that group.
  2060. @example
  2061. (to-list . "some@@where.com")
  2062. @end example
  2063. It is totally ignored
  2064. when doing a followup---except that if it is present in a news group,
  2065. you'll get mail group semantics when doing @kbd{f}.
  2066. If you do an @kbd{a} command in a mail group and you have neither a
  2067. @code{to-list} group parameter nor a @code{to-address} group parameter,
  2068. then a @code{to-list} group parameter will be added automatically upon
  2069. sending the message if @code{gnus-add-to-list} is set to @code{t}.
  2070. @vindex gnus-add-to-list
  2071. If you do an @kbd{a} command in a mail group and you don't have a
  2072. @code{to-list} group parameter, one will be added automatically upon
  2073. sending the message.
  2074. See also @code{gnus-parameter-to-list-alist}.
  2075. @item visible
  2076. @cindex visible
  2077. If the group parameter list has the element @code{(visible . t)},
  2078. that group will always be visible in the Group buffer, regardless
  2079. of whether it has any unread articles.
  2080. @item broken-reply-to
  2081. @cindex broken-reply-to
  2082. Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
  2083. headers in this group are to be ignored. This can be useful if you're
  2084. reading a mailing list group where the listserv has inserted
  2085. @code{Reply-To} headers that point back to the listserv itself. This is
  2086. broken behavior. So there!
  2087. @item to-group
  2088. @cindex to-group
  2089. Elements like @code{(to-group . "some.group.name")} means that all
  2090. posts in that group will be sent to @code{some.group.name}.
  2091. @item newsgroup
  2092. @cindex newsgroup
  2093. If you have @code{(newsgroup . t)} in the group parameter list, Gnus
  2094. will treat all responses as if they were responses to news articles.
  2095. This can be useful if you have a mail group that's really a mirror of a
  2096. news group.
  2097. @item gcc-self
  2098. @cindex gcc-self
  2099. If @code{(gcc-self . t)} is present in the group parameter list, newly
  2100. composed messages will be @code{Gcc}'d to the current group. If
  2101. @code{(gcc-self . none)} is present, no @code{Gcc:} header will be
  2102. generated, if @code{(gcc-self . "string")} is present, this string will
  2103. be inserted literally as a @code{gcc} header. This parameter takes
  2104. precedence over any default @code{Gcc} rules as described later
  2105. (@pxref{Archived Messages}).
  2106. @item auto-expire
  2107. @cindex auto-expire
  2108. If the group parameter has an element that looks like @code{(auto-expire
  2109. . t)}, all articles read will be marked as expirable. For an
  2110. alternative approach, @pxref{Expiring Mail}.
  2111. @item total-expire
  2112. @cindex total-expire
  2113. If the group parameter has an element that looks like
  2114. @code{(total-expire . t)}, all read articles will be put through the
  2115. expiry process, even if they are not marked as expirable. Use with
  2116. caution. Unread, ticked and dormant articles are not eligible for
  2117. expiry.
  2118. See also @code{gnus-total-expirable-newsgroups}.
  2119. @item expiry-wait
  2120. @cindex expiry-wait
  2121. @vindex nnmail-expiry-wait-function
  2122. If the group parameter has an element that looks like @code{(expiry-wait
  2123. . 10)}, this value will override any @code{nnmail-expiry-wait} and
  2124. @code{nnmail-expiry-wait-function} when expiring expirable messages.
  2125. The value can either be a number of days (not necessarily an integer) or
  2126. the symbols @code{never} or @code{immediate}.
  2127. @item score-file
  2128. @cindex score file group parameter
  2129. Elements that look like @code{(score-file . "file")} will make
  2130. @file{file} into the current score file for the group in question. All
  2131. interactive score entries will be put into this file.
  2132. @item adapt-file
  2133. @cindex adapt file group parameter
  2134. Elements that look like @code{(adapt-file . "file")} will make
  2135. @file{file} into the current adaptive file for the group in question.
  2136. All adaptive score entries will be put into this file.
  2137. @item admin-address
  2138. When unsubscribing from a mailing list you should never send the
  2139. unsubscription notice to the mailing list itself. Instead, you'd send
  2140. messages to the administrative address. This parameter allows you to
  2141. put the admin address somewhere convenient.
  2142. @item display
  2143. Elements that look like @code{(display . MODE)} say which articles to
  2144. display on entering the group. Valid values are:
  2145. @table @code
  2146. @item all
  2147. Display all articles, both read and unread.
  2148. @item default
  2149. Display the default visible articles, which normally includes unread and
  2150. ticked articles.
  2151. @end table
  2152. @item comment
  2153. Elements that look like @code{(comment . "This is a comment")}
  2154. are arbitrary comments on the group. They are currently ignored by
  2155. Gnus, but provide a place for you to store information on particular
  2156. groups.
  2157. @item charset
  2158. Elements that look like @code{(charset . iso-8859-1)} will make
  2159. @code{iso-8859-1} the default charset; that is, the charset that will be
  2160. used for all articles that do not specify a charset.
  2161. See also @code{gnus-group-charset-alist}.
  2162. @item ignored-charsets
  2163. Elements that look like @code{(ignored-charsets x-known iso-8859-1)}
  2164. will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the
  2165. default charset will be used for decoding articles.
  2166. See also @code{gnus-group-ignored-charsets-alist}.
  2167. @item posting-style
  2168. You can store additional posting style information for this group only
  2169. here (@pxref{Posting Styles}). The format is that of an entry in the
  2170. @code{gnus-posting-styles} alist, except that there's no regexp matching
  2171. the group name (of course). Style elements in this group parameter will
  2172. take precedence over the ones found in @code{gnus-posting-styles}.
  2173. For instance, if you want a funky name and signature in this group only,
  2174. instead of hacking @code{gnus-posting-styles}, you could put something
  2175. like this in the group parameters:
  2176. @example
  2177. (posting-style
  2178. (name "Funky Name")
  2179. (signature "Funky Signature"))
  2180. @end example
  2181. @item banner
  2182. An item like @code{(banner . "regex")} causes any part of an article
  2183. that matches the regular expression "regex" to be stripped. Instead of
  2184. "regex", you can also use the symbol @code{signature} which strips the
  2185. last signature or any of the elements of the alist
  2186. @code{gnus-article-banner-alist}.
  2187. @item (@var{variable} @var{form})
  2188. You can use the group parameters to set variables local to the group you
  2189. are entering. If you want to turn threading off in @samp{news.answers},
  2190. you could put @code{(gnus-show-threads nil)} in the group parameters of
  2191. that group. @code{gnus-show-threads} will be made into a local variable
  2192. in the summary buffer you enter, and the form @code{nil} will be
  2193. @code{eval}ed there.
  2194. This can also be used as a group-specific hook function, if you like.
  2195. If you want to hear a beep when you enter a group, you could put
  2196. something like @code{(dummy-variable (ding))} in the parameters of that
  2197. group. @code{dummy-variable} will be set to the result of the
  2198. @code{(ding)} form, but who cares?
  2199. @end table
  2200. Use the @kbd{G p} or the @kbd{G c} command to edit group parameters of a
  2201. group. (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c}
  2202. presents you with a Customize-like interface. The latter helps avoid
  2203. silly Lisp errors.) You might also be interested in reading about topic
  2204. parameters (@pxref{Topic Parameters}).
  2205. @node Listing Groups
  2206. @section Listing Groups
  2207. @cindex group listing
  2208. These commands all list various slices of the groups available.
  2209. @table @kbd
  2210. @item l
  2211. @itemx A s
  2212. @kindex A s @r{(Group)}
  2213. @kindex l @r{(Group)}
  2214. @findex gnus-group-list-groups
  2215. List all groups that have unread articles
  2216. (@code{gnus-group-list-groups}). If the numeric prefix is used, this
  2217. command will list only groups of level ARG and lower. By default, it
  2218. only lists groups of level five (i. e.,
  2219. @code{gnus-group-default-list-level}) or lower (i.e., just subscribed
  2220. groups).
  2221. @item L
  2222. @itemx A u
  2223. @kindex A u @r{(Group)}
  2224. @kindex L @r{(Group)}
  2225. @findex gnus-group-list-all-groups
  2226. List all groups, whether they have unread articles or not
  2227. (@code{gnus-group-list-all-groups}). If the numeric prefix is used,
  2228. this command will list only groups of level ARG and lower. By default,
  2229. it lists groups of level seven or lower (i.e., just subscribed and
  2230. unsubscribed groups).
  2231. @item A l
  2232. @kindex A l @r{(Group)}
  2233. @findex gnus-group-list-level
  2234. List all unread groups on a specific level
  2235. (@code{gnus-group-list-level}). If given a prefix, also list the groups
  2236. with no unread articles.
  2237. @item A k
  2238. @kindex A k @r{(Group)}
  2239. @findex gnus-group-list-killed
  2240. List all killed groups (@code{gnus-group-list-killed}). If given a
  2241. prefix argument, really list all groups that are available, but aren't
  2242. currently (un)subscribed. This could entail reading the active file
  2243. from the server.
  2244. @item A z
  2245. @kindex A z @r{(Group)}
  2246. @findex gnus-group-list-zombies
  2247. List all zombie groups (@code{gnus-group-list-zombies}).
  2248. @item A m
  2249. @kindex A m @r{(Group)}
  2250. @findex gnus-group-list-matching
  2251. List all unread, subscribed groups with names that match a regexp
  2252. (@code{gnus-group-list-matching}).
  2253. @item A M
  2254. @kindex A M @r{(Group)}
  2255. @findex gnus-group-list-all-matching
  2256. List groups that match a regexp (@code{gnus-group-list-all-matching}).
  2257. @item A A
  2258. @kindex A A @r{(Group)}
  2259. @findex gnus-group-list-active
  2260. List absolutely all groups in the active file(s) of the
  2261. server(s) you are connected to (@code{gnus-group-list-active}). This
  2262. might very well take quite a while. It might actually be a better idea
  2263. to do a @kbd{A M} to list all matching, and just give @samp{.} as the
  2264. thing to match on. Also note that this command may list groups that
  2265. don't exist (yet)---these will be listed as if they were killed groups.
  2266. Take the output with some grains of salt.
  2267. @item A a
  2268. @kindex A a @r{(Group)}
  2269. @findex gnus-group-apropos
  2270. List all groups that have names that match a regexp
  2271. (@code{gnus-group-apropos}).
  2272. @item A d
  2273. @kindex A d @r{(Group)}
  2274. @findex gnus-group-description-apropos
  2275. List all groups that have names or descriptions that match a regexp
  2276. (@code{gnus-group-description-apropos}).
  2277. @item A c
  2278. @kindex A c @r{(Group)}
  2279. @findex gnus-group-list-cached
  2280. List all groups with cached articles (@code{gnus-group-list-cached}).
  2281. @item A ?
  2282. @kindex A ? @r{(Group)}
  2283. @findex gnus-group-list-dormant
  2284. List all groups with dormant articles (@code{gnus-group-list-dormant}).
  2285. @end table
  2286. @vindex gnus-permanently-visible-groups
  2287. @cindex visible group parameter
  2288. Groups that match the @code{gnus-permanently-visible-groups} regexp will
  2289. always be shown, whether they have unread articles or not. You can also
  2290. add the @code{visible} element to the group parameters in question to
  2291. get the same effect.
  2292. @vindex gnus-list-groups-with-ticked-articles
  2293. Groups that have just ticked articles in it are normally listed in the
  2294. group buffer. If @code{gnus-list-groups-with-ticked-articles} is
  2295. @code{nil}, these groups will be treated just like totally empty
  2296. groups. It is @code{t} by default.
  2297. @node Sorting Groups
  2298. @section Sorting Groups
  2299. @cindex sorting groups
  2300. @kindex C-c C-s @r{(Group)}
  2301. @findex gnus-group-sort-groups
  2302. @vindex gnus-group-sort-function
  2303. The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
  2304. group buffer according to the function(s) given by the
  2305. @code{gnus-group-sort-function} variable. Available sorting functions
  2306. include:
  2307. @table @code
  2308. @item gnus-group-sort-by-alphabet
  2309. @findex gnus-group-sort-by-alphabet
  2310. Sort the group names alphabetically. This is the default.
  2311. @item gnus-group-sort-by-real-name
  2312. @findex gnus-group-sort-by-real-name
  2313. Sort the group alphabetically on the real (unprefixed) group names.
  2314. @item gnus-group-sort-by-level
  2315. @findex gnus-group-sort-by-level
  2316. Sort by group level.
  2317. @item gnus-group-sort-by-score
  2318. @findex gnus-group-sort-by-score
  2319. Sort by group score. @xref{Group Score}.
  2320. @item gnus-group-sort-by-rank
  2321. @findex gnus-group-sort-by-rank
  2322. Sort by group score and then the group level. The level and the score
  2323. are, when taken together, the group's @dfn{rank}. @xref{Group Score}.
  2324. @item gnus-group-sort-by-unread
  2325. @findex gnus-group-sort-by-unread
  2326. Sort by number of unread articles.
  2327. @item gnus-group-sort-by-method
  2328. @findex gnus-group-sort-by-method
  2329. Sort alphabetically on the select method.
  2330. @end table
  2331. @code{gnus-group-sort-function} can also be a list of sorting
  2332. functions. In that case, the most significant sort key function must be
  2333. the last one.
  2334. There are also a number of commands for sorting directly according to
  2335. some sorting criteria:
  2336. @table @kbd
  2337. @item G S a
  2338. @kindex G S a @r{(Group)}
  2339. @findex gnus-group-sort-groups-by-alphabet
  2340. Sort the group buffer alphabetically by group name
  2341. (@code{gnus-group-sort-groups-by-alphabet}).
  2342. @item G S u
  2343. @kindex G S u @r{(Group)}
  2344. @findex gnus-group-sort-groups-by-unread
  2345. Sort the group buffer by the number of unread articles
  2346. (@code{gnus-group-sort-groups-by-unread}).
  2347. @item G S l
  2348. @kindex G S l @r{(Group)}
  2349. @findex gnus-group-sort-groups-by-level
  2350. Sort the group buffer by group level
  2351. (@code{gnus-group-sort-groups-by-level}).
  2352. @item G S v
  2353. @kindex G S v @r{(Group)}
  2354. @findex gnus-group-sort-groups-by-score
  2355. Sort the group buffer by group score
  2356. (@code{gnus-group-sort-groups-by-score}). @xref{Group Score}.
  2357. @item G S r
  2358. @kindex G S r @r{(Group)}
  2359. @findex gnus-group-sort-groups-by-rank
  2360. Sort the group buffer by group rank
  2361. (@code{gnus-group-sort-groups-by-rank}). @xref{Group Score}.
  2362. @item G S m
  2363. @kindex G S m @r{(Group)}
  2364. @findex gnus-group-sort-groups-by-method
  2365. Sort the group buffer alphabetically by back end name
  2366. (@code{gnus-group-sort-groups-by-method}).
  2367. @end table
  2368. All the commands below obey the process/prefix convention
  2369. (@pxref{Process/Prefix}).
  2370. When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these
  2371. commands will sort in reverse order.
  2372. You can also sort a subset of the groups:
  2373. @table @kbd
  2374. @item G P a
  2375. @kindex G P a @r{(Group)}
  2376. @findex gnus-group-sort-selected-groups-by-alphabet
  2377. Sort the groups alphabetically by group name
  2378. (@code{gnus-group-sort-selected-groups-by-alphabet}).
  2379. @item G P u
  2380. @kindex G P u @r{(Group)}
  2381. @findex gnus-group-sort-selected-groups-by-unread
  2382. Sort the groups by the number of unread articles
  2383. (@code{gnus-group-sort-selected-groups-by-unread}).
  2384. @item G P l
  2385. @kindex G P l @r{(Group)}
  2386. @findex gnus-group-sort-selected-groups-by-level
  2387. Sort the groups by group level
  2388. (@code{gnus-group-sort-selected-groups-by-level}).
  2389. @item G P v
  2390. @kindex G P v @r{(Group)}
  2391. @findex gnus-group-sort-selected-groups-by-score
  2392. Sort the groups by group score
  2393. (@code{gnus-group-sort-selected-groups-by-score}). @xref{Group Score}.
  2394. @item G P r
  2395. @kindex G P r @r{(Group)}
  2396. @findex gnus-group-sort-selected-groups-by-rank
  2397. Sort the groups by group rank
  2398. (@code{gnus-group-sort-selected-groups-by-rank}). @xref{Group Score}.
  2399. @item G P m
  2400. @kindex G P m @r{(Group)}
  2401. @findex gnus-group-sort-selected-groups-by-method
  2402. Sort the groups alphabetically by back end name
  2403. (@code{gnus-group-sort-selected-groups-by-method}).
  2404. @end table
  2405. @node Group Maintenance
  2406. @section Group Maintenance
  2407. @cindex bogus groups
  2408. @table @kbd
  2409. @item b
  2410. @kindex b @r{(Group)}
  2411. @findex gnus-group-check-bogus-groups
  2412. Find bogus groups and delete them
  2413. (@code{gnus-group-check-bogus-groups}).
  2414. @item F
  2415. @kindex F @r{(Group)}
  2416. @findex gnus-group-find-new-groups
  2417. Find new groups and process them (@code{gnus-group-find-new-groups}).
  2418. With 1 @kbd{C-u}, use the @code{ask-server} method to query the server
  2419. for new groups. With 2 @kbd{C-u}'s, use most complete method possible
  2420. to query the server for new groups, and subscribe the new groups as
  2421. zombies.
  2422. @item C-c C-x
  2423. @kindex C-c C-x @r{(Group)}
  2424. @findex gnus-group-expire-articles
  2425. Run all expirable articles in the current group through the expiry
  2426. process (if any) (@code{gnus-group-expire-articles}).
  2427. @item C-c C-M-x
  2428. @kindex C-c C-M-x @r{(Group)}
  2429. @findex gnus-group-expire-all-groups
  2430. Run all articles in all groups through the expiry process
  2431. (@code{gnus-group-expire-all-groups}).
  2432. @end table
  2433. @node Browse Foreign Server
  2434. @section Browse Foreign Server
  2435. @cindex foreign servers
  2436. @cindex browsing servers
  2437. @table @kbd
  2438. @item B
  2439. @kindex B @r{(Group)}
  2440. @findex gnus-group-browse-foreign-server
  2441. You will be queried for a select method and a server name. Gnus will
  2442. then attempt to contact this server and let you browse the groups there
  2443. (@code{gnus-group-browse-foreign-server}).
  2444. @end table
  2445. @findex gnus-browse-mode
  2446. A new buffer with a list of available groups will appear. This buffer
  2447. will use the @code{gnus-browse-mode}. This buffer looks a bit (well,
  2448. a lot) like a normal group buffer.
  2449. Here's a list of keystrokes available in the browse mode:
  2450. @table @kbd
  2451. @item n
  2452. @kindex n (Browse)
  2453. @findex gnus-group-next-group
  2454. Go to the next group (@code{gnus-group-next-group}).
  2455. @item p
  2456. @kindex p (Browse)
  2457. @findex gnus-group-prev-group
  2458. Go to the previous group (@code{gnus-group-prev-group}).
  2459. @item @key{SPC}
  2460. @kindex @key{SPC} (Browse)
  2461. @findex gnus-browse-read-group
  2462. Enter the current group and display the first article
  2463. (@code{gnus-browse-read-group}).
  2464. @item @key{RET}
  2465. @kindex @key{RET} (Browse)
  2466. @findex gnus-browse-select-group
  2467. Enter the current group (@code{gnus-browse-select-group}).
  2468. @item u
  2469. @kindex u (Browse)
  2470. @findex gnus-browse-unsubscribe-current-group
  2471. Unsubscribe to the current group, or, as will be the case here,
  2472. subscribe to it (@code{gnus-browse-unsubscribe-current-group}).
  2473. @item l
  2474. @itemx q
  2475. @kindex q (Browse)
  2476. @kindex l (Browse)
  2477. @findex gnus-browse-exit
  2478. Exit browse mode (@code{gnus-browse-exit}).
  2479. @item ?
  2480. @kindex ? (Browse)
  2481. @findex gnus-browse-describe-briefly
  2482. Describe browse mode briefly (well, there's not much to describe, is
  2483. there) (@code{gnus-browse-describe-briefly}).
  2484. @end table
  2485. @node Exiting Gnus
  2486. @section Exiting Gnus
  2487. @cindex exiting Gnus
  2488. Yes, Gnus is ex(c)iting.
  2489. @table @kbd
  2490. @item z
  2491. @kindex z @r{(Group)}
  2492. @findex gnus-group-suspend
  2493. Suspend Gnus (@code{gnus-group-suspend}). This doesn't really exit Gnus,
  2494. but it kills all buffers except the Group buffer. I'm not sure why this
  2495. is a gain, but then who am I to judge?
  2496. @item q
  2497. @kindex q @r{(Group)}
  2498. @findex gnus-group-exit
  2499. @c @icon{gnus-group-exit}
  2500. Quit Gnus (@code{gnus-group-exit}).
  2501. @item Q
  2502. @kindex Q @r{(Group)}
  2503. @findex gnus-group-quit
  2504. Quit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
  2505. The dribble file will be saved, though (@pxref{Auto Save}).
  2506. @end table
  2507. @vindex gnus-exit-gnus-hook
  2508. @vindex gnus-suspend-gnus-hook
  2509. @code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
  2510. @code{gnus-exit-gnus-hook} is called when you quit Gnus, while
  2511. @code{gnus-after-exiting-gnus-hook} is called as the final item when
  2512. exiting Gnus.
  2513. @findex gnus-unload
  2514. @cindex unloading
  2515. If you wish to completely unload Gnus and all its adherents, you can use
  2516. the @code{gnus-unload} command. This command is also very handy when
  2517. trying to customize meta-variables.
  2518. Note:
  2519. @quotation
  2520. Miss Lisa Cannifax, while sitting in English class, felt her feet go
  2521. numbly heavy and herself fall into a hazy trance as the boy sitting
  2522. behind her drew repeated lines with his pencil across the back of her
  2523. plastic chair.
  2524. @end quotation
  2525. @node Group Topics
  2526. @section Group Topics
  2527. @cindex topics
  2528. If you read lots and lots of groups, it might be convenient to group
  2529. them hierarchically according to topics. You put your Emacs groups over
  2530. here, your sex groups over there, and the rest (what, two groups or so?)
  2531. you put in some misc section that you never bother with anyway. You can
  2532. even group the Emacs sex groups as a sub-topic to either the Emacs
  2533. groups or the sex groups---or both! Go wild!
  2534. @iftex
  2535. @iflatex
  2536. \gnusfigure{Group Topics}{400}{
  2537. \put(75,50){\epsfig{figure=tmp/group-topic.ps,height=9cm}}
  2538. }
  2539. @end iflatex
  2540. @end iftex
  2541. Here's an example:
  2542. @example
  2543. Gnus
  2544. Emacs -- I wuw it!
  2545. 3: comp.emacs
  2546. 2: alt.religion.emacs
  2547. Naughty Emacs
  2548. 452: alt.sex.emacs
  2549. 0: comp.talk.emacs.recovery
  2550. Misc
  2551. 8: comp.binaries.fractals
  2552. 13: comp.sources.unix
  2553. @end example
  2554. @findex gnus-topic-mode
  2555. @kindex t @r{(Group)}
  2556. To get this @emph{fab} functionality you simply turn on (ooh!) the
  2557. @code{gnus-topic} minor mode---type @kbd{t} in the group buffer. (This
  2558. is a toggling command.)
  2559. Go ahead, just try it. I'll still be here when you get back. La de
  2560. dum... Nice tune, that... la la la... What, you're back? Yes, and now
  2561. press @kbd{l}. There. All your groups are now listed under
  2562. @samp{misc}. Doesn't that make you feel all warm and fuzzy? Hot and
  2563. bothered?
  2564. If you want this permanently enabled, you should add that minor mode to
  2565. the hook for the group mode:
  2566. @lisp
  2567. (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
  2568. @end lisp
  2569. @menu
  2570. * Topic Variables:: How to customize the topics the Lisp Way.
  2571. * Topic Commands:: Interactive E-Z commands.
  2572. * Topic Sorting:: Sorting each topic individually.
  2573. * Topic Topology:: A map of the world.
  2574. * Topic Parameters:: Parameters that apply to all groups in a topic.
  2575. @end menu
  2576. @node Topic Variables
  2577. @subsection Topic Variables
  2578. @cindex topic variables
  2579. Now, if you select a topic, it will fold/unfold that topic, which is
  2580. really neat, I think.
  2581. @vindex gnus-topic-line-format
  2582. The topic lines themselves are created according to the
  2583. @code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
  2584. Valid elements are:
  2585. @table @samp
  2586. @item i
  2587. Indentation.
  2588. @item n
  2589. Topic name.
  2590. @item v
  2591. Visibility.
  2592. @item l
  2593. Level.
  2594. @item g
  2595. Number of groups in the topic.
  2596. @item a
  2597. Number of unread articles in the topic.
  2598. @item A
  2599. Number of unread articles in the topic and all its subtopics.
  2600. @end table
  2601. @vindex gnus-topic-indent-level
  2602. Each sub-topic (and the groups in the sub-topics) will be indented with
  2603. @code{gnus-topic-indent-level} times the topic level number of spaces.
  2604. The default is 2.
  2605. @vindex gnus-topic-mode-hook
  2606. @code{gnus-topic-mode-hook} is called in topic minor mode buffers.
  2607. @vindex gnus-topic-display-empty-topics
  2608. The @code{gnus-topic-display-empty-topics} says whether to display even
  2609. topics that have no unread articles in them. The default is @code{t}.
  2610. @node Topic Commands
  2611. @subsection Topic Commands
  2612. @cindex topic commands
  2613. When the topic minor mode is turned on, a new @kbd{T} submap will be
  2614. available. In addition, a few of the standard keys change their
  2615. definitions slightly.
  2616. @table @kbd
  2617. @item T n
  2618. @kindex T n (Topic)
  2619. @findex gnus-topic-create-topic
  2620. Prompt for a new topic name and create it
  2621. (@code{gnus-topic-create-topic}).
  2622. @item T m
  2623. @kindex T m (Topic)
  2624. @findex gnus-topic-move-group
  2625. Move the current group to some other topic
  2626. (@code{gnus-topic-move-group}). This command uses the process/prefix
  2627. convention (@pxref{Process/Prefix}).
  2628. @item T j
  2629. @kindex T j (Topic)
  2630. @findex gnus-topic-jump-to-topic
  2631. Go to a topic (@code{gnus-topic-jump-to-topic}).
  2632. @item T c
  2633. @kindex T c (Topic)
  2634. @findex gnus-topic-copy-group
  2635. Copy the current group to some other topic
  2636. (@code{gnus-topic-copy-group}). This command uses the process/prefix
  2637. convention (@pxref{Process/Prefix}).
  2638. @item T h
  2639. @kindex T h (Topic)
  2640. @findex gnus-topic-hide-topic
  2641. Hide the current topic (@code{gnus-topic-hide-topic}). If given
  2642. a prefix, hide the topic permanently.
  2643. @item T s
  2644. @kindex T s (Topic)
  2645. @findex gnus-topic-show-topic
  2646. Show the current topic (@code{gnus-topic-show-topic}). If given
  2647. a prefix, show the topic permanently.
  2648. @item T D
  2649. @kindex T D (Topic)
  2650. @findex gnus-topic-remove-group
  2651. Remove a group from the current topic (@code{gnus-topic-remove-group}).
  2652. This command is mainly useful if you have the same group in several
  2653. topics and wish to remove it from one of the topics. You may also
  2654. remove a group from all topics, but in that case, Gnus will add it to
  2655. the root topic the next time you start Gnus. In fact, all new groups
  2656. (which, naturally, don't belong to any topic) will show up in the root
  2657. topic.
  2658. This command uses the process/prefix convention
  2659. (@pxref{Process/Prefix}).
  2660. @item T M
  2661. @kindex T M (Topic)
  2662. @findex gnus-topic-move-matching
  2663. Move all groups that match some regular expression to a topic
  2664. (@code{gnus-topic-move-matching}).
  2665. @item T C
  2666. @kindex T C (Topic)
  2667. @findex gnus-topic-copy-matching
  2668. Copy all groups that match some regular expression to a topic
  2669. (@code{gnus-topic-copy-matching}).
  2670. @item T H
  2671. @kindex T H (Topic)
  2672. @findex gnus-topic-toggle-display-empty-topics
  2673. Toggle hiding empty topics
  2674. (@code{gnus-topic-toggle-display-empty-topics}).
  2675. @item T #
  2676. @kindex T # (Topic)
  2677. @findex gnus-topic-mark-topic
  2678. Mark all groups in the current topic with the process mark
  2679. (@code{gnus-topic-mark-topic}).
  2680. @item T M-#
  2681. @kindex T M-# (Topic)
  2682. @findex gnus-topic-unmark-topic
  2683. Remove the process mark from all groups in the current topic
  2684. (@code{gnus-topic-unmark-topic}).
  2685. @item T TAB
  2686. @itemx TAB
  2687. @kindex T TAB (Topic)
  2688. @kindex TAB (Topic)
  2689. @findex gnus-topic-indent
  2690. ``Indent'' the current topic so that it becomes a sub-topic of the
  2691. previous topic (@code{gnus-topic-indent}). If given a prefix,
  2692. ``un-indent'' the topic instead.
  2693. @item M-TAB
  2694. @kindex M-TAB (Topic)
  2695. @findex gnus-topic-unindent
  2696. ``Un-indent'' the current topic so that it becomes a sub-topic of the
  2697. parent of its current parent (@code{gnus-topic-unindent}).
  2698. @item @key{RET}
  2699. @kindex @key{RET} (Topic)
  2700. @findex gnus-topic-select-group
  2701. @itemx @key{SPC}
  2702. Either select a group or fold a topic (@code{gnus-topic-select-group}).
  2703. When you perform this command on a group, you'll enter the group, as
  2704. usual. When done on a topic line, the topic will be folded (if it was
  2705. visible) or unfolded (if it was folded already). So it's basically a
  2706. toggling command on topics. In addition, if you give a numerical
  2707. prefix, group on that level (and lower) will be displayed.
  2708. @item C-c C-x
  2709. @kindex C-c C-x (Topic)
  2710. @findex gnus-topic-expire-articles
  2711. Run all expirable articles in the current group or topic through the expiry
  2712. process (if any) (@code{gnus-topic-expire-articles}).
  2713. @item C-k
  2714. @kindex C-k (Topic)
  2715. @findex gnus-topic-kill-group
  2716. Kill a group or topic (@code{gnus-topic-kill-group}). All groups in the
  2717. topic will be removed along with the topic.
  2718. @item C-y
  2719. @kindex C-y (Topic)
  2720. @findex gnus-topic-yank-group
  2721. Yank the previously killed group or topic
  2722. (@code{gnus-topic-yank-group}). Note that all topics will be yanked
  2723. before all groups.
  2724. @item T r
  2725. @kindex T r (Topic)
  2726. @findex gnus-topic-rename
  2727. Rename a topic (@code{gnus-topic-rename}).
  2728. @item T @key{DEL}
  2729. @kindex T @key{DEL} (Topic)
  2730. @findex gnus-topic-delete
  2731. Delete an empty topic (@code{gnus-topic-delete}).
  2732. @item A T
  2733. @kindex A T (Topic)
  2734. @findex gnus-topic-list-active
  2735. List all groups that Gnus knows about in a topics-ified way
  2736. (@code{gnus-topic-list-active}).
  2737. @item G p
  2738. @kindex G p (Topic)
  2739. @findex gnus-topic-edit-parameters
  2740. @cindex group parameters
  2741. @cindex topic parameters
  2742. @cindex parameters
  2743. Edit the topic parameters (@code{gnus-topic-edit-parameters}).
  2744. @xref{Topic Parameters}.
  2745. @end table
  2746. @node Topic Sorting
  2747. @subsection Topic Sorting
  2748. @cindex topic sorting
  2749. You can sort the groups in each topic individually with the following
  2750. commands:
  2751. @table @kbd
  2752. @item T S a
  2753. @kindex T S a (Topic)
  2754. @findex gnus-topic-sort-groups-by-alphabet
  2755. Sort the current topic alphabetically by group name
  2756. (@code{gnus-topic-sort-groups-by-alphabet}).
  2757. @item T S u
  2758. @kindex T S u (Topic)
  2759. @findex gnus-topic-sort-groups-by-unread
  2760. Sort the current topic by the number of unread articles
  2761. (@code{gnus-topic-sort-groups-by-unread}).
  2762. @item T S l
  2763. @kindex T S l (Topic)
  2764. @findex gnus-topic-sort-groups-by-level
  2765. Sort the current topic by group level
  2766. (@code{gnus-topic-sort-groups-by-level}).
  2767. @item T S v
  2768. @kindex T S v (Topic)
  2769. @findex gnus-topic-sort-groups-by-score
  2770. Sort the current topic by group score
  2771. (@code{gnus-topic-sort-groups-by-score}). @xref{Group Score}.
  2772. @item T S r
  2773. @kindex T S r (Topic)
  2774. @findex gnus-topic-sort-groups-by-rank
  2775. Sort the current topic by group rank
  2776. (@code{gnus-topic-sort-groups-by-rank}). @xref{Group Score}.
  2777. @item T S m
  2778. @kindex T S m (Topic)
  2779. @findex gnus-topic-sort-groups-by-method
  2780. Sort the current topic alphabetically by back end name
  2781. (@code{gnus-topic-sort-groups-by-method}).
  2782. @end table
  2783. @xref{Sorting Groups}, for more information about group sorting.
  2784. @node Topic Topology
  2785. @subsection Topic Topology
  2786. @cindex topic topology
  2787. @cindex topology
  2788. So, let's have a look at an example group buffer:
  2789. @example
  2790. Gnus
  2791. Emacs -- I wuw it!
  2792. 3: comp.emacs
  2793. 2: alt.religion.emacs
  2794. Naughty Emacs
  2795. 452: alt.sex.emacs
  2796. 0: comp.talk.emacs.recovery
  2797. Misc
  2798. 8: comp.binaries.fractals
  2799. 13: comp.sources.unix
  2800. @end example
  2801. So, here we have one top-level topic (@samp{Gnus}), two topics under
  2802. that, and one sub-topic under one of the sub-topics. (There is always
  2803. just one (1) top-level topic). This topology can be expressed as
  2804. follows:
  2805. @lisp
  2806. (("Gnus" visible)
  2807. (("Emacs -- I wuw it!" visible)
  2808. (("Naughty Emacs" visible)))
  2809. (("Misc" visible)))
  2810. @end lisp
  2811. @vindex gnus-topic-topology
  2812. This is in fact how the variable @code{gnus-topic-topology} would look
  2813. for the display above. That variable is saved in the @file{.newsrc.eld}
  2814. file, and shouldn't be messed with manually---unless you really want
  2815. to. Since this variable is read from the @file{.newsrc.eld} file,
  2816. setting it in any other startup files will have no effect.
  2817. This topology shows what topics are sub-topics of what topics (right),
  2818. and which topics are visible. Two settings are currently
  2819. allowed---@code{visible} and @code{invisible}.
  2820. @node Topic Parameters
  2821. @subsection Topic Parameters
  2822. @cindex topic parameters
  2823. All groups in a topic will inherit group parameters from the parent (and
  2824. ancestor) topic parameters. All valid group parameters are valid topic
  2825. parameters (@pxref{Group Parameters}).
  2826. In addition, the following parameters are only valid as topic
  2827. parameters:
  2828. @table @code
  2829. @item subscribe
  2830. When subscribing new groups by topic (@pxref{Subscription Methods}), the
  2831. @code{subscribe} topic parameter says what groups go in what topic. Its
  2832. value should be a regexp to match the groups that should go in that
  2833. topic.
  2834. @end table
  2835. Group parameters (of course) override topic parameters, and topic
  2836. parameters in sub-topics override topic parameters in super-topics. You
  2837. know. Normal inheritance rules. (@dfn{Rules} is here a noun, not a
  2838. verb, although you may feel free to disagree with me here.)
  2839. @example
  2840. Gnus
  2841. Emacs
  2842. 3: comp.emacs
  2843. 2: alt.religion.emacs
  2844. 452: alt.sex.emacs
  2845. Relief
  2846. 452: alt.sex.emacs
  2847. 0: comp.talk.emacs.recovery
  2848. Misc
  2849. 8: comp.binaries.fractals
  2850. 13: comp.sources.unix
  2851. 452: alt.sex.emacs
  2852. @end example
  2853. The @samp{Emacs} topic has the topic parameter @code{(score-file
  2854. . "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
  2855. @code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
  2856. topic parameter @code{(score-file . "emacs.SCORE")}. In addition,
  2857. @* @samp{alt.religion.emacs} has the group parameter @code{(score-file
  2858. . "religion.SCORE")}.
  2859. Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
  2860. will get the @file{relief.SCORE} home score file. If you enter the same
  2861. group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
  2862. score file. If you enter the group @samp{alt.religion.emacs}, you'll
  2863. get the @file{religion.SCORE} home score file.
  2864. This seems rather simple and self-evident, doesn't it? Well, yes. But
  2865. there are some problems, especially with the @code{total-expiry}
  2866. parameter. Say you have a mail group in two topics; one with
  2867. @code{total-expiry} and one without. What happens when you do @kbd{M-x
  2868. gnus-expire-all-expirable-groups}? Gnus has no way of telling which one
  2869. of these topics you mean to expire articles from, so anything may
  2870. happen. In fact, I hereby declare that it is @dfn{undefined} what
  2871. happens. You just have to be careful if you do stuff like that.
  2872. @node Misc Group Stuff
  2873. @section Misc Group Stuff
  2874. @menu
  2875. * Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
  2876. * Group Information:: Information and help on groups and Gnus.
  2877. * Group Timestamp:: Making Gnus keep track of when you last read a group.
  2878. * File Commands:: Reading and writing the Gnus files.
  2879. @end menu
  2880. @table @kbd
  2881. @item ^
  2882. @kindex ^ @r{(Group)}
  2883. @findex gnus-group-enter-server-mode
  2884. Enter the server buffer (@code{gnus-group-enter-server-mode}).
  2885. @xref{The Server Buffer}.
  2886. @item a
  2887. @kindex a @r{(Group)}
  2888. @findex gnus-group-post-news
  2889. Post an article to a group (@code{gnus-group-post-news}). If given a
  2890. prefix, the current group name will be used as the default.
  2891. @item m
  2892. @kindex m @r{(Group)}
  2893. @findex gnus-group-mail
  2894. Mail a message somewhere (@code{gnus-group-mail}).
  2895. @end table
  2896. Variables for the group buffer:
  2897. @table @code
  2898. @item gnus-group-mode-hook
  2899. @vindex gnus-group-mode-hook
  2900. is called after the group buffer has been
  2901. created.
  2902. @item gnus-group-prepare-hook
  2903. @vindex gnus-group-prepare-hook
  2904. is called after the group buffer is
  2905. generated. It may be used to modify the buffer in some strange,
  2906. unnatural way.
  2907. @item gnus-group-prepared-hook
  2908. @vindex gnus-group-prepare-hook
  2909. is called as the very last thing after the group buffer has been
  2910. generated. It may be used to move point around, for instance.
  2911. @item gnus-permanently-visible-groups
  2912. @vindex gnus-permanently-visible-groups
  2913. Groups matching this regexp will always be listed in the group buffer,
  2914. whether they are empty or not.
  2915. @item gnus-group-name-charset-method-alist
  2916. @vindex gnus-group-name-charset-method-alist
  2917. An alist of method and the charset for group names. It is used to show
  2918. non-ASCII group names.
  2919. For example:
  2920. @lisp
  2921. (setq gnus-group-name-charset-method-alist
  2922. '(((nntp "news.com.cn") . cn-gb-2312)))
  2923. @end lisp
  2924. @item gnus-group-name-charset-group-alist
  2925. @vindex gnus-group-name-charset-group-alist
  2926. An alist of regexp of group name and the charset for group names.
  2927. It is used to show non-ASCII group names.
  2928. For example:
  2929. @lisp
  2930. (setq gnus-group-name-charset-group-alist
  2931. '(("\\.com\\.cn:" . cn-gb-2312)))
  2932. @end lisp
  2933. @end table
  2934. @node Scanning New Messages
  2935. @subsection Scanning New Messages
  2936. @cindex new messages
  2937. @cindex scanning new news
  2938. @table @kbd
  2939. @item g
  2940. @kindex g @r{(Group)}
  2941. @findex gnus-group-get-new-news
  2942. @c @icon{gnus-group-get-new-news}
  2943. Check the server(s) for new articles. If the numerical prefix is used,
  2944. this command will check only groups of level @var{arg} and lower
  2945. (@code{gnus-group-get-new-news}). If given a non-numerical prefix, this
  2946. command will force a total re-reading of the active file(s) from the
  2947. back end(s).
  2948. @item M-g
  2949. @kindex M-g @r{(Group)}
  2950. @findex gnus-group-get-new-news-this-group
  2951. @vindex gnus-goto-next-group-when-activating
  2952. @c @icon{gnus-group-get-new-news-this-group}
  2953. Check whether new articles have arrived in the current group
  2954. (@code{gnus-group-get-new-news-this-group}).
  2955. @code{gnus-goto-next-group-when-activating} says whether this command is
  2956. to move point to the next group or not. It is @code{t} by default.
  2957. @findex gnus-activate-all-groups
  2958. @cindex activating groups
  2959. @item C-c M-g
  2960. @kindex C-c M-g @r{(Group)}
  2961. Activate absolutely all groups (@code{gnus-activate-all-groups}).
  2962. @item R
  2963. @kindex R @r{(Group)}
  2964. @cindex restarting
  2965. @findex gnus-group-restart
  2966. Restart Gnus (@code{gnus-group-restart}). This saves the @file{.newsrc}
  2967. file(s), closes the connection to all servers, clears up all run-time
  2968. Gnus variables, and then starts Gnus all over again.
  2969. @end table
  2970. @vindex gnus-get-new-news-hook
  2971. @code{gnus-get-new-news-hook} is run just before checking for new news.
  2972. @vindex gnus-after-getting-new-news-hook
  2973. @code{gnus-after-getting-new-news-hook} is run after checking for new
  2974. news.
  2975. @node Group Information
  2976. @subsection Group Information
  2977. @cindex group information
  2978. @cindex information on groups
  2979. @table @kbd
  2980. @item H f
  2981. @kindex H f @r{(Group)}
  2982. @findex gnus-group-fetch-faq
  2983. @vindex gnus-group-faq-directory
  2984. @cindex FAQ
  2985. @cindex ange-ftp
  2986. Try to fetch the FAQ for the current group
  2987. (@code{gnus-group-fetch-faq}). Gnus will try to get the FAQ from
  2988. @code{gnus-group-faq-directory}, which is usually a directory on a
  2989. remote machine. This variable can also be a list of directories. In
  2990. that case, giving a prefix to this command will allow you to choose
  2991. between the various sites. @code{ange-ftp} (or @code{efs}) will be used
  2992. for fetching the file.
  2993. If fetching from the first site is unsuccessful, Gnus will attempt to go
  2994. through @code{gnus-group-faq-directory} and try to open them one by one.
  2995. @item H d
  2996. @itemx C-c C-d
  2997. @c @icon{gnus-group-describe-group}
  2998. @kindex H d @r{(Group)}
  2999. @kindex C-c C-d @r{(Group)}
  3000. @cindex describing groups
  3001. @cindex group description
  3002. @findex gnus-group-describe-group
  3003. Describe the current group (@code{gnus-group-describe-group}). If given
  3004. a prefix, force Gnus to re-read the description from the server.
  3005. @item M-d
  3006. @kindex M-d @r{(Group)}
  3007. @findex gnus-group-describe-all-groups
  3008. Describe all groups (@code{gnus-group-describe-all-groups}). If given a
  3009. prefix, force Gnus to re-read the description file from the server.
  3010. @item H v
  3011. @itemx V
  3012. @kindex V @r{(Group)}
  3013. @kindex H v @r{(Group)}
  3014. @cindex version
  3015. @findex gnus-version
  3016. Display current Gnus version numbers (@code{gnus-version}).
  3017. @item ?
  3018. @kindex ? @r{(Group)}
  3019. @findex gnus-group-describe-briefly
  3020. Give a very short help message (@code{gnus-group-describe-briefly}).
  3021. @item C-c C-i
  3022. @kindex C-c C-i @r{(Group)}
  3023. @cindex info
  3024. @cindex manual
  3025. @findex gnus-info-find-node
  3026. Go to the Gnus info node (@code{gnus-info-find-node}).
  3027. @end table
  3028. @node Group Timestamp
  3029. @subsection Group Timestamp
  3030. @cindex timestamps
  3031. @cindex group timestamps
  3032. It can be convenient to let Gnus keep track of when you last read a
  3033. group. To set the ball rolling, you should add
  3034. @code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
  3035. @lisp
  3036. (add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
  3037. @end lisp
  3038. After doing this, each time you enter a group, it'll be recorded.
  3039. This information can be displayed in various ways---the easiest is to
  3040. use the @samp{%d} spec in the group line format:
  3041. @lisp
  3042. (setq gnus-group-line-format
  3043. "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
  3044. @end lisp
  3045. This will result in lines looking like:
  3046. @example
  3047. * 0: mail.ding 19961002T012943
  3048. 0: custom 19961002T012713
  3049. @end example
  3050. As you can see, the date is displayed in compact ISO 8601 format. This
  3051. may be a bit too much, so to just display the date, you could say
  3052. something like:
  3053. @lisp
  3054. (setq gnus-group-line-format
  3055. "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
  3056. @end lisp
  3057. @node File Commands
  3058. @subsection File Commands
  3059. @cindex file commands
  3060. @table @kbd
  3061. @item r
  3062. @kindex r @r{(Group)}
  3063. @findex gnus-group-read-init-file
  3064. @vindex gnus-init-file
  3065. @cindex reading init file
  3066. Re-read the init file (@code{gnus-init-file}, which defaults to
  3067. @file{~/.gnus}) (@code{gnus-group-read-init-file}).
  3068. @item s
  3069. @kindex s @r{(Group)}
  3070. @findex gnus-group-save-newsrc
  3071. @cindex saving .newsrc
  3072. Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
  3073. (@code{gnus-group-save-newsrc}). If given a prefix, force saving the
  3074. file(s) whether Gnus thinks it is necessary or not.
  3075. @c @item Z
  3076. @c @kindex Z @r{(Group)}
  3077. @c @findex gnus-group-clear-dribble
  3078. @c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
  3079. @end table
  3080. @node The Summary Buffer
  3081. @chapter The Summary Buffer
  3082. @cindex summary buffer
  3083. A line for each article is displayed in the summary buffer. You can
  3084. move around, read articles, post articles and reply to articles.
  3085. The most common way to a summary buffer is to select a group from the
  3086. group buffer (@pxref{Selecting a Group}).
  3087. You can have as many summary buffers open as you wish.
  3088. @menu
  3089. * Summary Buffer Format:: Deciding how the summary buffer is to look.
  3090. * Summary Maneuvering:: Moving around the summary buffer.
  3091. * Choosing Articles:: Reading articles.
  3092. * Paging the Article:: Scrolling the current article.
  3093. * Reply Followup and Post:: Posting articles.
  3094. * Marking Articles:: Marking articles as read, expirable, etc.
  3095. * Limiting:: You can limit the summary buffer.
  3096. * Threading:: How threads are made.
  3097. * Sorting:: How articles and threads are sorted.
  3098. * Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
  3099. * Article Caching:: You may store articles in a cache.
  3100. * Persistent Articles:: Making articles expiry-resistant.
  3101. * Article Backlog:: Having already read articles hang around.
  3102. * Saving Articles:: Ways of customizing article saving.
  3103. * Decoding Articles:: Gnus can treat series of (uu)encoded articles.
  3104. * Article Treatment:: The article buffer can be mangled at will.
  3105. * MIME Commands:: Doing MIMEy things with the articles.
  3106. * Charsets:: Character set issues.
  3107. * Article Commands:: Doing various things with the article buffer.
  3108. * Summary Sorting:: Sorting the summary buffer in various ways.
  3109. * Finding the Parent:: No child support? Get the parent.
  3110. * Alternative Approaches:: Reading using non-default summaries.
  3111. * Tree Display:: A more visual display of threads.
  3112. * Mail Group Commands:: Some commands can only be used in mail groups.
  3113. * Various Summary Stuff:: What didn't fit anywhere else.
  3114. * Exiting the Summary Buffer:: Returning to the Group buffer,
  3115. or reselecting the current group.
  3116. * Crosspost Handling:: How crossposted articles are dealt with.
  3117. * Duplicate Suppression:: An alternative when crosspost handling fails.
  3118. @end menu
  3119. @node Summary Buffer Format
  3120. @section Summary Buffer Format
  3121. @cindex summary buffer format
  3122. @iftex
  3123. @iflatex
  3124. \gnusfigure{The Summary Buffer}{180}{
  3125. \put(0,0){\epsfig{figure=tmp/summary.ps,width=7.5cm}}
  3126. \put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-article.ps,width=7.5cm}}}
  3127. }
  3128. @end iflatex
  3129. @end iftex
  3130. @menu
  3131. * Summary Buffer Lines:: You can specify how summary lines should look.
  3132. * To From Newsgroups:: How to not display your own name.
  3133. * Summary Buffer Mode Line:: You can say how the mode line should look.
  3134. * Summary Highlighting:: Making the summary buffer all pretty and nice.
  3135. @end menu
  3136. @findex mail-extract-address-components
  3137. @findex gnus-extract-address-components
  3138. @vindex gnus-extract-address-components
  3139. Gnus will use the value of the @code{gnus-extract-address-components}
  3140. variable as a function for getting the name and address parts of a
  3141. @code{From} header. Two pre-defined functions exist:
  3142. @code{gnus-extract-address-components}, which is the default, quite
  3143. fast, and too simplistic solution; and
  3144. @code{mail-extract-address-components}, which works very nicely, but is
  3145. slower. The default function will return the wrong answer in 5% of the
  3146. cases. If this is unacceptable to you, use the other function instead:
  3147. @lisp
  3148. (setq gnus-extract-address-components
  3149. 'mail-extract-address-components)
  3150. @end lisp
  3151. @vindex gnus-summary-same-subject
  3152. @code{gnus-summary-same-subject} is a string indicating that the current
  3153. article has the same subject as the previous. This string will be used
  3154. with those specs that require it. The default is @code{""}.
  3155. @node Summary Buffer Lines
  3156. @subsection Summary Buffer Lines
  3157. @vindex gnus-summary-line-format
  3158. You can change the format of the lines in the summary buffer by changing
  3159. the @code{gnus-summary-line-format} variable. It works along the same
  3160. lines as a normal @code{format} string, with some extensions
  3161. (@pxref{Formatting Variables}).
  3162. The default string is @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n}.
  3163. The following format specification characters are understood:
  3164. @table @samp
  3165. @item N
  3166. Article number.
  3167. @item S
  3168. Subject string. List identifiers stripped,
  3169. @code{gnus-list-identifies}. @xref{Article Hiding}.
  3170. @item s
  3171. Subject if the article is the root of the thread or the previous article
  3172. had a different subject, @code{gnus-summary-same-subject} otherwise.
  3173. (@code{gnus-summary-same-subject} defaults to @code{""}.)
  3174. @item F
  3175. Full @code{From} header.
  3176. @item n
  3177. The name (from the @code{From} header).
  3178. @item f
  3179. The name, code @code{To} header or the @code{Newsgroups} header
  3180. (@pxref{To From Newsgroups}).
  3181. @item a
  3182. The name (from the @code{From} header). This differs from the @code{n}
  3183. spec in that it uses the function designated by the
  3184. @code{gnus-extract-address-components} variable, which is slower, but
  3185. may be more thorough.
  3186. @item A
  3187. The address (from the @code{From} header). This works the same way as
  3188. the @code{a} spec.
  3189. @item L
  3190. Number of lines in the article.
  3191. @item c
  3192. Number of characters in the article. This specifier is not supported in some
  3193. methods (like nnfolder).
  3194. @item I
  3195. Indentation based on thread level (@pxref{Customizing Threading}).
  3196. @item T
  3197. Nothing if the article is a root and lots of spaces if it isn't (it
  3198. pushes everything after it off the screen).
  3199. @item [
  3200. Opening bracket, which is normally @samp{[}, but can also be @samp{<}
  3201. for adopted articles (@pxref{Customizing Threading}).
  3202. @item ]
  3203. Closing bracket, which is normally @samp{]}, but can also be @samp{>}
  3204. for adopted articles.
  3205. @item >
  3206. One space for each thread level.
  3207. @item <
  3208. Twenty minus thread level spaces.
  3209. @item U
  3210. Unread.
  3211. @item R
  3212. This misleadingly named specifier is the @dfn{secondary mark}. This
  3213. mark will say whether the article has been replied to, has been cached,
  3214. or has been saved.
  3215. @item i
  3216. Score as a number (@pxref{Scoring}).
  3217. @item z
  3218. @vindex gnus-summary-zcore-fuzz
  3219. Zcore, @samp{+} if above the default level and @samp{-} if below the
  3220. default level. If the difference between
  3221. @code{gnus-summary-default-score} and the score is less than
  3222. @code{gnus-summary-zcore-fuzz}, this spec will not be used.
  3223. @item V
  3224. Total thread score.
  3225. @item x
  3226. @code{Xref}.
  3227. @item D
  3228. @code{Date}.
  3229. @item d
  3230. The @code{Date} in @code{DD-MMM} format.
  3231. @item o
  3232. The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.
  3233. @item M
  3234. @code{Message-ID}.
  3235. @item r
  3236. @code{References}.
  3237. @item t
  3238. Number of articles in the current sub-thread. Using this spec will slow
  3239. down summary buffer generation somewhat.
  3240. @item e
  3241. An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
  3242. article has any children.
  3243. @item P
  3244. The line number.
  3245. @item O
  3246. Download mark.
  3247. @item u
  3248. User defined specifier. The next character in the format string should
  3249. be a letter. Gnus will call the function
  3250. @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
  3251. following @samp{%u}. The function will be passed the current header as
  3252. argument. The function should return a string, which will be inserted
  3253. into the summary just like information from any other summary specifier.
  3254. @end table
  3255. The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
  3256. have to be handled with care. For reasons of efficiency, Gnus will
  3257. compute what column these characters will end up in, and ``hard-code''
  3258. that. This means that it is invalid to have these specs after a
  3259. variable-length spec. Well, you might not be arrested, but your summary
  3260. buffer will look strange, which is bad enough.
  3261. The smart choice is to have these specs as far to the left as possible.
  3262. (Isn't that the case with everything, though? But I digress.)
  3263. This restriction may disappear in later versions of Gnus.
  3264. @node To From Newsgroups
  3265. @subsection To From Newsgroups
  3266. @cindex To
  3267. @cindex Newsgroups
  3268. In some groups (particularly in archive groups), the @code{From} header
  3269. isn't very interesting, since all the articles there are written by
  3270. you. To display the information in the @code{To} or @code{Newsgroups}
  3271. headers instead, you need to decide three things: What information to
  3272. gather; where to display it; and when to display it.
  3273. @enumerate
  3274. @item
  3275. @vindex gnus-extra-headers
  3276. The reading of extra header information is controlled by the
  3277. @code{gnus-extra-headers}. This is a list of header symbols. For
  3278. instance:
  3279. @lisp
  3280. (setq gnus-extra-headers
  3281. '(To Newsgroups X-Newsreader))
  3282. @end lisp
  3283. This will result in Gnus trying to obtain these three headers, and
  3284. storing it in header structures for later easy retrieval.
  3285. @item
  3286. @findex gnus-extra-header
  3287. The value of these extra headers can be accessed via the
  3288. @code{gnus-extra-header} function. Here's a format line spec that will
  3289. access the @code{X-Newsreader} header:
  3290. @example
  3291. "%~(form (gnus-extra-header 'X-Newsreader))@@"
  3292. @end example
  3293. @item
  3294. @vindex gnus-ignored-from-addresses
  3295. The @code{gnus-ignored-from-addresses} variable says when the @samp{%f}
  3296. summary line spec returns the @code{To}, @code{Newsreader} or
  3297. @code{From} header. If this regexp matches the contents of the
  3298. @code{From} header, the value of the @code{To} or @code{Newsreader}
  3299. headers are used instead.
  3300. @end enumerate
  3301. @vindex nnmail-extra-headers
  3302. A related variable is @code{nnmail-extra-headers}, which controls when
  3303. to include extra headers when generating overview (@sc{nov}) files. If
  3304. you have old overview files, you should regenerate them after changing
  3305. this variable.
  3306. @vindex gnus-summary-line-format
  3307. You also have to instruct Gnus to display the data by changing the
  3308. @code{%n} spec to the @code{%f} spec in the
  3309. @code{gnus-summary-line-format} variable.
  3310. In summary, you'd typically do something like the following:
  3311. @lisp
  3312. (setq gnus-extra-headers
  3313. '(To Newsgroups))
  3314. (setq nnmail-extra-headers gnus-extra-headers)
  3315. (setq gnus-summary-line-format
  3316. "%U%R%z%I%(%[%4L: %-20,20f%]%) %s\n")
  3317. (setq gnus-ignored-from-addresses
  3318. "Your Name Here")
  3319. @end lisp
  3320. Now, this is mostly useful for mail groups, where you have control over
  3321. the @sc{nov} files that are created. However, if you can persuade your
  3322. nntp admin to add:
  3323. @example
  3324. Newsgroups:full
  3325. @end example
  3326. to the end of her @file{overview.fmt} file, then you can use that just
  3327. as you would the extra headers from the mail groups.
  3328. @node Summary Buffer Mode Line
  3329. @subsection Summary Buffer Mode Line
  3330. @vindex gnus-summary-mode-line-format
  3331. You can also change the format of the summary mode bar (@pxref{Mode Line
  3332. Formatting}). Set @code{gnus-summary-mode-line-format} to whatever you
  3333. like. The default is @samp{Gnus: %%b [%A] %Z}.
  3334. Here are the elements you can play with:
  3335. @table @samp
  3336. @item G
  3337. Group name.
  3338. @item p
  3339. Unprefixed group name.
  3340. @item A
  3341. Current article number.
  3342. @item z
  3343. Current article score.
  3344. @item V
  3345. Gnus version.
  3346. @item U
  3347. Number of unread articles in this group.
  3348. @item e
  3349. Number of unread articles in this group that aren't displayed in the
  3350. summary buffer.
  3351. @item Z
  3352. A string with the number of unread and unselected articles represented
  3353. either as @samp{<%U(+%e) more>} if there are both unread and unselected
  3354. articles, and just as @samp{<%U more>} if there are just unread articles
  3355. and no unselected ones.
  3356. @item g
  3357. Shortish group name. For instance, @samp{rec.arts.anime} will be
  3358. shortened to @samp{r.a.anime}.
  3359. @item S
  3360. Subject of the current article.
  3361. @item u
  3362. User-defined spec (@pxref{User-Defined Specs}).
  3363. @item s
  3364. Name of the current score file (@pxref{Scoring}).
  3365. @item d
  3366. Number of dormant articles (@pxref{Unread Articles}).
  3367. @item t
  3368. Number of ticked articles (@pxref{Unread Articles}).
  3369. @item r
  3370. Number of articles that have been marked as read in this session.
  3371. @item E
  3372. Number of articles expunged by the score files.
  3373. @end table
  3374. @node Summary Highlighting
  3375. @subsection Summary Highlighting
  3376. @table @code
  3377. @item gnus-visual-mark-article-hook
  3378. @vindex gnus-visual-mark-article-hook
  3379. This hook is run after selecting an article. It is meant to be used for
  3380. highlighting the article in some way. It is not run if
  3381. @code{gnus-visual} is @code{nil}.
  3382. @item gnus-summary-update-hook
  3383. @vindex gnus-summary-update-hook
  3384. This hook is called when a summary line is changed. It is not run if
  3385. @code{gnus-visual} is @code{nil}.
  3386. @item gnus-summary-selected-face
  3387. @vindex gnus-summary-selected-face
  3388. This is the face (or @dfn{font} as some people call it) used to
  3389. highlight the current article in the summary buffer.
  3390. @item gnus-summary-highlight
  3391. @vindex gnus-summary-highlight
  3392. Summary lines are highlighted according to this variable, which is a
  3393. list where the elements are of the format @code{(@var{form}
  3394. . @var{face})}. If you would, for instance, like ticked articles to be
  3395. italic and high-scored articles to be bold, you could set this variable
  3396. to something like
  3397. @lisp
  3398. (((eq mark gnus-ticked-mark) . italic)
  3399. ((> score default) . bold))
  3400. @end lisp
  3401. As you may have guessed, if @var{form} returns a non-@code{nil} value,
  3402. @var{face} will be applied to the line.
  3403. @end table
  3404. @node Summary Maneuvering
  3405. @section Summary Maneuvering
  3406. @cindex summary movement
  3407. All the straight movement commands understand the numeric prefix and
  3408. behave pretty much as you'd expect.
  3409. None of these commands select articles.
  3410. @table @kbd
  3411. @item G M-n
  3412. @itemx M-n
  3413. @kindex M-n @r{(Summary)}
  3414. @kindex G M-n @r{(Summary)}
  3415. @findex gnus-summary-next-unread-subject
  3416. Go to the next summary line of an unread article
  3417. (@code{gnus-summary-next-unread-subject}).
  3418. @item G M-p
  3419. @itemx M-p
  3420. @kindex M-p @r{(Summary)}
  3421. @kindex G M-p @r{(Summary)}
  3422. @findex gnus-summary-prev-unread-subject
  3423. Go to the previous summary line of an unread article
  3424. (@code{gnus-summary-prev-unread-subject}).
  3425. @item G g
  3426. @kindex G g @r{(Summary)}
  3427. @findex gnus-summary-goto-subject
  3428. Ask for an article number and then go to the summary line of that article
  3429. without displaying the article (@code{gnus-summary-goto-subject}).
  3430. @end table
  3431. If Gnus asks you to press a key to confirm going to the next group, you
  3432. can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
  3433. buffer, searching for the next group to read without actually returning
  3434. to the group buffer.
  3435. Variables related to summary movement:
  3436. @table @code
  3437. @vindex gnus-auto-select-next
  3438. @item gnus-auto-select-next
  3439. If you issue one of the movement commands (like @kbd{n}) and there are
  3440. no more unread articles after the current one, Gnus will offer to go to
  3441. the next group. If this variable is @code{t} and the next group is
  3442. empty, Gnus will exit summary mode and return to the group buffer. If
  3443. this variable is neither @code{t} nor @code{nil}, Gnus will select the
  3444. next group, no matter whether it has any unread articles or not. As a
  3445. special case, if this variable is @code{quietly}, Gnus will select the
  3446. next group without asking for confirmation. If this variable is
  3447. @code{almost-quietly}, the same will happen only if you are located on
  3448. the last article in the group. Finally, if this variable is
  3449. @code{slightly-quietly}, the @kbd{Z n} command will go to the next group
  3450. without confirmation. Also @pxref{Group Levels}.
  3451. @item gnus-auto-select-same
  3452. @vindex gnus-auto-select-same
  3453. If non-@code{nil}, all the movement commands will try to go to the next
  3454. article with the same subject as the current. (@dfn{Same} here might
  3455. mean @dfn{roughly equal}. See @code{gnus-summary-gather-subject-limit}
  3456. for details (@pxref{Customizing Threading}).) If there are no more
  3457. articles with the same subject, go to the first unread article.
  3458. This variable is not particularly useful if you use a threaded display.
  3459. @item gnus-summary-check-current
  3460. @vindex gnus-summary-check-current
  3461. If non-@code{nil}, all the ``unread'' movement commands will not proceed
  3462. to the next (or previous) article if the current article is unread.
  3463. Instead, they will choose the current article.
  3464. @item gnus-auto-center-summary
  3465. @vindex gnus-auto-center-summary
  3466. If non-@code{nil}, Gnus will keep the point in the summary buffer
  3467. centered at all times. This makes things quite tidy, but if you have a
  3468. slow network connection, or simply do not like this un-Emacsism, you can
  3469. set this variable to @code{nil} to get the normal Emacs scrolling
  3470. action. This will also inhibit horizontal re-centering of the summary
  3471. buffer, which might make it more inconvenient to read extremely long
  3472. threads.
  3473. This variable can also be a number. In that case, center the window at
  3474. the given number of lines from the top.
  3475. @end table
  3476. @node Choosing Articles
  3477. @section Choosing Articles
  3478. @cindex selecting articles
  3479. @menu
  3480. * Choosing Commands:: Commands for choosing articles.
  3481. * Choosing Variables:: Variables that influence these commands.
  3482. @end menu
  3483. @node Choosing Commands
  3484. @subsection Choosing Commands
  3485. None of the following movement commands understand the numeric prefix,
  3486. and they all select and display an article.
  3487. If you want to fetch new articles or redisplay the group, see
  3488. @ref{Exiting the Summary Buffer}.
  3489. @table @kbd
  3490. @item @key{SPC}
  3491. @kindex @key{SPC} @r{(Summary)}
  3492. @findex gnus-summary-next-page
  3493. Select the current article, or, if that one's read already, the next
  3494. unread article (@code{gnus-summary-next-page}).
  3495. @item G n
  3496. @itemx n
  3497. @kindex n @r{(Summary)}
  3498. @kindex G n @r{(Summary)}
  3499. @findex gnus-summary-next-unread-article
  3500. @c @icon{gnus-summary-next-unread}
  3501. Go to next unread article (@code{gnus-summary-next-unread-article}).
  3502. @item G p
  3503. @itemx p
  3504. @kindex p @r{(Summary)}
  3505. @findex gnus-summary-prev-unread-article
  3506. @c @icon{gnus-summary-prev-unread}
  3507. Go to previous unread article (@code{gnus-summary-prev-unread-article}).
  3508. @item G N
  3509. @itemx N
  3510. @kindex N @r{(Summary)}
  3511. @kindex G N @r{(Summary)}
  3512. @findex gnus-summary-next-article
  3513. Go to the next article (@code{gnus-summary-next-article}).
  3514. @item G P
  3515. @itemx P
  3516. @kindex P @r{(Summary)}
  3517. @kindex G P @r{(Summary)}
  3518. @findex gnus-summary-prev-article
  3519. Go to the previous article (@code{gnus-summary-prev-article}).
  3520. @item G C-n
  3521. @kindex G C-n @r{(Summary)}
  3522. @findex gnus-summary-next-same-subject
  3523. Go to the next article with the same subject
  3524. (@code{gnus-summary-next-same-subject}).
  3525. @item G C-p
  3526. @kindex G C-p @r{(Summary)}
  3527. @findex gnus-summary-prev-same-subject
  3528. Go to the previous article with the same subject
  3529. (@code{gnus-summary-prev-same-subject}).
  3530. @item G f
  3531. @itemx .
  3532. @kindex G f @r{(Summary)}
  3533. @kindex . @r{(Summary)}
  3534. @findex gnus-summary-first-unread-article
  3535. Go to the first unread article
  3536. (@code{gnus-summary-first-unread-article}).
  3537. @item G b
  3538. @itemx ,
  3539. @kindex G b @r{(Summary)}
  3540. @kindex , @r{(Summary)}
  3541. @findex gnus-summary-best-unread-article
  3542. Go to the article with the highest score
  3543. (@code{gnus-summary-best-unread-article}).
  3544. @item G l
  3545. @itemx l
  3546. @kindex l @r{(Summary)}
  3547. @kindex G l @r{(Summary)}
  3548. @findex gnus-summary-goto-last-article
  3549. Go to the previous article read (@code{gnus-summary-goto-last-article}).
  3550. @item G o
  3551. @kindex G o @r{(Summary)}
  3552. @findex gnus-summary-pop-article
  3553. @cindex history
  3554. @cindex article history
  3555. Pop an article off the summary history and go to this article
  3556. (@code{gnus-summary-pop-article}). This command differs from the
  3557. command above in that you can pop as many previous articles off the
  3558. history as you like, while @kbd{l} toggles the two last read articles.
  3559. For a somewhat related issue (if you use these commands a lot),
  3560. @pxref{Article Backlog}.
  3561. @item G j
  3562. @itemx j
  3563. @kindex j @r{(Summary)}
  3564. @kindex G j @r{(Summary)}
  3565. @findex gnus-summary-goto-article
  3566. Ask for an article number or @code{Message-ID}, and then go to that
  3567. article (@code{gnus-summary-goto-article}).
  3568. @end table
  3569. @node Choosing Variables
  3570. @subsection Choosing Variables
  3571. Some variables relevant for moving and selecting articles:
  3572. @table @code
  3573. @item gnus-auto-extend-newsgroup
  3574. @vindex gnus-auto-extend-newsgroup
  3575. All the movement commands will try to go to the previous (or next)
  3576. article, even if that article isn't displayed in the Summary buffer if
  3577. this variable is non-@code{nil}. Gnus will then fetch the article from
  3578. the server and display it in the article buffer.
  3579. @item gnus-select-article-hook
  3580. @vindex gnus-select-article-hook
  3581. This hook is called whenever an article is selected. By default it
  3582. exposes any threads hidden under the selected article.
  3583. @item gnus-mark-article-hook
  3584. @vindex gnus-mark-article-hook
  3585. @findex gnus-summary-mark-unread-as-read
  3586. @findex gnus-summary-mark-read-and-unread-as-read
  3587. @findex gnus-unread-mark
  3588. This hook is called whenever an article is selected. It is intended to
  3589. be used for marking articles as read. The default value is
  3590. @code{gnus-summary-mark-read-and-unread-as-read}, and will change the
  3591. mark of almost any article you read to @code{gnus-unread-mark}. The
  3592. only articles not affected by this function are ticked, dormant, and
  3593. expirable articles. If you'd instead like to just have unread articles
  3594. marked as read, you can use @code{gnus-summary-mark-unread-as-read}
  3595. instead. It will leave marks like @code{gnus-low-score-mark},
  3596. @code{gnus-del-mark} (and so on) alone.
  3597. @end table
  3598. @node Paging the Article
  3599. @section Scrolling the Article
  3600. @cindex article scrolling
  3601. @table @kbd
  3602. @item @key{SPC}
  3603. @kindex @key{SPC} @r{(Summary)}
  3604. @findex gnus-summary-next-page
  3605. Pressing @key{SPC} will scroll the current article forward one page,
  3606. or, if you have come to the end of the current article, will choose the
  3607. next article (@code{gnus-summary-next-page}).
  3608. @item @key{DEL}
  3609. @kindex @key{DEL} @r{(Summary)}
  3610. @findex gnus-summary-prev-page
  3611. Scroll the current article back one page (@code{gnus-summary-prev-page}).
  3612. @item @key{RET}
  3613. @kindex @key{RET} @r{(Summary)}
  3614. @findex gnus-summary-scroll-up
  3615. Scroll the current article one line forward
  3616. (@code{gnus-summary-scroll-up}).
  3617. @item M-@key{RET}
  3618. @kindex M-@key{RET} @r{(Summary)}
  3619. @findex gnus-summary-scroll-down
  3620. Scroll the current article one line backward
  3621. (@code{gnus-summary-scroll-down}).
  3622. @item A g
  3623. @itemx g
  3624. @kindex A g @r{(Summary)}
  3625. @kindex g @r{(Summary)}
  3626. @findex gnus-summary-show-article
  3627. @vindex gnus-summary-show-article-charset-alist
  3628. (Re)fetch the current article (@code{gnus-summary-show-article}). If
  3629. given a prefix, fetch the current article, but don't run any of the
  3630. article treatment functions. This will give you a ``raw'' article, just
  3631. the way it came from the server.
  3632. If given a numerical prefix, you can do semi-manual charset stuff.
  3633. @kbd{C-u 0 g cn-gb-2312 @key{RET}} will decode the message as if it were
  3634. encoded in the @code{cn-gb-2312} charset. If you have
  3635. @lisp
  3636. (setq gnus-summary-show-article-charset-alist
  3637. '((1 . cn-gb-2312)
  3638. (2 . big5)))
  3639. @end lisp
  3640. then you can say @kbd{C-u 1 g} to get the same effect.
  3641. @item A <
  3642. @itemx <
  3643. @kindex < @r{(Summary)}
  3644. @kindex A < @r{(Summary)}
  3645. @findex gnus-summary-beginning-of-article
  3646. Scroll to the beginning of the article
  3647. (@code{gnus-summary-beginning-of-article}).
  3648. @item A >
  3649. @itemx >
  3650. @kindex > @r{(Summary)}
  3651. @kindex A > @r{(Summary)}
  3652. @findex gnus-summary-end-of-article
  3653. Scroll to the end of the article (@code{gnus-summary-end-of-article}).
  3654. @item A s
  3655. @itemx s
  3656. @kindex A s @r{(Summary)}
  3657. @kindex s @r{(Summary)}
  3658. @findex gnus-summary-isearch-article
  3659. Perform an isearch in the article buffer
  3660. (@code{gnus-summary-isearch-article}).
  3661. @item h
  3662. @kindex h @r{(Summary)}
  3663. @findex gnus-summary-select-article-buffer
  3664. Select the article buffer (@code{gnus-summary-select-article-buffer}).
  3665. @end table
  3666. @node Reply Followup and Post
  3667. @section Reply, Followup and Post
  3668. @menu
  3669. * Summary Mail Commands:: Sending mail.
  3670. * Summary Post Commands:: Sending news.
  3671. * Summary Message Commands:: Other Message-related commands.
  3672. * Canceling and Superseding:: ``Whoops, I shouldn't have called him that.''
  3673. @end menu
  3674. @node Summary Mail Commands
  3675. @subsection Summary Mail Commands
  3676. @cindex mail
  3677. @cindex composing mail
  3678. Commands for composing a mail message:
  3679. @table @kbd
  3680. @item S r
  3681. @itemx r
  3682. @kindex S r @r{(Summary)}
  3683. @kindex r @r{(Summary)}
  3684. @findex gnus-summary-reply
  3685. @c @icon{gnus-summary-mail-reply}
  3686. @c @icon{gnus-summary-reply}
  3687. Mail a reply to the author of the current article
  3688. (@code{gnus-summary-reply}).
  3689. @item S R
  3690. @itemx R
  3691. @kindex R @r{(Summary)}
  3692. @kindex S R @r{(Summary)}
  3693. @findex gnus-summary-reply-with-original
  3694. @c @icon{gnus-summary-reply-with-original}
  3695. Mail a reply to the author of the current article and include the
  3696. original message (@code{gnus-summary-reply-with-original}). This
  3697. command uses the process/prefix convention.
  3698. @item S w
  3699. @kindex S w @r{(Summary)}
  3700. @findex gnus-summary-wide-reply
  3701. Mail a wide reply to the author of the current article
  3702. (@code{gnus-summary-wide-reply}). A @dfn{wide reply} is a reply that
  3703. goes out to all people listed in the @code{To}, @code{From} (or
  3704. @code{Reply-to}) and @code{Cc} headers.
  3705. @item S W
  3706. @kindex S W @r{(Summary)}
  3707. @findex gnus-summary-wide-reply-with-original
  3708. Mail a wide reply to the current article and include the original
  3709. message (@code{gnus-summary-wide-reply-with-original}). This command uses
  3710. the process/prefix convention.
  3711. @item S o m
  3712. @itemx C-c C-f
  3713. @kindex S o m @r{(Summary)}
  3714. @kindex C-c C-f @r{(Summary)}
  3715. @findex gnus-summary-mail-forward
  3716. @c @icon{gnus-summary-mail-forward}
  3717. Forward the current article to some other person
  3718. (@code{gnus-summary-mail-forward}). If no prefix is given, the message
  3719. is forwarded according to the value of (@code{message-forward-as-mime})
  3720. and (@code{message-forward-show-mml}); if the prefix is 1, decode the
  3721. message and forward directly inline; if the prefix is 2, forward message
  3722. as an rfc822 MIME section; if the prefix is 3, decode message and
  3723. forward as an rfc822 MIME section; if the prefix is 4, forward message
  3724. directly inline; otherwise, the message is forwarded as no prefix given
  3725. but use the flipped value of (@code{message-forward-as-mime}). By
  3726. default, the message is decoded and forwarded as an rfc822 MIME section.
  3727. @item S m
  3728. @itemx m
  3729. @kindex m @r{(Summary)}
  3730. @kindex S m @r{(Summary)}
  3731. @findex gnus-summary-mail-other-window
  3732. @c @icon{gnus-summary-mail-originate}
  3733. Send a mail to some other person
  3734. (@code{gnus-summary-mail-other-window}).
  3735. @item S D b
  3736. @kindex S D b @r{(Summary)}
  3737. @findex gnus-summary-resend-bounced-mail
  3738. @cindex bouncing mail
  3739. If you have sent a mail, but the mail was bounced back to you for some
  3740. reason (wrong address, transient failure), you can use this command to
  3741. resend that bounced mail (@code{gnus-summary-resend-bounced-mail}). You
  3742. will be popped into a mail buffer where you can edit the headers before
  3743. sending the mail off again. If you give a prefix to this command, and
  3744. the bounced mail is a reply to some other mail, Gnus will try to fetch
  3745. that mail and display it for easy perusal of its headers. This might
  3746. very well fail, though.
  3747. @item S D r
  3748. @kindex S D r @r{(Summary)}
  3749. @findex gnus-summary-resend-message
  3750. Not to be confused with the previous command,
  3751. @code{gnus-summary-resend-message} will prompt you for an address to
  3752. send the current message off to, and then send it to that place. The
  3753. headers of the message won't be altered---but lots of headers that say
  3754. @code{Resent-To}, @code{Resent-From} and so on will be added. This
  3755. means that you actually send a mail to someone that has a @code{To}
  3756. header that (probably) points to yourself. This will confuse people.
  3757. So, natcherly you'll only do that if you're really eVIl.
  3758. This command is mainly used if you have several accounts and want to
  3759. ship a mail to a different account of yours. (If you're both
  3760. @code{root} and @code{postmaster} and get a mail for @code{postmaster}
  3761. to the @code{root} account, you may want to resend it to
  3762. @code{postmaster}. Ordnung muß sein!
  3763. This command understands the process/prefix convention
  3764. (@pxref{Process/Prefix}).
  3765. @item S O m
  3766. @kindex S O m @r{(Summary)}
  3767. @findex gnus-uu-digest-mail-forward
  3768. Digest the current series (@pxref{Decoding Articles}) and forward the
  3769. result using mail (@code{gnus-uu-digest-mail-forward}). This command
  3770. uses the process/prefix convention (@pxref{Process/Prefix}).
  3771. @item S M-c
  3772. @kindex S M-c @r{(Summary)}
  3773. @findex gnus-summary-mail-crosspost-complaint
  3774. @cindex crossposting
  3775. @cindex excessive crossposting
  3776. Send a complaint about excessive crossposting to the author of the
  3777. current article (@code{gnus-summary-mail-crosspost-complaint}).
  3778. @findex gnus-crosspost-complaint
  3779. This command is provided as a way to fight back against the current
  3780. crossposting pandemic that's sweeping Usenet. It will compose a reply
  3781. using the @code{gnus-crosspost-complaint} variable as a preamble. This
  3782. command understands the process/prefix convention
  3783. (@pxref{Process/Prefix}) and will prompt you before sending each mail.
  3784. @end table
  3785. Also @pxref{(message)Header Commands} for more information.
  3786. @node Summary Post Commands
  3787. @subsection Summary Post Commands
  3788. @cindex post
  3789. @cindex composing news
  3790. Commands for posting a news article:
  3791. @table @kbd
  3792. @item S p
  3793. @itemx a
  3794. @kindex a @r{(Summary)}
  3795. @kindex S p @r{(Summary)}
  3796. @findex gnus-summary-post-news
  3797. @c @icon{gnus-summary-post-news}
  3798. Post an article to the current group
  3799. (@code{gnus-summary-post-news}).
  3800. @item S f
  3801. @itemx f
  3802. @kindex f @r{(Summary)}
  3803. @kindex S f @r{(Summary)}
  3804. @findex gnus-summary-followup
  3805. @c @icon{gnus-summary-followup}
  3806. Post a followup to the current article (@code{gnus-summary-followup}).
  3807. @item S F
  3808. @itemx F
  3809. @kindex S F @r{(Summary)}
  3810. @kindex F @r{(Summary)}
  3811. @c @icon{gnus-summary-followup-with-original}
  3812. @findex gnus-summary-followup-with-original
  3813. Post a followup to the current article and include the original message
  3814. (@code{gnus-summary-followup-with-original}). This command uses the
  3815. process/prefix convention.
  3816. @item S n
  3817. @kindex S n @r{(Summary)}
  3818. @findex gnus-summary-followup-to-mail
  3819. Post a followup to the current article via news, even if you got the
  3820. message through mail (@code{gnus-summary-followup-to-mail}).
  3821. @item S N
  3822. @kindex S N @r{(Summary)}
  3823. @findex gnus-summary-followup-to-mail-with-original
  3824. Post a followup to the current article via news, even if you got the
  3825. message through mail and include the original message
  3826. (@code{gnus-summary-followup-to-mail-with-original}). This command uses
  3827. the process/prefix convention.
  3828. @item S o p
  3829. @kindex S o p @r{(Summary)}
  3830. @findex gnus-summary-post-forward
  3831. Forward the current article to a newsgroup
  3832. (@code{gnus-summary-post-forward}).
  3833. If no prefix is given, the message is forwarded according to the value
  3834. of (@code{message-forward-as-mime}) and
  3835. (@code{message-forward-show-mml}); if the prefix is 1, decode the
  3836. message and forward directly inline; if the prefix is 2, forward message
  3837. as an rfc822 MIME section; if the prefix is 3, decode message and
  3838. forward as an rfc822 MIME section; if the prefix is 4, forward message
  3839. directly inline; otherwise, the message is forwarded as no prefix given
  3840. but use the flipped value of (@code{message-forward-as-mime}). By
  3841. default, the message is decoded and forwarded as an rfc822 MIME section.
  3842. @item S O p
  3843. @kindex S O p @r{(Summary)}
  3844. @findex gnus-uu-digest-post-forward
  3845. @cindex digests
  3846. @cindex making digests
  3847. Digest the current series and forward the result to a newsgroup
  3848. (@code{gnus-uu-digest-mail-forward}). This command uses the
  3849. process/prefix convention.
  3850. @item S u
  3851. @kindex S u @r{(Summary)}
  3852. @findex gnus-uu-post-news
  3853. @c @icon{gnus-uu-post-news}
  3854. Uuencode a file, split it into parts, and post it as a series
  3855. (@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}).
  3856. @end table
  3857. Also @pxref{(message)Header Commands} for more information.
  3858. @node Summary Message Commands
  3859. @subsection Summary Message Commands
  3860. @table @kbd
  3861. @item S y
  3862. @kindex S y @r{(Summary)}
  3863. @findex gnus-summary-yank-message
  3864. Yank the current article into an already existing Message composition
  3865. buffer (@code{gnus-summary-yank-message}). This command prompts for
  3866. what message buffer you want to yank into, and understands the
  3867. process/prefix convention (@pxref{Process/Prefix}).
  3868. @end table
  3869. @node Canceling and Superseding
  3870. @subsection Canceling Articles
  3871. @cindex canceling articles
  3872. @cindex superseding articles
  3873. Have you ever written something, and then decided that you really,
  3874. really, really wish you hadn't posted that?
  3875. Well, you can't cancel mail, but you can cancel posts.
  3876. @findex gnus-summary-cancel-article
  3877. @kindex C @r{(Summary)}
  3878. @c @icon{gnus-summary-cancel-article}
  3879. Find the article you wish to cancel (you can only cancel your own
  3880. articles, so don't try any funny stuff). Then press @kbd{C} or @kbd{S
  3881. c} (@code{gnus-summary-cancel-article}). Your article will be
  3882. canceled---machines all over the world will be deleting your article.
  3883. This command uses the process/prefix convention (@pxref{Process/Prefix}).
  3884. Be aware, however, that not all sites honor cancels, so your article may
  3885. live on here and there, while most sites will delete the article in
  3886. question.
  3887. Gnus will use the ``current'' select method when canceling. If you
  3888. want to use the standard posting method, use the @samp{a} symbolic
  3889. prefix (@pxref{Symbolic Prefixes}).
  3890. If you discover that you have made some mistakes and want to do some
  3891. corrections, you can post a @dfn{superseding} article that will replace
  3892. your original article.
  3893. @findex gnus-summary-supersede-article
  3894. @kindex S @r{(Summary)}
  3895. Go to the original article and press @kbd{S s}
  3896. (@code{gnus-summary-supersede-article}). You will be put in a buffer
  3897. where you can edit the article all you want before sending it off the
  3898. usual way.
  3899. The same goes for superseding as for canceling, only more so: Some
  3900. sites do not honor superseding. On those sites, it will appear that you
  3901. have posted almost the same article twice.
  3902. If you have just posted the article, and change your mind right away,
  3903. there is a trick you can use to cancel/supersede the article without
  3904. waiting for the article to appear on your site first. You simply return
  3905. to the post buffer (which is called @code{*sent ...*}). There you will
  3906. find the article you just posted, with all the headers intact. Change
  3907. the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
  3908. header by substituting one of those words for the word
  3909. @code{Message-ID}. Then just press @kbd{C-c C-c} to send the article as
  3910. you would do normally. The previous article will be
  3911. canceled/superseded.
  3912. Just remember, kids: There is no 'c' in 'supersede'.
  3913. @node Marking Articles
  3914. @section Marking Articles
  3915. @cindex article marking
  3916. @cindex article ticking
  3917. @cindex marks
  3918. There are several marks you can set on an article.
  3919. You have marks that decide the @dfn{readedness} (whoo, neato-keano
  3920. neologism ohoy!) of the article. Alphabetic marks generally mean
  3921. @dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
  3922. In addition, you also have marks that do not affect readedness.
  3923. @menu
  3924. * Unread Articles:: Marks for unread articles.
  3925. * Read Articles:: Marks for read articles.
  3926. * Other Marks:: Marks that do not affect readedness.
  3927. @end menu
  3928. @ifinfo
  3929. There's a plethora of commands for manipulating these marks:
  3930. @end ifinfo
  3931. @menu
  3932. * Setting Marks:: How to set and remove marks.
  3933. * Generic Marking Commands:: How to customize the marking.
  3934. * Setting Process Marks:: How to mark articles for later processing.
  3935. @end menu
  3936. @node Unread Articles
  3937. @subsection Unread Articles
  3938. The following marks mark articles as (kinda) unread, in one form or
  3939. other.
  3940. @table @samp
  3941. @item !
  3942. @vindex gnus-ticked-mark
  3943. Marked as ticked (@code{gnus-ticked-mark}).
  3944. @dfn{Ticked articles} are articles that will remain visible always. If
  3945. you see an article that you find interesting, or you want to put off
  3946. reading it, or replying to it, until sometime later, you'd typically
  3947. tick it. However, articles can be expired, so if you want to keep an
  3948. article forever, you'll have to make it persistent (@pxref{Persistent
  3949. Articles}).
  3950. @item ?
  3951. @vindex gnus-dormant-mark
  3952. Marked as dormant (@code{gnus-dormant-mark}).
  3953. @dfn{Dormant articles} will only appear in the summary buffer if there
  3954. are followups to it. If you want to see them even if they don't have
  3955. followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
  3956. @item @key{SPC}
  3957. @vindex gnus-unread-mark
  3958. Marked as unread (@code{gnus-unread-mark}).
  3959. @dfn{Unread articles} are articles that haven't been read at all yet.
  3960. @end table
  3961. @node Read Articles
  3962. @subsection Read Articles
  3963. @cindex expirable mark
  3964. All the following marks mark articles as read.
  3965. @table @samp
  3966. @item r
  3967. @vindex gnus-del-mark
  3968. These are articles that the user has marked as read with the @kbd{d}
  3969. command manually, more or less (@code{gnus-del-mark}).
  3970. @item R
  3971. @vindex gnus-read-mark
  3972. Articles that have actually been read (@code{gnus-read-mark}).
  3973. @item O
  3974. @vindex gnus-ancient-mark
  3975. Articles that were marked as read in previous sessions and are now
  3976. @dfn{old} (@code{gnus-ancient-mark}).
  3977. @item K
  3978. @vindex gnus-killed-mark
  3979. Marked as killed (@code{gnus-killed-mark}).
  3980. @item X
  3981. @vindex gnus-kill-file-mark
  3982. Marked as killed by kill files (@code{gnus-kill-file-mark}).
  3983. @item Y
  3984. @vindex gnus-low-score-mark
  3985. Marked as read by having too low a score (@code{gnus-low-score-mark}).
  3986. @item C
  3987. @vindex gnus-catchup-mark
  3988. Marked as read by a catchup (@code{gnus-catchup-mark}).
  3989. @item G
  3990. @vindex gnus-canceled-mark
  3991. Canceled article (@code{gnus-canceled-mark})
  3992. @item F
  3993. @vindex gnus-souped-mark
  3994. @sc{soup}ed article (@code{gnus-souped-mark}). @xref{SOUP}.
  3995. @item Q
  3996. @vindex gnus-sparse-mark
  3997. Sparsely reffed article (@code{gnus-sparse-mark}). @xref{Customizing
  3998. Threading}.
  3999. @item M
  4000. @vindex gnus-duplicate-mark
  4001. Article marked as read by duplicate suppression
  4002. (@code{gnus-duplicated-mark}). @xref{Duplicate Suppression}.
  4003. @end table
  4004. All these marks just mean that the article is marked as read, really.
  4005. They are interpreted differently when doing adaptive scoring, though.
  4006. One more special mark, though:
  4007. @table @samp
  4008. @item E
  4009. @vindex gnus-expirable-mark
  4010. Marked as expirable (@code{gnus-expirable-mark}).
  4011. Marking articles as @dfn{expirable} (or have them marked as such
  4012. automatically) doesn't make much sense in normal groups---a user doesn't
  4013. control expiring of news articles, but in mail groups, for instance,
  4014. articles marked as @dfn{expirable} can be deleted by Gnus at
  4015. any time.
  4016. @end table
  4017. @node Other Marks
  4018. @subsection Other Marks
  4019. @cindex process mark
  4020. @cindex bookmarks
  4021. There are some marks that have nothing to do with whether the article is
  4022. read or not.
  4023. @itemize @bullet
  4024. @item
  4025. You can set a bookmark in the current article. Say you are reading a
  4026. long thesis on cats' urinary tracts, and have to go home for dinner
  4027. before you've finished reading the thesis. You can then set a bookmark
  4028. in the article, and Gnus will jump to this bookmark the next time it
  4029. encounters the article. @xref{Setting Marks}.
  4030. @item
  4031. @vindex gnus-replied-mark
  4032. All articles that you have replied to or made a followup to (i.e., have
  4033. answered) will be marked with an @samp{A} in the second column
  4034. (@code{gnus-replied-mark}).
  4035. @item
  4036. @vindex gnus-cached-mark
  4037. Articles stored in the article cache will be marked with an @samp{*} in
  4038. the second column (@code{gnus-cached-mark}). @xref{Article Caching}.
  4039. @item
  4040. @vindex gnus-saved-mark
  4041. Articles ``saved'' (in some manner or other; not necessarily
  4042. religiously) are marked with an @samp{S} in the second column
  4043. (@code{gnus-saved-mark}).
  4044. @item
  4045. @vindex gnus-not-empty-thread-mark
  4046. @vindex gnus-empty-thread-mark
  4047. If the @samp{%e} spec is used, the presence of threads or not will be
  4048. marked with @code{gnus-not-empty-thread-mark} and
  4049. @code{gnus-empty-thread-mark} in the third column, respectively.
  4050. @item
  4051. @vindex gnus-process-mark
  4052. Finally we have the @dfn{process mark} (@code{gnus-process-mark}). A
  4053. variety of commands react to the presence of the process mark. For
  4054. instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
  4055. all articles that have been marked with the process mark. Articles
  4056. marked with the process mark have a @samp{#} in the second column.
  4057. @end itemize
  4058. You might have noticed that most of these ``non-readedness'' marks
  4059. appear in the second column by default. So if you have a cached, saved,
  4060. replied article that you have process-marked, what will that look like?
  4061. Nothing much. The precedence rules go as follows: process -> cache ->
  4062. replied -> saved. So if the article is in the cache and is replied,
  4063. you'll only see the cache mark and not the replied mark.
  4064. @node Setting Marks
  4065. @subsection Setting Marks
  4066. @cindex setting marks
  4067. All the marking commands understand the numeric prefix.
  4068. @table @kbd
  4069. @item M c
  4070. @itemx M-u
  4071. @kindex M c @r{(Summary)}
  4072. @kindex M-u @r{(Summary)}
  4073. @findex gnus-summary-clear-mark-forward
  4074. @cindex mark as unread
  4075. Clear all readedness-marks from the current article
  4076. (@code{gnus-summary-clear-mark-forward}). In other words, mark the
  4077. article as unread.
  4078. @item M t
  4079. @itemx !
  4080. @kindex ! @r{(Summary)}
  4081. @kindex M t @r{(Summary)}
  4082. @findex gnus-summary-tick-article-forward
  4083. Tick the current article (@code{gnus-summary-tick-article-forward}).
  4084. @xref{Article Caching}.
  4085. @item M ?
  4086. @itemx ?
  4087. @kindex ? @r{(Summary)}
  4088. @kindex M ? @r{(Summary)}
  4089. @findex gnus-summary-mark-as-dormant
  4090. Mark the current article as dormant
  4091. (@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}.
  4092. @item M d
  4093. @itemx d
  4094. @kindex M d @r{(Summary)}
  4095. @kindex d @r{(Summary)}
  4096. @findex gnus-summary-mark-as-read-forward
  4097. Mark the current article as read
  4098. (@code{gnus-summary-mark-as-read-forward}).
  4099. @item D
  4100. @kindex D @r{(Summary)}
  4101. @findex gnus-summary-mark-as-read-backward
  4102. Mark the current article as read and move point to the previous line
  4103. (@code{gnus-summary-mark-as-read-backward}).
  4104. @item M k
  4105. @itemx k
  4106. @kindex k @r{(Summary)}
  4107. @kindex M k @r{(Summary)}
  4108. @findex gnus-summary-kill-same-subject-and-select
  4109. Mark all articles that have the same subject as the current one as read,
  4110. and then select the next unread article
  4111. (@code{gnus-summary-kill-same-subject-and-select}).
  4112. @item M K
  4113. @itemx C-k
  4114. @kindex M K @r{(Summary)}
  4115. @kindex C-k @r{(Summary)}
  4116. @findex gnus-summary-kill-same-subject
  4117. Mark all articles that have the same subject as the current one as read
  4118. (@code{gnus-summary-kill-same-subject}).
  4119. @item M C
  4120. @kindex M C @r{(Summary)}
  4121. @findex gnus-summary-catchup
  4122. @c @icon{gnus-summary-catchup}
  4123. Mark all unread articles as read (@code{gnus-summary-catchup}).
  4124. @item M C-c
  4125. @kindex M C-c @r{(Summary)}
  4126. @findex gnus-summary-catchup-all
  4127. Mark all articles in the group as read---even the ticked and dormant
  4128. articles (@code{gnus-summary-catchup-all}).
  4129. @item M H
  4130. @kindex M H @r{(Summary)}
  4131. @findex gnus-summary-catchup-to-here
  4132. Catchup the current group to point
  4133. (@code{gnus-summary-catchup-to-here}).
  4134. @item C-w
  4135. @kindex C-w @r{(Summary)}
  4136. @findex gnus-summary-mark-region-as-read
  4137. Mark all articles between point and mark as read
  4138. (@code{gnus-summary-mark-region-as-read}).
  4139. @item M V k
  4140. @kindex M V k @r{(Summary)}
  4141. @findex gnus-summary-kill-below
  4142. Kill all articles with scores below the default score (or below the
  4143. numeric prefix) (@code{gnus-summary-kill-below}).
  4144. @item M e
  4145. @itemx E
  4146. @kindex M e @r{(Summary)}
  4147. @kindex E @r{(Summary)}
  4148. @findex gnus-summary-mark-as-expirable
  4149. Mark the current article as expirable
  4150. (@code{gnus-summary-mark-as-expirable}).
  4151. @item M b
  4152. @kindex M b @r{(Summary)}
  4153. @findex gnus-summary-set-bookmark
  4154. Set a bookmark in the current article
  4155. (@code{gnus-summary-set-bookmark}).
  4156. @item M B
  4157. @kindex M B @r{(Summary)}
  4158. @findex gnus-summary-remove-bookmark
  4159. Remove the bookmark from the current article
  4160. (@code{gnus-summary-remove-bookmark}).
  4161. @item M V c
  4162. @kindex M V c @r{(Summary)}
  4163. @findex gnus-summary-clear-above
  4164. Clear all marks from articles with scores over the default score (or
  4165. over the numeric prefix) (@code{gnus-summary-clear-above}).
  4166. @item M V u
  4167. @kindex M V u @r{(Summary)}
  4168. @findex gnus-summary-tick-above
  4169. Tick all articles with scores over the default score (or over the
  4170. numeric prefix) (@code{gnus-summary-tick-above}).
  4171. @item M V m
  4172. @kindex M V m @r{(Summary)}
  4173. @findex gnus-summary-mark-above
  4174. Prompt for a mark, and mark all articles with scores over the default
  4175. score (or over the numeric prefix) with this mark
  4176. (@code{gnus-summary-clear-above}).
  4177. @end table
  4178. @vindex gnus-summary-goto-unread
  4179. The @code{gnus-summary-goto-unread} variable controls what action should
  4180. be taken after setting a mark. If non-@code{nil}, point will move to
  4181. the next/previous unread article. If @code{nil}, point will just move
  4182. one line up or down. As a special case, if this variable is
  4183. @code{never}, all the marking commands as well as other commands (like
  4184. @key{SPC}) will move to the next article, whether it is unread or not.
  4185. The default is @code{t}.
  4186. @node Generic Marking Commands
  4187. @subsection Generic Marking Commands
  4188. Some people would like the command that ticks an article (@kbd{!}) go to
  4189. the next article. Others would like it to go to the next unread
  4190. article. Yet others would like it to stay on the current article. And
  4191. even though I haven't heard of anybody wanting it to go to the
  4192. previous (unread) article, I'm sure there are people that want that as
  4193. well.
  4194. Multiply these five behaviors by five different marking commands, and
  4195. you get a potentially complex set of variable to control what each
  4196. command should do.
  4197. To sidestep that mess, Gnus provides commands that do all these
  4198. different things. They can be found on the @kbd{M M} map in the summary
  4199. buffer. Type @kbd{M M C-h} to see them all---there are too many of them
  4200. to list in this manual.
  4201. While you can use these commands directly, most users would prefer
  4202. altering the summary mode keymap. For instance, if you would like the
  4203. @kbd{!} command to go to the next article instead of the next unread
  4204. article, you could say something like:
  4205. @lisp
  4206. (add-hook 'gnus-summary-mode-hook 'my-alter-summary-map)
  4207. (defun my-alter-summary-map ()
  4208. (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next))
  4209. @end lisp
  4210. or
  4211. @lisp
  4212. (defun my-alter-summary-map ()
  4213. (local-set-key "!" "MM!n"))
  4214. @end lisp
  4215. @node Setting Process Marks
  4216. @subsection Setting Process Marks
  4217. @cindex setting process marks
  4218. @table @kbd
  4219. @item M P p
  4220. @itemx #
  4221. @kindex # @r{(Summary)}
  4222. @kindex M P p @r{(Summary)}
  4223. @findex gnus-summary-mark-as-processable
  4224. Mark the current article with the process mark
  4225. (@code{gnus-summary-mark-as-processable}).
  4226. @findex gnus-summary-unmark-as-processable
  4227. @item M P u
  4228. @itemx M-#
  4229. @kindex M P u @r{(Summary)}
  4230. @kindex M-# @r{(Summary)}
  4231. Remove the process mark, if any, from the current article
  4232. (@code{gnus-summary-unmark-as-processable}).
  4233. @item M P U
  4234. @kindex M P U @r{(Summary)}
  4235. @findex gnus-summary-unmark-all-processable
  4236. Remove the process mark from all articles
  4237. (@code{gnus-summary-unmark-all-processable}).
  4238. @item M P i
  4239. @kindex M P i @r{(Summary)}
  4240. @findex gnus-uu-invert-processable
  4241. Invert the list of process marked articles
  4242. (@code{gnus-uu-invert-processable}).
  4243. @item M P R
  4244. @kindex M P R @r{(Summary)}
  4245. @findex gnus-uu-mark-by-regexp
  4246. Mark articles that have a @code{Subject} header that matches a regular
  4247. expression (@code{gnus-uu-mark-by-regexp}).
  4248. @item M P G
  4249. @kindex M P G @r{(Summary)}
  4250. @findex gnus-uu-unmark-by-regexp
  4251. Unmark articles that have a @code{Subject} header that matches a regular
  4252. expression (@code{gnus-uu-unmark-by-regexp}).
  4253. @item M P r
  4254. @kindex M P r @r{(Summary)}
  4255. @findex gnus-uu-mark-region
  4256. Mark articles in region (@code{gnus-uu-mark-region}).
  4257. @item M P t
  4258. @kindex M P t @r{(Summary)}
  4259. @findex gnus-uu-mark-thread
  4260. Mark all articles in the current (sub)thread
  4261. (@code{gnus-uu-mark-thread}).
  4262. @item M P T
  4263. @kindex M P T @r{(Summary)}
  4264. @findex gnus-uu-unmark-thread
  4265. Unmark all articles in the current (sub)thread
  4266. (@code{gnus-uu-unmark-thread}).
  4267. @item M P v
  4268. @kindex M P v @r{(Summary)}
  4269. @findex gnus-uu-mark-over
  4270. Mark all articles that have a score above the prefix argument
  4271. (@code{gnus-uu-mark-over}).
  4272. @item M P s
  4273. @kindex M P s @r{(Summary)}
  4274. @findex gnus-uu-mark-series
  4275. Mark all articles in the current series (@code{gnus-uu-mark-series}).
  4276. @item M P S
  4277. @kindex M P S @r{(Summary)}
  4278. @findex gnus-uu-mark-sparse
  4279. Mark all series that have already had some articles marked
  4280. (@code{gnus-uu-mark-sparse}).
  4281. @item M P a
  4282. @kindex M P a @r{(Summary)}
  4283. @findex gnus-uu-mark-all
  4284. Mark all articles in series order (@code{gnus-uu-mark-series}).
  4285. @item M P b
  4286. @kindex M P b @r{(Summary)}
  4287. @findex gnus-uu-mark-buffer
  4288. Mark all articles in the buffer in the order they appear
  4289. (@code{gnus-uu-mark-buffer}).
  4290. @item M P k
  4291. @kindex M P k @r{(Summary)}
  4292. @findex gnus-summary-kill-process-mark
  4293. Push the current process mark set onto the stack and unmark all articles
  4294. (@code{gnus-summary-kill-process-mark}).
  4295. @item M P y
  4296. @kindex M P y @r{(Summary)}
  4297. @findex gnus-summary-yank-process-mark
  4298. Pop the previous process mark set from the stack and restore it
  4299. (@code{gnus-summary-yank-process-mark}).
  4300. @item M P w
  4301. @kindex M P w @r{(Summary)}
  4302. @findex gnus-summary-save-process-mark
  4303. Push the current process mark set onto the stack
  4304. (@code{gnus-summary-save-process-mark}).
  4305. @end table
  4306. Also see the @kbd{&} command in @pxref{Searching for Articles} for how to
  4307. set process marks based on article body contents.
  4308. @node Limiting
  4309. @section Limiting
  4310. @cindex limiting
  4311. It can be convenient to limit the summary buffer to just show some
  4312. subset of the articles currently in the group. The effect most limit
  4313. commands have is to remove a few (or many) articles from the summary
  4314. buffer.
  4315. All limiting commands work on subsets of the articles already fetched
  4316. from the servers. None of these commands query the server for
  4317. additional articles.
  4318. @table @kbd
  4319. @item / /
  4320. @itemx / s
  4321. @kindex / / @r{(Summary)}
  4322. @findex gnus-summary-limit-to-subject
  4323. Limit the summary buffer to articles that match some subject
  4324. (@code{gnus-summary-limit-to-subject}).
  4325. @item / a
  4326. @kindex / a @r{(Summary)}
  4327. @findex gnus-summary-limit-to-author
  4328. Limit the summary buffer to articles that match some author
  4329. (@code{gnus-summary-limit-to-author}).
  4330. @item / x
  4331. @kindex / x @r{(Summary)}
  4332. @findex gnus-summary-limit-to-extra
  4333. Limit the summary buffer to articles that match one of the ``extra''
  4334. headers (@pxref{To From Newsgroups})
  4335. (@code{gnus-summary-limit-to-extra}).
  4336. @item / u
  4337. @itemx x
  4338. @kindex / u @r{(Summary)}
  4339. @kindex x @r{(Summary)}
  4340. @findex gnus-summary-limit-to-unread
  4341. Limit the summary buffer to articles not marked as read
  4342. (@code{gnus-summary-limit-to-unread}). If given a prefix, limit the
  4343. buffer to articles strictly unread. This means that ticked and
  4344. dormant articles will also be excluded.
  4345. @item / m
  4346. @kindex / m @r{(Summary)}
  4347. @findex gnus-summary-limit-to-marks
  4348. Ask for a mark and then limit to all articles that have been marked
  4349. with that mark (@code{gnus-summary-limit-to-marks}).
  4350. @item / t
  4351. @kindex / t @r{(Summary)}
  4352. @findex gnus-summary-limit-to-age
  4353. Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days
  4354. (@code{gnus-summary-limit-to-age}). If given a prefix, limit to
  4355. articles younger than that number of days.
  4356. @item / n
  4357. @kindex / n @r{(Summary)}
  4358. @findex gnus-summary-limit-to-articles
  4359. Limit the summary buffer to the current article
  4360. (@code{gnus-summary-limit-to-articles}). Uses the process/prefix
  4361. convention (@pxref{Process/Prefix}).
  4362. @item / w
  4363. @kindex / w @r{(Summary)}
  4364. @findex gnus-summary-pop-limit
  4365. Pop the previous limit off the stack and restore it
  4366. (@code{gnus-summary-pop-limit}). If given a prefix, pop all limits off
  4367. the stack.
  4368. @item / v
  4369. @kindex / v @r{(Summary)}
  4370. @findex gnus-summary-limit-to-score
  4371. Limit the summary buffer to articles that have a score at or above some
  4372. score (@code{gnus-summary-limit-to-score}).
  4373. @item / E
  4374. @itemx M S
  4375. @kindex M S @r{(Summary)}
  4376. @kindex / E @r{(Summary)}
  4377. @findex gnus-summary-limit-include-expunged
  4378. Include all expunged articles in the limit
  4379. (@code{gnus-summary-limit-include-expunged}).
  4380. @item / D
  4381. @kindex / D @r{(Summary)}
  4382. @findex gnus-summary-limit-include-dormant
  4383. Include all dormant articles in the limit
  4384. (@code{gnus-summary-limit-include-dormant}).
  4385. @item / *
  4386. @kindex / * @r{(Summary)}
  4387. @findex gnus-summary-limit-include-cached
  4388. Include all cached articles in the limit
  4389. (@code{gnus-summary-limit-include-cached}).
  4390. @item / d
  4391. @kindex / d @r{(Summary)}
  4392. @findex gnus-summary-limit-exclude-dormant
  4393. Exclude all dormant articles from the limit
  4394. (@code{gnus-summary-limit-exclude-dormant}).
  4395. @item / M
  4396. @kindex / M @r{(Summary)}
  4397. @findex gnus-summary-limit-exclude-marks
  4398. Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}).
  4399. @item / T
  4400. @kindex / T @r{(Summary)}
  4401. @findex gnus-summary-limit-include-thread
  4402. Include all the articles in the current thread in the limit.
  4403. @item / c
  4404. @kindex / c @r{(Summary)}
  4405. @findex gnus-summary-limit-exclude-childless-dormant
  4406. Exclude all dormant articles that have no children from the limit
  4407. (@code{gnus-summary-limit-exclude-childless-dormant}).
  4408. @item / C
  4409. @kindex / C @r{(Summary)}
  4410. @findex gnus-summary-limit-mark-excluded-as-read
  4411. Mark all excluded unread articles as read
  4412. (@code{gnus-summary-limit-mark-excluded-as-read}). If given a prefix,
  4413. also mark excluded ticked and dormant articles as read.
  4414. @end table
  4415. @node Threading
  4416. @section Threading
  4417. @cindex threading
  4418. @cindex article threading
  4419. Gnus threads articles by default. @dfn{To thread} is to put responses
  4420. to articles directly after the articles they respond to---in a
  4421. hierarchical fashion.
  4422. Threading is done by looking at the @code{References} headers of the
  4423. articles. In a perfect world, this would be enough to build pretty
  4424. trees, but unfortunately, the @code{References} header is often broken
  4425. or simply missing. Weird news propagation exacerbates the problem,
  4426. so one has to employ other heuristics to get pleasing results. A
  4427. plethora of approaches exists, as detailed in horrible detail in
  4428. @pxref{Customizing Threading}.
  4429. First, a quick overview of the concepts:
  4430. @table @dfn
  4431. @item root
  4432. The top-most article in a thread; the first article in the thread.
  4433. @item thread
  4434. A tree-like article structure.
  4435. @item sub-thread
  4436. A small(er) section of this tree-like structure.
  4437. @item loose threads
  4438. Threads often lose their roots due to article expiry, or due to the root
  4439. already having been read in a previous session, and not displayed in the
  4440. summary buffer. We then typically have many sub-threads that really
  4441. belong to one thread, but are without connecting roots. These are
  4442. called loose threads.
  4443. @item thread gathering
  4444. An attempt to gather loose threads into bigger threads.
  4445. @item sparse threads
  4446. A thread where the missing articles have been ``guessed'' at, and are
  4447. displayed as empty lines in the summary buffer.
  4448. @end table
  4449. @menu
  4450. * Customizing Threading:: Variables you can change to affect the threading.
  4451. * Thread Commands:: Thread based commands in the summary buffer.
  4452. @end menu
  4453. @node Customizing Threading
  4454. @subsection Customizing Threading
  4455. @cindex customizing threading
  4456. @menu
  4457. * Loose Threads:: How Gnus gathers loose threads into bigger threads.
  4458. * Filling In Threads:: Making the threads displayed look fuller.
  4459. * More Threading:: Even more variables for fiddling with threads.
  4460. * Low-Level Threading:: You thought it was over... but you were wrong!
  4461. @end menu
  4462. @node Loose Threads
  4463. @subsubsection Loose Threads
  4464. @cindex <
  4465. @cindex >
  4466. @cindex loose threads
  4467. @table @code
  4468. @item gnus-summary-make-false-root
  4469. @vindex gnus-summary-make-false-root
  4470. If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
  4471. and create a dummy root at the top. (Wait a minute. Root at the top?
  4472. Yup.) Loose subtrees occur when the real root has expired, or you've
  4473. read or killed the root in a previous session.
  4474. When there is no real root of a thread, Gnus will have to fudge
  4475. something. This variable says what fudging method Gnus should use.
  4476. There are four possible values:
  4477. @iftex
  4478. @iflatex
  4479. \gnusfigure{The Summary Buffer}{390}{
  4480. \put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}}
  4481. \put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}}
  4482. \put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}}
  4483. \put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}}
  4484. }
  4485. @end iflatex
  4486. @end iftex
  4487. @cindex adopting articles
  4488. @table @code
  4489. @item adopt
  4490. Gnus will make the first of the orphaned articles the parent. This
  4491. parent will adopt all the other articles. The adopted articles will be
  4492. marked as such by pointy brackets (@samp{<>}) instead of the standard
  4493. square brackets (@samp{[]}). This is the default method.
  4494. @item dummy
  4495. @vindex gnus-summary-dummy-line-format
  4496. Gnus will create a dummy summary line that will pretend to be the
  4497. parent. This dummy line does not correspond to any real article, so
  4498. selecting it will just select the first real article after the dummy
  4499. article. @code{gnus-summary-dummy-line-format} is used to specify the
  4500. format of the dummy roots. It accepts only one format spec: @samp{S},
  4501. which is the subject of the article. @xref{Formatting Variables}.
  4502. @item empty
  4503. Gnus won't actually make any article the parent, but simply leave the
  4504. subject field of all orphans except the first empty. (Actually, it will
  4505. use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
  4506. Buffer Format}).)
  4507. @item none
  4508. Don't make any article parent at all. Just gather the threads and
  4509. display them after one another.
  4510. @item nil
  4511. Don't gather loose threads.
  4512. @end table
  4513. @item gnus-summary-gather-subject-limit
  4514. @vindex gnus-summary-gather-subject-limit
  4515. Loose threads are gathered by comparing subjects of articles. If this
  4516. variable is @code{nil}, Gnus requires an exact match between the
  4517. subjects of the loose threads before gathering them into one big
  4518. super-thread. This might be too strict a requirement, what with the
  4519. presence of stupid newsreaders that chop off long subject lines. If
  4520. you think so, set this variable to, say, 20 to require that only the
  4521. first 20 characters of the subjects have to match. If you set this
  4522. variable to a really low number, you'll find that Gnus will gather
  4523. everything in sight into one thread, which isn't very helpful.
  4524. @cindex fuzzy article gathering
  4525. If you set this variable to the special value @code{fuzzy}, Gnus will
  4526. use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy
  4527. Matching}).
  4528. @item gnus-simplify-subject-fuzzy-regexp
  4529. @vindex gnus-simplify-subject-fuzzy-regexp
  4530. This can either be a regular expression or list of regular expressions
  4531. that match strings that will be removed from subjects if fuzzy subject
  4532. simplification is used.
  4533. @item gnus-simplify-ignored-prefixes
  4534. @vindex gnus-simplify-ignored-prefixes
  4535. If you set @code{gnus-summary-gather-subject-limit} to something as low
  4536. as 10, you might consider setting this variable to something sensible:
  4537. @c Written by Michael Ernst <mernst@cs.rice.edu>
  4538. @lisp
  4539. (setq gnus-simplify-ignored-prefixes
  4540. (concat
  4541. "\\`\\[?\\("
  4542. (mapconcat
  4543. 'identity
  4544. '("looking"
  4545. "wanted" "followup" "summary\\( of\\)?"
  4546. "help" "query" "problem" "question"
  4547. "answer" "reference" "announce"
  4548. "How can I" "How to" "Comparison of"
  4549. ;; ...
  4550. )
  4551. "\\|")
  4552. "\\)\\s *\\("
  4553. (mapconcat 'identity
  4554. '("for" "for reference" "with" "about")
  4555. "\\|")
  4556. "\\)?\\]?:?[ \t]*"))
  4557. @end lisp
  4558. All words that match this regexp will be removed before comparing two
  4559. subjects.
  4560. @item gnus-simplify-subject-functions
  4561. @vindex gnus-simplify-subject-functions
  4562. If non-@code{nil}, this variable overrides
  4563. @code{gnus-summary-gather-subject-limit}. This variable should be a
  4564. list of functions to apply to the @code{Subject} string iteratively to
  4565. arrive at the simplified version of the string.
  4566. Useful functions to put in this list include:
  4567. @table @code
  4568. @item gnus-simplify-subject-re
  4569. @findex gnus-simplify-subject-re
  4570. Strip the leading @samp{Re:}.
  4571. @item gnus-simplify-subject-fuzzy
  4572. @findex gnus-simplify-subject-fuzzy
  4573. Simplify fuzzily.
  4574. @item gnus-simplify-whitespace
  4575. @findex gnus-simplify-whitespace
  4576. Remove excessive whitespace.
  4577. @end table
  4578. You may also write your own functions, of course.
  4579. @item gnus-summary-gather-exclude-subject
  4580. @vindex gnus-summary-gather-exclude-subject
  4581. Since loose thread gathering is done on subjects only, that might lead
  4582. to many false hits, especially with certain common subjects like
  4583. @samp{} and @samp{(none)}. To make the situation slightly better,
  4584. you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
  4585. what subjects should be excluded from the gathering process.@*
  4586. The default is @samp{^ *$\\|^(none)$}.
  4587. @item gnus-summary-thread-gathering-function
  4588. @vindex gnus-summary-thread-gathering-function
  4589. Gnus gathers threads by looking at @code{Subject} headers. This means
  4590. that totally unrelated articles may end up in the same ``thread'', which
  4591. is confusing. An alternate approach is to look at all the
  4592. @code{Message-ID}s in all the @code{References} headers to find matches.
  4593. This will ensure that no gathered threads ever include unrelated
  4594. articles, but it also means that people who have posted with broken
  4595. newsreaders won't be gathered properly. The choice is yours---plague or
  4596. cholera:
  4597. @table @code
  4598. @item gnus-gather-threads-by-subject
  4599. @findex gnus-gather-threads-by-subject
  4600. This function is the default gathering function and looks at
  4601. @code{Subject}s exclusively.
  4602. @item gnus-gather-threads-by-references
  4603. @findex gnus-gather-threads-by-references
  4604. This function looks at @code{References} headers exclusively.
  4605. @end table
  4606. If you want to test gathering by @code{References}, you could say
  4607. something like:
  4608. @lisp
  4609. (setq gnus-summary-thread-gathering-function
  4610. 'gnus-gather-threads-by-references)
  4611. @end lisp
  4612. @end table
  4613. @node Filling In Threads
  4614. @subsubsection Filling In Threads
  4615. @table @code
  4616. @item gnus-fetch-old-headers
  4617. @vindex gnus-fetch-old-headers
  4618. If non-@code{nil}, Gnus will attempt to build old threads by fetching
  4619. more old headers---headers to articles marked as read. If you
  4620. would like to display as few summary lines as possible, but still
  4621. connect as many loose threads as possible, you should set this variable
  4622. to @code{some} or a number. If you set it to a number, no more than
  4623. that number of extra old headers will be fetched. In either case,
  4624. fetching old headers only works if the back end you are using carries
  4625. overview files---this would normally be @code{nntp}, @code{nnspool} and
  4626. @code{nnml}. Also remember that if the root of the thread has been
  4627. expired by the server, there's not much Gnus can do about that.
  4628. This variable can also be set to @code{invisible}. This won't have any
  4629. visible effects, but is useful if you use the @kbd{A T} command a lot
  4630. (@pxref{Finding the Parent}).
  4631. @item gnus-build-sparse-threads
  4632. @vindex gnus-build-sparse-threads
  4633. Fetching old headers can be slow. A low-rent similar effect can be
  4634. gotten by setting this variable to @code{some}. Gnus will then look at
  4635. the complete @code{References} headers of all articles and try to string
  4636. together articles that belong in the same thread. This will leave
  4637. @dfn{gaps} in the threading display where Gnus guesses that an article
  4638. is missing from the thread. (These gaps appear like normal summary
  4639. lines. If you select a gap, Gnus will try to fetch the article in
  4640. question.) If this variable is @code{t}, Gnus will display all these
  4641. ``gaps'' without regard for whether they are useful for completing the
  4642. thread or not. Finally, if this variable is @code{more}, Gnus won't cut
  4643. off sparse leaf nodes that don't lead anywhere. This variable is
  4644. @code{nil} by default.
  4645. @end table
  4646. @node More Threading
  4647. @subsubsection More Threading
  4648. @table @code
  4649. @item gnus-show-threads
  4650. @vindex gnus-show-threads
  4651. If this variable is @code{nil}, no threading will be done, and all of
  4652. the rest of the variables here will have no effect. Turning threading
  4653. off will speed group selection up a bit, but it is sure to make reading
  4654. slower and more awkward.
  4655. @item gnus-thread-hide-subtree
  4656. @vindex gnus-thread-hide-subtree
  4657. If non-@code{nil}, all threads will be hidden when the summary buffer is
  4658. generated.
  4659. @item gnus-thread-expunge-below
  4660. @vindex gnus-thread-expunge-below
  4661. All threads that have a total score (as defined by
  4662. @code{gnus-thread-score-function}) less than this number will be
  4663. expunged. This variable is @code{nil} by default, which means that no
  4664. threads are expunged.
  4665. @item gnus-thread-hide-killed
  4666. @vindex gnus-thread-hide-killed
  4667. if you kill a thread and this variable is non-@code{nil}, the subtree
  4668. will be hidden.
  4669. @item gnus-thread-ignore-subject
  4670. @vindex gnus-thread-ignore-subject
  4671. Sometimes somebody changes the subject in the middle of a thread. If
  4672. this variable is non-@code{nil}, the subject change is ignored. If it
  4673. is @code{nil}, which is the default, a change in the subject will result
  4674. in a new thread.
  4675. @item gnus-thread-indent-level
  4676. @vindex gnus-thread-indent-level
  4677. This is a number that says how much each sub-thread should be indented.
  4678. The default is 4.
  4679. @item gnus-sort-gathered-threads-function
  4680. @vindex gnus-sort-gathered-threads-function
  4681. Sometimes, particularly with mailing lists, the order in which mails
  4682. arrive locally is not necessarily the same as the order in which they
  4683. arrived on the mailing list. Consequently, when sorting sub-threads
  4684. using the default @code{gnus-thread-sort-by-number}, responses can end
  4685. up appearing before the article to which they are responding to.
  4686. Setting this variable to an alternate value
  4687. (e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in an
  4688. appropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce a
  4689. more logical sub-thread ordering in such instances.
  4690. @end table
  4691. @node Low-Level Threading
  4692. @subsubsection Low-Level Threading
  4693. @table @code
  4694. @item gnus-parse-headers-hook
  4695. @vindex gnus-parse-headers-hook
  4696. Hook run before parsing any headers.
  4697. @item gnus-alter-header-function
  4698. @vindex gnus-alter-header-function
  4699. If non-@code{nil}, this function will be called to allow alteration of
  4700. article header structures. The function is called with one parameter,
  4701. the article header vector, which it may alter in any way. For instance,
  4702. if you have a mail-to-news gateway which alters the @code{Message-ID}s
  4703. in systematic ways (by adding prefixes and such), you can use this
  4704. variable to un-scramble the @code{Message-ID}s so that they are more
  4705. meaningful. Here's one example:
  4706. @lisp
  4707. (setq gnus-alter-header-function 'my-alter-message-id)
  4708. (defun my-alter-message-id (header)
  4709. (let ((id (mail-header-id header)))
  4710. (when (string-match
  4711. "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
  4712. (mail-header-set-id
  4713. (concat (match-string 1 id) "@@" (match-string 2 id))
  4714. header))))
  4715. @end lisp
  4716. @end table
  4717. @node Thread Commands
  4718. @subsection Thread Commands
  4719. @cindex thread commands
  4720. @table @kbd
  4721. @item T k
  4722. @itemx C-M-k
  4723. @kindex T k @r{(Summary)}
  4724. @kindex C-M-k @r{(Summary)}
  4725. @findex gnus-summary-kill-thread
  4726. Mark all articles in the current (sub-)thread as read
  4727. (@code{gnus-summary-kill-thread}). If the prefix argument is positive,
  4728. remove all marks instead. If the prefix argument is negative, tick
  4729. articles instead.
  4730. @item T l
  4731. @itemx C-M-l
  4732. @kindex T l @r{(Summary)}
  4733. @kindex C-M-l @r{(Summary)}
  4734. @findex gnus-summary-lower-thread
  4735. Lower the score of the current (sub-)thread
  4736. (@code{gnus-summary-lower-thread}).
  4737. @item T i
  4738. @kindex T i @r{(Summary)}
  4739. @findex gnus-summary-raise-thread
  4740. Increase the score of the current (sub-)thread
  4741. (@code{gnus-summary-raise-thread}).
  4742. @item T #
  4743. @kindex T # @r{(Summary)}
  4744. @findex gnus-uu-mark-thread
  4745. Set the process mark on the current (sub-)thread
  4746. (@code{gnus-uu-mark-thread}).
  4747. @item T M-#
  4748. @kindex T M-# @r{(Summary)}
  4749. @findex gnus-uu-unmark-thread
  4750. Remove the process mark from the current (sub-)thread
  4751. (@code{gnus-uu-unmark-thread}).
  4752. @item T T
  4753. @kindex T T @r{(Summary)}
  4754. @findex gnus-summary-toggle-threads
  4755. Toggle threading (@code{gnus-summary-toggle-threads}).
  4756. @item T s
  4757. @kindex T s @r{(Summary)}
  4758. @findex gnus-summary-show-thread
  4759. Expose the (sub-)thread hidden under the current article, if any
  4760. (@code{gnus-summary-show-thread}).
  4761. @item T h
  4762. @kindex T h @r{(Summary)}
  4763. @findex gnus-summary-hide-thread
  4764. Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
  4765. @item T S
  4766. @kindex T S @r{(Summary)}
  4767. @findex gnus-summary-show-all-threads
  4768. Expose all hidden threads (@code{gnus-summary-show-all-threads}).
  4769. @item T H
  4770. @kindex T H @r{(Summary)}
  4771. @findex gnus-summary-hide-all-threads
  4772. Hide all threads (@code{gnus-summary-hide-all-threads}).
  4773. @item T t
  4774. @kindex T t @r{(Summary)}
  4775. @findex gnus-summary-rethread-current
  4776. Re-thread the current article's thread
  4777. (@code{gnus-summary-rethread-current}). This works even when the
  4778. summary buffer is otherwise unthreaded.
  4779. @item T ^
  4780. @kindex T ^ @r{(Summary)}
  4781. @findex gnus-summary-reparent-thread
  4782. Make the current article the child of the marked (or previous) article
  4783. (@code{gnus-summary-reparent-thread}).
  4784. @end table
  4785. The following commands are thread movement commands. They all
  4786. understand the numeric prefix.
  4787. @table @kbd
  4788. @item T n
  4789. @kindex T n @r{(Summary)}
  4790. @itemx C-M-n
  4791. @kindex C-M-n @r{(Summary)}
  4792. @itemx M-down
  4793. @kindex M-down @r{(Summary)}
  4794. @findex gnus-summary-next-thread
  4795. Go to the next thread (@code{gnus-summary-next-thread}).
  4796. @item T p
  4797. @kindex T p @r{(Summary)}
  4798. @itemx C-M-p
  4799. @kindex C-M-p @r{(Summary)}
  4800. @itemx M-up
  4801. @kindex M-up @r{(Summary)}
  4802. @findex gnus-summary-prev-thread
  4803. Go to the previous thread (@code{gnus-summary-prev-thread}).
  4804. @item T d
  4805. @kindex T d @r{(Summary)}
  4806. @findex gnus-summary-down-thread
  4807. Descend the thread (@code{gnus-summary-down-thread}).
  4808. @item T u
  4809. @kindex T u @r{(Summary)}
  4810. @findex gnus-summary-up-thread
  4811. Ascend the thread (@code{gnus-summary-up-thread}).
  4812. @item T o
  4813. @kindex T o @r{(Summary)}
  4814. @findex gnus-summary-top-thread
  4815. Go to the top of the thread (@code{gnus-summary-top-thread}).
  4816. @end table
  4817. @vindex gnus-thread-operation-ignore-subject
  4818. If you ignore subject while threading, you'll naturally end up with
  4819. threads that have several different subjects in them. If you then issue
  4820. a command like @kbd{T k} (@code{gnus-summary-kill-thread}) you might not
  4821. wish to kill the entire thread, but just those parts of the thread that
  4822. have the same subject as the current article. If you like this idea,
  4823. you can fiddle with @code{gnus-thread-operation-ignore-subject}. If it
  4824. is non-@code{nil} (which it is by default), subjects will be ignored
  4825. when doing thread commands. If this variable is @code{nil}, articles in
  4826. the same thread with different subjects will not be included in the
  4827. operation in question. If this variable is @code{fuzzy}, only articles
  4828. that have subjects fuzzily equal will be included (@pxref{Fuzzy
  4829. Matching}).
  4830. @node Sorting
  4831. @section Sorting
  4832. @findex gnus-thread-sort-by-total-score
  4833. @findex gnus-thread-sort-by-date
  4834. @findex gnus-thread-sort-by-score
  4835. @findex gnus-thread-sort-by-subject
  4836. @findex gnus-thread-sort-by-author
  4837. @findex gnus-thread-sort-by-number
  4838. @vindex gnus-thread-sort-functions
  4839. If you are using a threaded summary display, you can sort the threads by
  4840. setting @code{gnus-thread-sort-functions}, which can be either a single
  4841. function, a list of functions, or a list containing functions and
  4842. @code{(not some-function)} elements.
  4843. By default, sorting is done on article numbers. Ready-made sorting
  4844. predicate functions include @code{gnus-thread-sort-by-number},
  4845. @code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
  4846. @code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, and
  4847. @code{gnus-thread-sort-by-total-score}.
  4848. Each function takes two threads and returns non-@code{nil} if the first
  4849. thread should be sorted before the other. Note that sorting really is
  4850. normally done by looking only at the roots of each thread.
  4851. If you use more than one function, the primary sort key should be the
  4852. last function in the list. You should probably always include
  4853. @code{gnus-thread-sort-by-number} in the list of sorting
  4854. functions---preferably first. This will ensure that threads that are
  4855. equal with respect to the other sort criteria will be displayed in
  4856. ascending article order.
  4857. If you would like to sort by reverse score, then by subject, and finally
  4858. by number, you could do something like:
  4859. @lisp
  4860. (setq gnus-thread-sort-functions
  4861. '(gnus-thread-sort-by-number
  4862. gnus-thread-sort-by-subject
  4863. (not gnus-thread-sort-by-total-score)))
  4864. @end lisp
  4865. The threads that have highest score will be displayed first in the
  4866. summary buffer. When threads have the same score, they will be sorted
  4867. alphabetically. The threads that have the same score and the same
  4868. subject will be sorted by number, which is (normally) the sequence in
  4869. which the articles arrived.
  4870. If you want to sort by score and then reverse arrival order, you could
  4871. say something like:
  4872. @lisp
  4873. (setq gnus-thread-sort-functions
  4874. '((lambda (t1 t2)
  4875. (not (gnus-thread-sort-by-number t1 t2)))
  4876. gnus-thread-sort-by-score))
  4877. @end lisp
  4878. @vindex gnus-thread-score-function
  4879. The function in the @code{gnus-thread-score-function} variable (default
  4880. @code{+}) is used for calculating the total score of a thread. Useful
  4881. functions might be @code{max}, @code{min}, or squared means, or whatever
  4882. tickles your fancy.
  4883. @findex gnus-article-sort-functions
  4884. @findex gnus-article-sort-by-date
  4885. @findex gnus-article-sort-by-score
  4886. @findex gnus-article-sort-by-subject
  4887. @findex gnus-article-sort-by-author
  4888. @findex gnus-article-sort-by-number
  4889. If you are using an unthreaded display for some strange reason or other,
  4890. you have to fiddle with the @code{gnus-article-sort-functions} variable.
  4891. It is very similar to the @code{gnus-thread-sort-functions}, except that
  4892. it uses slightly different functions for article comparison. Available
  4893. sorting predicate functions are @code{gnus-article-sort-by-number},
  4894. @code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject},
  4895. @code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}.
  4896. If you want to sort an unthreaded summary display by subject, you could
  4897. say something like:
  4898. @lisp
  4899. (setq gnus-article-sort-functions
  4900. '(gnus-article-sort-by-number
  4901. gnus-article-sort-by-subject))
  4902. @end lisp
  4903. @node Asynchronous Fetching
  4904. @section Asynchronous Article Fetching
  4905. @cindex asynchronous article fetching
  4906. @cindex article pre-fetch
  4907. @cindex pre-fetch
  4908. If you read your news from an @sc{nntp} server that's far away, the
  4909. network latencies may make reading articles a chore. You have to wait
  4910. for a while after pressing @kbd{n} to go to the next article before the
  4911. article appears. Why can't Gnus just go ahead and fetch the article
  4912. while you are reading the previous one? Why not, indeed.
  4913. First, some caveats. There are some pitfalls to using asynchronous
  4914. article fetching, especially the way Gnus does it.
  4915. Let's say you are reading article 1, which is short, and article 2 is
  4916. quite long, and you are not interested in reading that. Gnus does not
  4917. know this, so it goes ahead and fetches article 2. You decide to read
  4918. article 3, but since Gnus is in the process of fetching article 2, the
  4919. connection is blocked.
  4920. To avoid these situations, Gnus will open two (count 'em two)
  4921. connections to the server. Some people may think this isn't a very nice
  4922. thing to do, but I don't see any real alternatives. Setting up that
  4923. extra connection takes some time, so Gnus startup will be slower.
  4924. Gnus will fetch more articles than you will read. This will mean that
  4925. the link between your machine and the @sc{nntp} server will become more
  4926. loaded than if you didn't use article pre-fetch. The server itself will
  4927. also become more loaded---both with the extra article requests, and the
  4928. extra connection.
  4929. Ok, so now you know that you shouldn't really use this thing... unless
  4930. you really want to.
  4931. @vindex gnus-asynchronous
  4932. Here's how: Set @code{gnus-asynchronous} to @code{t}. The rest should
  4933. happen automatically.
  4934. @vindex gnus-use-article-prefetch
  4935. You can control how many articles are to be pre-fetched by setting
  4936. @code{gnus-use-article-prefetch}. This is 30 by default, which means
  4937. that when you read an article in the group, the back end will pre-fetch
  4938. the next 30 articles. If this variable is @code{t}, the back end will
  4939. pre-fetch all the articles it can without bound. If it is
  4940. @code{nil}, no pre-fetching will be done.
  4941. @vindex gnus-async-prefetch-article-p
  4942. @findex gnus-async-read-p
  4943. There are probably some articles that you don't want to pre-fetch---read
  4944. articles, for instance. The @code{gnus-async-prefetch-article-p} variable controls whether an article is to be pre-fetched. This function should
  4945. return non-@code{nil} when the article in question is to be
  4946. pre-fetched. The default is @code{gnus-async-read-p}, which returns
  4947. @code{nil} on read articles. The function is called with an article
  4948. data structure as the only parameter.
  4949. If, for instance, you wish to pre-fetch only unread articles shorter than 100 lines, you could say something like:
  4950. @lisp
  4951. (defun my-async-short-unread-p (data)
  4952. "Return non-nil for short, unread articles."
  4953. (and (gnus-data-unread-p data)
  4954. (< (mail-header-lines (gnus-data-header data))
  4955. 100)))
  4956. (setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
  4957. @end lisp
  4958. These functions will be called many, many times, so they should
  4959. preferably be short and sweet to avoid slowing down Gnus too much.
  4960. It's probably a good idea to byte-compile things like this.
  4961. @vindex gnus-prefetched-article-deletion-strategy
  4962. Articles have to be removed from the asynch buffer sooner or later. The
  4963. @code{gnus-prefetched-article-deletion-strategy} says when to remove
  4964. articles. This is a list that may contain the following elements:
  4965. @table @code
  4966. @item read
  4967. Remove articles when they are read.
  4968. @item exit
  4969. Remove articles when exiting the group.
  4970. @end table
  4971. The default value is @code{(read exit)}.
  4972. @c @vindex gnus-use-header-prefetch
  4973. @c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
  4974. @c from the next group.
  4975. @node Article Caching
  4976. @section Article Caching
  4977. @cindex article caching
  4978. @cindex caching
  4979. If you have an @emph{extremely} slow @sc{nntp} connection, you may
  4980. consider turning article caching on. Each article will then be stored
  4981. locally under your home directory. As you may surmise, this could
  4982. potentially use @emph{huge} amounts of disk space, as well as eat up all
  4983. your inodes so fast it will make your head swim. In vodka.
  4984. Used carefully, though, it could be just an easier way to save articles.
  4985. @vindex gnus-use-long-file-name
  4986. @vindex gnus-cache-directory
  4987. @vindex gnus-use-cache
  4988. To turn caching on, set @code{gnus-use-cache} to @code{t}. By default,
  4989. all articles ticked or marked as dormant will then be copied
  4990. over to your local cache (@code{gnus-cache-directory}). Whether this
  4991. cache is flat or hierarchical is controlled by the
  4992. @code{gnus-use-long-file-name} variable, as usual.
  4993. When re-selecting a ticked or dormant article, it will be fetched from the
  4994. cache instead of from the server. As articles in your cache will never
  4995. expire, this might serve as a method of saving articles while still
  4996. keeping them where they belong. Just mark all articles you want to save
  4997. as dormant, and don't worry.
  4998. When an article is marked as read, is it removed from the cache.
  4999. @vindex gnus-cache-remove-articles
  5000. @vindex gnus-cache-enter-articles
  5001. The entering/removal of articles from the cache is controlled by the
  5002. @code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
  5003. variables. Both are lists of symbols. The first is @code{(ticked
  5004. dormant)} by default, meaning that ticked and dormant articles will be
  5005. put in the cache. The latter is @code{(read)} by default, meaning that
  5006. articles marked as read are removed from the cache. Possibly
  5007. symbols in these two lists are @code{ticked}, @code{dormant},
  5008. @code{unread} and @code{read}.
  5009. @findex gnus-jog-cache
  5010. So where does the massive article-fetching and storing come into the
  5011. picture? The @code{gnus-jog-cache} command will go through all
  5012. subscribed newsgroups, request all unread articles, score them, and
  5013. store them in the cache. You should only ever, ever ever ever, use this
  5014. command if 1) your connection to the @sc{nntp} server is really, really,
  5015. really slow and 2) you have a really, really, really huge disk.
  5016. Seriously. One way to cut down on the number of articles downloaded is
  5017. to score unwanted articles down and have them marked as read. They will
  5018. not then be downloaded by this command.
  5019. @vindex gnus-uncacheable-groups
  5020. @vindex gnus-cacheable-groups
  5021. It is likely that you do not want caching on all groups. For instance,
  5022. if your @code{nnml} mail is located under your home directory, it makes no
  5023. sense to cache it somewhere else under your home directory. Unless you
  5024. feel that it's neat to use twice as much space.
  5025. To limit the caching, you could set @code{gnus-cacheable-groups} to a
  5026. regexp of groups to cache, @samp{^nntp} for instance, or set the
  5027. @code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance.
  5028. Both variables are @code{nil} by default. If a group matches both
  5029. variables, the group is not cached.
  5030. @findex gnus-cache-generate-nov-databases
  5031. @findex gnus-cache-generate-active
  5032. @vindex gnus-cache-active-file
  5033. The cache stores information on what articles it contains in its active
  5034. file (@code{gnus-cache-active-file}). If this file (or any other parts
  5035. of the cache) becomes all messed up for some reason or other, Gnus
  5036. offers two functions that will try to set things right. @kbd{M-x
  5037. gnus-cache-generate-nov-databases} will (re)build all the @sc{nov}
  5038. files, and @kbd{gnus-cache-generate-active} will (re)generate the active
  5039. file.
  5040. @node Persistent Articles
  5041. @section Persistent Articles
  5042. @cindex persistent articles
  5043. Closely related to article caching, we have @dfn{persistent articles}.
  5044. In fact, it's just a different way of looking at caching, and much more
  5045. useful in my opinion.
  5046. Say you're reading a newsgroup, and you happen on to some valuable gem
  5047. that you want to keep and treasure forever. You'd normally just save it
  5048. (using one of the many saving commands) in some file. The problem with
  5049. that is that it's just, well, yucky. Ideally you'd prefer just having
  5050. the article remain in the group where you found it forever; untouched by
  5051. the expiry going on at the news server.
  5052. This is what a @dfn{persistent article} is---an article that just won't
  5053. be deleted. It's implemented using the normal cache functions, but
  5054. you use two explicit commands for managing persistent articles:
  5055. @table @kbd
  5056. @item *
  5057. @kindex * @r{(Summary)}
  5058. @findex gnus-cache-enter-article
  5059. Make the current article persistent (@code{gnus-cache-enter-article}).
  5060. @item M-*
  5061. @kindex M-* @r{(Summary)}
  5062. @findex gnus-cache-remove-article
  5063. Remove the current article from the persistent articles
  5064. (@code{gnus-cache-remove-article}). This will normally delete the
  5065. article.
  5066. @end table
  5067. Both these commands understand the process/prefix convention.
  5068. To avoid having all ticked articles (and stuff) entered into the cache,
  5069. you should set @code{gnus-use-cache} to @code{passive} if you're just
  5070. interested in persistent articles:
  5071. @lisp
  5072. (setq gnus-use-cache 'passive)
  5073. @end lisp
  5074. @node Article Backlog
  5075. @section Article Backlog
  5076. @cindex backlog
  5077. @cindex article backlog
  5078. If you have a slow connection, but the idea of using caching seems
  5079. unappealing to you (and it is, really), you can help the situation some
  5080. by switching on the @dfn{backlog}. This is where Gnus will buffer
  5081. already read articles so that it doesn't have to re-fetch articles
  5082. you've already read. This only helps if you are in the habit of
  5083. re-selecting articles you've recently read, of course. If you never do
  5084. that, turning the backlog on will slow Gnus down a little bit, and
  5085. increase memory usage some.
  5086. @vindex gnus-keep-backlog
  5087. If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
  5088. at most @var{n} old articles in a buffer for later re-fetching. If this
  5089. variable is non-@code{nil} and is not a number, Gnus will store
  5090. @emph{all} read articles, which means that your Emacs will grow without
  5091. bound before exploding and taking your machine down with you. I put
  5092. that in there just to keep y'all on your toes.
  5093. This variable is @code{nil} by default.
  5094. @node Saving Articles
  5095. @section Saving Articles
  5096. @cindex saving articles
  5097. Gnus can save articles in a number of ways. Below is the documentation
  5098. for saving articles in a fairly straight-forward fashion (i.e., little
  5099. processing of the article is done before it is saved). For a different
  5100. approach (uudecoding, unsharing) you should use @code{gnus-uu}
  5101. (@pxref{Decoding Articles}).
  5102. @vindex gnus-save-all-headers
  5103. If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
  5104. unwanted headers before saving the article.
  5105. @vindex gnus-saved-headers
  5106. If the preceding variable is @code{nil}, all headers that match the
  5107. @code{gnus-saved-headers} regexp will be kept, while the rest will be
  5108. deleted before saving.
  5109. @table @kbd
  5110. @item O o
  5111. @itemx o
  5112. @kindex O o @r{(Summary)}
  5113. @kindex o @r{(Summary)}
  5114. @findex gnus-summary-save-article
  5115. @c @icon{gnus-summary-save-article}
  5116. Save the current article using the default article saver
  5117. (@code{gnus-summary-save-article}).
  5118. @item O m
  5119. @kindex O m @r{(Summary)}
  5120. @findex gnus-summary-save-article-mail
  5121. Save the current article in mail format
  5122. (@code{gnus-summary-save-article-mail}).
  5123. @item O r
  5124. @kindex O r @r{(Summary)}
  5125. @findex gnus-summary-save-article-rmail
  5126. Save the current article in rmail format
  5127. (@code{gnus-summary-save-article-rmail}).
  5128. @item O f
  5129. @kindex O f @r{(Summary)}
  5130. @findex gnus-summary-save-article-file
  5131. @c @icon{gnus-summary-save-article-file}
  5132. Save the current article in plain file format
  5133. (@code{gnus-summary-save-article-file}).
  5134. @item O F
  5135. @kindex O F @r{(Summary)}
  5136. @findex gnus-summary-write-article-file
  5137. Write the current article in plain file format, overwriting any previous
  5138. file contents (@code{gnus-summary-write-article-file}).
  5139. @item O b
  5140. @kindex O b @r{(Summary)}
  5141. @findex gnus-summary-save-article-body-file
  5142. Save the current article body in plain file format
  5143. (@code{gnus-summary-save-article-body-file}).
  5144. @item O h
  5145. @kindex O h @r{(Summary)}
  5146. @findex gnus-summary-save-article-folder
  5147. Save the current article in mh folder format
  5148. (@code{gnus-summary-save-article-folder}).
  5149. @item O v
  5150. @kindex O v @r{(Summary)}
  5151. @findex gnus-summary-save-article-vm
  5152. Save the current article in a VM folder
  5153. (@code{gnus-summary-save-article-vm}).
  5154. @item O p
  5155. @kindex O p @r{(Summary)}
  5156. @findex gnus-summary-pipe-output
  5157. Save the current article in a pipe. Uhm, like, what I mean is---Pipe
  5158. the current article to a process (@code{gnus-summary-pipe-output}).
  5159. @end table
  5160. @vindex gnus-prompt-before-saving
  5161. All these commands use the process/prefix convention
  5162. (@pxref{Process/Prefix}). If you save bunches of articles using these
  5163. functions, you might get tired of being prompted for files to save each
  5164. and every article in. The prompting action is controlled by
  5165. the @code{gnus-prompt-before-saving} variable, which is @code{always} by
  5166. default, giving you that excessive prompting action you know and
  5167. loathe. If you set this variable to @code{t} instead, you'll be prompted
  5168. just once for each series of articles you save. If you like to really
  5169. have Gnus do all your thinking for you, you can even set this variable
  5170. to @code{nil}, which means that you will never be prompted for files to
  5171. save articles in. Gnus will simply save all the articles in the default
  5172. files.
  5173. @vindex gnus-default-article-saver
  5174. You can customize the @code{gnus-default-article-saver} variable to make
  5175. Gnus do what you want it to. You can use any of the six ready-made
  5176. functions below, or you can create your own.
  5177. @table @code
  5178. @item gnus-summary-save-in-rmail
  5179. @findex gnus-summary-save-in-rmail
  5180. @vindex gnus-rmail-save-name
  5181. @findex gnus-plain-save-name
  5182. This is the default format, @dfn{babyl}. Uses the function in the
  5183. @code{gnus-rmail-save-name} variable to get a file name to save the
  5184. article in. The default is @code{gnus-plain-save-name}.
  5185. @item gnus-summary-save-in-mail
  5186. @findex gnus-summary-save-in-mail
  5187. @vindex gnus-mail-save-name
  5188. Save in a Unix mail (mbox) file. Uses the function in the
  5189. @code{gnus-mail-save-name} variable to get a file name to save the
  5190. article in. The default is @code{gnus-plain-save-name}.
  5191. @item gnus-summary-save-in-file
  5192. @findex gnus-summary-save-in-file
  5193. @vindex gnus-file-save-name
  5194. @findex gnus-numeric-save-name
  5195. Append the article straight to an ordinary file. Uses the function in
  5196. the @code{gnus-file-save-name} variable to get a file name to save the
  5197. article in. The default is @code{gnus-numeric-save-name}.
  5198. @item gnus-summary-save-body-in-file
  5199. @findex gnus-summary-save-body-in-file
  5200. Append the article body to an ordinary file. Uses the function in the
  5201. @code{gnus-file-save-name} variable to get a file name to save the
  5202. article in. The default is @code{gnus-numeric-save-name}.
  5203. @item gnus-summary-save-in-folder
  5204. @findex gnus-summary-save-in-folder
  5205. @findex gnus-folder-save-name
  5206. @findex gnus-Folder-save-name
  5207. @vindex gnus-folder-save-name
  5208. @cindex rcvstore
  5209. @cindex MH folders
  5210. Save the article to an MH folder using @code{rcvstore} from the MH
  5211. library. Uses the function in the @code{gnus-folder-save-name} variable
  5212. to get a file name to save the article in. The default is
  5213. @code{gnus-folder-save-name}, but you can also use
  5214. @code{gnus-Folder-save-name}, which creates capitalized names.
  5215. @item gnus-summary-save-in-vm
  5216. @findex gnus-summary-save-in-vm
  5217. Save the article in a VM folder. You have to have the VM mail
  5218. reader to use this setting.
  5219. @end table
  5220. @vindex gnus-article-save-directory
  5221. All of these functions, except for the last one, will save the article
  5222. in the @code{gnus-article-save-directory}, which is initialized from the
  5223. @code{SAVEDIR} environment variable. This is @file{~/News/} by
  5224. default.
  5225. As you can see above, the functions use different functions to find a
  5226. suitable name of a file to save the article in. Below is a list of
  5227. available functions that generate names:
  5228. @table @code
  5229. @item gnus-Numeric-save-name
  5230. @findex gnus-Numeric-save-name
  5231. File names like @file{~/News/Alt.andrea-dworkin/45}.
  5232. @item gnus-numeric-save-name
  5233. @findex gnus-numeric-save-name
  5234. File names like @file{~/News/alt.andrea-dworkin/45}.
  5235. @item gnus-Plain-save-name
  5236. @findex gnus-Plain-save-name
  5237. File names like @file{~/News/Alt.andrea-dworkin}.
  5238. @item gnus-plain-save-name
  5239. @findex gnus-plain-save-name
  5240. File names like @file{~/News/alt.andrea-dworkin}.
  5241. @end table
  5242. @vindex gnus-split-methods
  5243. You can have Gnus suggest where to save articles by plonking a regexp into
  5244. the @code{gnus-split-methods} alist. For instance, if you would like to
  5245. save articles related to Gnus in the file @file{gnus-stuff}, and articles
  5246. related to VM in @code{vm-stuff}, you could set this variable to something
  5247. like:
  5248. @lisp
  5249. (("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
  5250. ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
  5251. (my-choosing-function "../other-dir/my-stuff")
  5252. ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
  5253. @end lisp
  5254. We see that this is a list where each element is a list that has two
  5255. elements---the @dfn{match} and the @dfn{file}. The match can either be
  5256. a string (in which case it is used as a regexp to match on the article
  5257. head); it can be a symbol (which will be called as a function with the
  5258. group name as a parameter); or it can be a list (which will be
  5259. @code{eval}ed). If any of these actions have a non-@code{nil} result,
  5260. the @dfn{file} will be used as a default prompt. In addition, the
  5261. result of the operation itself will be used if the function or form
  5262. called returns a string or a list of strings.
  5263. You basically end up with a list of file names that might be used when
  5264. saving the current article. (All ``matches'' will be used.) You will
  5265. then be prompted for what you really want to use as a name, with file
  5266. name completion over the results from applying this variable.
  5267. This variable is @code{((gnus-article-archive-name))} by default, which
  5268. means that Gnus will look at the articles it saves for an
  5269. @code{Archive-name} line and use that as a suggestion for the file
  5270. name.
  5271. Here's an example function to clean up file names somewhat. If you have
  5272. lots of mail groups called things like
  5273. @samp{nnml:mail.whatever}, you may want to chop off the beginning of
  5274. these group names before creating the file name to save to. The
  5275. following will do just that:
  5276. @lisp
  5277. (defun my-save-name (group)
  5278. (when (string-match "^nnml:mail." group)
  5279. (substring group (match-end 0))))
  5280. (setq gnus-split-methods
  5281. '((gnus-article-archive-name)
  5282. (my-save-name)))
  5283. @end lisp
  5284. @vindex gnus-use-long-file-name
  5285. Finally, you have the @code{gnus-use-long-file-name} variable. If it is
  5286. @code{nil}, all the preceding functions will replace all periods
  5287. (@samp{.}) in the group names with slashes (@samp{/})---which means that
  5288. the functions will generate hierarchies of directories instead of having
  5289. all the files in the top level directory
  5290. (@file{~/News/alt/andrea-dworkin} instead of
  5291. @file{~/News/alt.andrea-dworkin}.) This variable is @code{t} by default
  5292. on most systems. However, for historical reasons, this is @code{nil} on
  5293. Xenix and usg-unix-v machines by default.
  5294. This function also affects kill and score file names. If this variable
  5295. is a list, and the list contains the element @code{not-score}, long file
  5296. names will not be used for score files, if it contains the element
  5297. @code{not-save}, long file names will not be used for saving, and if it
  5298. contains the element @code{not-kill}, long file names will not be used
  5299. for kill files.
  5300. If you'd like to save articles in a hierarchy that looks something like
  5301. a spool, you could
  5302. @lisp
  5303. (setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy
  5304. (setq gnus-default-article-saver
  5305. 'gnus-summary-save-in-file) ; no encoding
  5306. @end lisp
  5307. Then just save with @kbd{o}. You'd then read this hierarchy with
  5308. ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
  5309. the top level directory as the argument (@file{~/News/}). Then just walk
  5310. around to the groups/directories with @code{nneething}.
  5311. @node Decoding Articles
  5312. @section Decoding Articles
  5313. @cindex decoding articles
  5314. Sometime users post articles (or series of articles) that have been
  5315. encoded in some way or other. Gnus can decode them for you.
  5316. @menu
  5317. * Uuencoded Articles:: Uudecode articles.
  5318. * Shell Archives:: Unshar articles.
  5319. * PostScript Files:: Split PostScript.
  5320. * Other Files:: Plain save and binhex.
  5321. * Decoding Variables:: Variables for a happy decoding.
  5322. * Viewing Files:: You want to look at the result of the decoding?
  5323. @end menu
  5324. @cindex series
  5325. @cindex article series
  5326. All these functions use the process/prefix convention
  5327. (@pxref{Process/Prefix}) for finding out what articles to work on, with
  5328. the extension that a ``single article'' means ``a single series''. Gnus
  5329. can find out by itself what articles belong to a series, decode all the
  5330. articles and unpack/view/save the resulting file(s).
  5331. Gnus guesses what articles are in the series according to the following
  5332. simplish rule: The subjects must be (nearly) identical, except for the
  5333. last two numbers of the line. (Spaces are largely ignored, however.)
  5334. For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus
  5335. will find all the articles that match the regexp @samp{^cat.gif
  5336. ([0-9]+/[0-9]+).*$}.
  5337. Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a
  5338. series}, will not be properly recognized by any of the automatic viewing
  5339. commands, and you have to mark the articles manually with @kbd{#}.
  5340. @node Uuencoded Articles
  5341. @subsection Uuencoded Articles
  5342. @cindex uudecode
  5343. @cindex uuencoded articles
  5344. @table @kbd
  5345. @item X u
  5346. @kindex X u @r{(Summary)}
  5347. @findex gnus-uu-decode-uu
  5348. @c @icon{gnus-uu-decode-uu}
  5349. Uudecodes the current series (@code{gnus-uu-decode-uu}).
  5350. @item X U
  5351. @kindex X U @r{(Summary)}
  5352. @findex gnus-uu-decode-uu-and-save
  5353. Uudecodes and saves the current series
  5354. (@code{gnus-uu-decode-uu-and-save}).
  5355. @item X v u
  5356. @kindex X v u @r{(Summary)}
  5357. @findex gnus-uu-decode-uu-view
  5358. Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
  5359. @item X v U
  5360. @kindex X v U @r{(Summary)}
  5361. @findex gnus-uu-decode-uu-and-save-view
  5362. Uudecodes, views and saves the current series
  5363. (@code{gnus-uu-decode-uu-and-save-view}).
  5364. @end table
  5365. Remember that these all react to the presence of articles marked with
  5366. the process mark. If, for instance, you'd like to decode and save an
  5367. entire newsgroup, you'd typically do @kbd{M P a}
  5368. (@code{gnus-uu-mark-all}) and then @kbd{X U}
  5369. (@code{gnus-uu-decode-uu-and-save}).
  5370. All this is very much different from how @code{gnus-uu} worked with
  5371. @sc{gnus 4.1}, where you had explicit keystrokes for everything under
  5372. the sun. This version of @code{gnus-uu} generally assumes that you mark
  5373. articles in some way (@pxref{Setting Process Marks}) and then press
  5374. @kbd{X u}.
  5375. @vindex gnus-uu-notify-files
  5376. Note: When trying to decode articles that have names matching
  5377. @code{gnus-uu-notify-files}, which is hard-coded to
  5378. @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
  5379. automatically post an article on @samp{comp.unix.wizards} saying that
  5380. you have just viewed the file in question. This feature can't be turned
  5381. off.
  5382. @node Shell Archives
  5383. @subsection Shell Archives
  5384. @cindex unshar
  5385. @cindex shell archives
  5386. @cindex shared articles
  5387. Shell archives (``shar files'') used to be a popular way to distribute
  5388. sources, but it isn't used all that much today. In any case, we have
  5389. some commands to deal with these:
  5390. @table @kbd
  5391. @item X s
  5392. @kindex X s @r{(Summary)}
  5393. @findex gnus-uu-decode-unshar
  5394. Unshars the current series (@code{gnus-uu-decode-unshar}).
  5395. @item X S
  5396. @kindex X S @r{(Summary)}
  5397. @findex gnus-uu-decode-unshar-and-save
  5398. Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
  5399. @item X v s
  5400. @kindex X v s @r{(Summary)}
  5401. @findex gnus-uu-decode-unshar-view
  5402. Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
  5403. @item X v S
  5404. @kindex X v S @r{(Summary)}
  5405. @findex gnus-uu-decode-unshar-and-save-view
  5406. Unshars, views and saves the current series
  5407. (@code{gnus-uu-decode-unshar-and-save-view}).
  5408. @end table
  5409. @node PostScript Files
  5410. @subsection PostScript Files
  5411. @cindex PostScript
  5412. @table @kbd
  5413. @item X p
  5414. @kindex X p @r{(Summary)}
  5415. @findex gnus-uu-decode-postscript
  5416. Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
  5417. @item X P
  5418. @kindex X P @r{(Summary)}
  5419. @findex gnus-uu-decode-postscript-and-save
  5420. Unpack and save the current PostScript series
  5421. (@code{gnus-uu-decode-postscript-and-save}).
  5422. @item X v p
  5423. @kindex X v p @r{(Summary)}
  5424. @findex gnus-uu-decode-postscript-view
  5425. View the current PostScript series
  5426. (@code{gnus-uu-decode-postscript-view}).
  5427. @item X v P
  5428. @kindex X v P @r{(Summary)}
  5429. @findex gnus-uu-decode-postscript-and-save-view
  5430. View and save the current PostScript series
  5431. (@code{gnus-uu-decode-postscript-and-save-view}).
  5432. @end table
  5433. @node Other Files
  5434. @subsection Other Files
  5435. @table @kbd
  5436. @item X o
  5437. @kindex X o @r{(Summary)}
  5438. @findex gnus-uu-decode-save
  5439. Save the current series
  5440. (@code{gnus-uu-decode-save}).
  5441. @item X b
  5442. @kindex X b @r{(Summary)}
  5443. @findex gnus-uu-decode-binhex
  5444. Unbinhex the current series (@code{gnus-uu-decode-binhex}). This
  5445. doesn't really work yet.
  5446. @end table
  5447. @node Decoding Variables
  5448. @subsection Decoding Variables
  5449. Adjective, not verb.
  5450. @menu
  5451. * Rule Variables:: Variables that say how a file is to be viewed.
  5452. * Other Decode Variables:: Other decode variables.
  5453. * Uuencoding and Posting:: Variables for customizing uuencoding.
  5454. @end menu
  5455. @node Rule Variables
  5456. @subsubsection Rule Variables
  5457. @cindex rule variables
  5458. Gnus uses @dfn{rule variables} to decide how to view a file. All these
  5459. variables are of the form
  5460. @lisp
  5461. (list '(regexp1 command2)
  5462. '(regexp2 command2)
  5463. ...)
  5464. @end lisp
  5465. @table @code
  5466. @item gnus-uu-user-view-rules
  5467. @vindex gnus-uu-user-view-rules
  5468. @cindex sox
  5469. This variable is consulted first when viewing files. If you wish to use,
  5470. for instance, @code{sox} to convert an @samp{.au} sound file, you could
  5471. say something like:
  5472. @lisp
  5473. (setq gnus-uu-user-view-rules
  5474. (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio")))
  5475. @end lisp
  5476. @item gnus-uu-user-view-rules-end
  5477. @vindex gnus-uu-user-view-rules-end
  5478. This variable is consulted if Gnus couldn't make any matches from the
  5479. user and default view rules.
  5480. @item gnus-uu-user-archive-rules
  5481. @vindex gnus-uu-user-archive-rules
  5482. This variable can be used to say what commands should be used to unpack
  5483. archives.
  5484. @end table
  5485. @node Other Decode Variables
  5486. @subsubsection Other Decode Variables
  5487. @table @code
  5488. @vindex gnus-uu-grabbed-file-functions
  5489. @item gnus-uu-grabbed-file-functions
  5490. All functions in this list will be called right after each file has been
  5491. successfully decoded---so that you can move or view files right away,
  5492. and don't have to wait for all files to be decoded before you can do
  5493. anything. Ready-made functions you can put in this list are:
  5494. @table @code
  5495. @item gnus-uu-grab-view
  5496. @findex gnus-uu-grab-view
  5497. View the file.
  5498. @item gnus-uu-grab-move
  5499. @findex gnus-uu-grab-move
  5500. Move the file (if you're using a saving function.)
  5501. @end table
  5502. @item gnus-uu-be-dangerous
  5503. @vindex gnus-uu-be-dangerous
  5504. Specifies what to do if unusual situations arise during decoding. If
  5505. @code{nil}, be as conservative as possible. If @code{t}, ignore things
  5506. that didn't work, and overwrite existing files. Otherwise, ask each
  5507. time.
  5508. @item gnus-uu-ignore-files-by-name
  5509. @vindex gnus-uu-ignore-files-by-name
  5510. Files with name matching this regular expression won't be viewed.
  5511. @item gnus-uu-ignore-files-by-type
  5512. @vindex gnus-uu-ignore-files-by-type
  5513. Files with a @sc{mime} type matching this variable won't be viewed.
  5514. Note that Gnus tries to guess what type the file is based on the name.
  5515. @code{gnus-uu} is not a @sc{mime} package (yet), so this is slightly
  5516. kludgey.
  5517. @item gnus-uu-tmp-dir
  5518. @vindex gnus-uu-tmp-dir
  5519. Where @code{gnus-uu} does its work.
  5520. @item gnus-uu-do-not-unpack-archives
  5521. @vindex gnus-uu-do-not-unpack-archives
  5522. Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
  5523. looking for files to display.
  5524. @item gnus-uu-view-and-save
  5525. @vindex gnus-uu-view-and-save
  5526. Non-@code{nil} means that the user will always be asked to save a file
  5527. after viewing it.
  5528. @item gnus-uu-ignore-default-view-rules
  5529. @vindex gnus-uu-ignore-default-view-rules
  5530. Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
  5531. rules.
  5532. @item gnus-uu-ignore-default-archive-rules
  5533. @vindex gnus-uu-ignore-default-archive-rules
  5534. Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
  5535. unpacking commands.
  5536. @item gnus-uu-kill-carriage-return
  5537. @vindex gnus-uu-kill-carriage-return
  5538. Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
  5539. from articles.
  5540. @item gnus-uu-unmark-articles-not-decoded
  5541. @vindex gnus-uu-unmark-articles-not-decoded
  5542. Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully
  5543. decoded articles as unread.
  5544. @item gnus-uu-correct-stripped-uucode
  5545. @vindex gnus-uu-correct-stripped-uucode
  5546. Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
  5547. uuencoded files that have had trailing spaces deleted.
  5548. @item gnus-uu-pre-uudecode-hook
  5549. @vindex gnus-uu-pre-uudecode-hook
  5550. Hook run before sending a message to @code{uudecode}.
  5551. @item gnus-uu-view-with-metamail
  5552. @vindex gnus-uu-view-with-metamail
  5553. @cindex metamail
  5554. Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
  5555. commands defined by the rule variables and just fudge a @sc{mime}
  5556. content type based on the file name. The result will be fed to
  5557. @code{metamail} for viewing.
  5558. @item gnus-uu-save-in-digest
  5559. @vindex gnus-uu-save-in-digest
  5560. Non-@code{nil} means that @code{gnus-uu}, when asked to save without
  5561. decoding, will save in digests. If this variable is @code{nil},
  5562. @code{gnus-uu} will just save everything in a file without any
  5563. embellishments. The digesting almost conforms to RFC 1153---no easy way
  5564. to specify any meaningful volume and issue numbers were found, so I
  5565. simply dropped them.
  5566. @end table
  5567. @node Uuencoding and Posting
  5568. @subsubsection Uuencoding and Posting
  5569. @table @code
  5570. @item gnus-uu-post-include-before-composing
  5571. @vindex gnus-uu-post-include-before-composing
  5572. Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
  5573. before you compose the article. If this variable is @code{t}, you can
  5574. either include an encoded file with @kbd{C-c C-i} or have one included
  5575. for you when you post the article.
  5576. @item gnus-uu-post-length
  5577. @vindex gnus-uu-post-length
  5578. Maximum length of an article. The encoded file will be split into how
  5579. many articles it takes to post the entire file.
  5580. @item gnus-uu-post-threaded
  5581. @vindex gnus-uu-post-threaded
  5582. Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
  5583. thread. This may not be smart, as no other decoder I have seen is able
  5584. to follow threads when collecting uuencoded articles. (Well, I have
  5585. seen one package that does that---@code{gnus-uu}, but somehow, I don't
  5586. think that counts...) Default is @code{nil}.
  5587. @item gnus-uu-post-separate-description
  5588. @vindex gnus-uu-post-separate-description
  5589. Non-@code{nil} means that the description will be posted in a separate
  5590. article. The first article will typically be numbered (0/x). If this
  5591. variable is @code{nil}, the description the user enters will be included
  5592. at the beginning of the first article, which will be numbered (1/x).
  5593. Default is @code{t}.
  5594. @end table
  5595. @node Viewing Files
  5596. @subsection Viewing Files
  5597. @cindex viewing files
  5598. @cindex pseudo-articles
  5599. After decoding, if the file is some sort of archive, Gnus will attempt
  5600. to unpack the archive and see if any of the files in the archive can be
  5601. viewed. For instance, if you have a gzipped tar file @file{pics.tar.gz}
  5602. containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will
  5603. uncompress and de-tar the main file, and then view the two pictures.
  5604. This unpacking process is recursive, so if the archive contains archives
  5605. of archives, it'll all be unpacked.
  5606. Finally, Gnus will normally insert a @dfn{pseudo-article} for each
  5607. extracted file into the summary buffer. If you go to these
  5608. ``articles'', you will be prompted for a command to run (usually Gnus
  5609. will make a suggestion), and then the command will be run.
  5610. @vindex gnus-view-pseudo-asynchronously
  5611. If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
  5612. until the viewing is done before proceeding.
  5613. @vindex gnus-view-pseudos
  5614. If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
  5615. the pseudo-articles into the summary buffer, but view them
  5616. immediately. If this variable is @code{not-confirm}, the user won't even
  5617. be asked for a confirmation before viewing is done.
  5618. @vindex gnus-view-pseudos-separately
  5619. If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
  5620. pseudo-article will be created for each file to be viewed. If
  5621. @code{nil}, all files that use the same viewing command will be given as
  5622. a list of parameters to that command.
  5623. @vindex gnus-insert-pseudo-articles
  5624. If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
  5625. pseudo-articles when decoding. It is @code{t} by default.
  5626. So; there you are, reading your @emph{pseudo-articles} in your
  5627. @emph{virtual newsgroup} from the @emph{virtual server}; and you think:
  5628. Why isn't anything real anymore? How did we get here?
  5629. @node Article Treatment
  5630. @section Article Treatment
  5631. Reading through this huge manual, you may have quite forgotten that the
  5632. object of newsreaders is to actually, like, read what people have
  5633. written. Reading articles. Unfortunately, people are quite bad at
  5634. writing, so there are tons of functions and variables to make reading
  5635. these articles easier.
  5636. @menu
  5637. * Article Highlighting:: You want to make the article look like fruit salad.
  5638. * Article Fontisizing:: Making emphasized text look nice.
  5639. * Article Hiding:: You also want to make certain info go away.
  5640. * Article Washing:: Lots of way-neat functions to make life better.
  5641. * Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
  5642. * Article Date:: Grumble, UT!
  5643. * Article Signature:: What is a signature?
  5644. * Article Miscellania:: Various other stuff.
  5645. @end menu
  5646. @node Article Highlighting
  5647. @subsection Article Highlighting
  5648. @cindex highlighting
  5649. Not only do you want your article buffer to look like fruit salad, but
  5650. you want it to look like technicolor fruit salad.
  5651. @table @kbd
  5652. @item W H a
  5653. @kindex W H a @r{(Summary)}
  5654. @findex gnus-article-highlight
  5655. @findex gnus-article-maybe-highlight
  5656. Do much highlighting of the current article
  5657. (@code{gnus-article-highlight}). This function highlights header, cited
  5658. text, the signature, and adds buttons to the body and the head.
  5659. @item W H h
  5660. @kindex W H h @r{(Summary)}
  5661. @findex gnus-article-highlight-headers
  5662. @vindex gnus-header-face-alist
  5663. Highlight the headers (@code{gnus-article-highlight-headers}). The
  5664. highlighting will be done according to the @code{gnus-header-face-alist}
  5665. variable, which is a list where each element has the form
  5666. @code{(@var{regexp} @var{name} @var{content})}.
  5667. @var{regexp} is a regular expression for matching the
  5668. header, @var{name} is the face used for highlighting the header name
  5669. (@pxref{Faces and Fonts}) and @var{content} is the face for highlighting
  5670. the header value. The first match made will be used. Note that
  5671. @var{regexp} shouldn't have @samp{^} prepended---Gnus will add one.
  5672. @item W H c
  5673. @kindex W H c @r{(Summary)}
  5674. @findex gnus-article-highlight-citation
  5675. Highlight cited text (@code{gnus-article-highlight-citation}).
  5676. Some variables to customize the citation highlights:
  5677. @table @code
  5678. @vindex gnus-cite-parse-max-size
  5679. @item gnus-cite-parse-max-size
  5680. If the article size if bigger than this variable (which is 25000 by
  5681. default), no citation highlighting will be performed.
  5682. @item gnus-cite-prefix-regexp
  5683. @vindex gnus-cite-prefix-regexp
  5684. Regexp matching the longest possible citation prefix on a line.
  5685. @item gnus-cite-max-prefix
  5686. @vindex gnus-cite-max-prefix
  5687. Maximum possible length for a citation prefix (default 20).
  5688. @item gnus-cite-face-list
  5689. @vindex gnus-cite-face-list
  5690. List of faces used for highlighting citations (@pxref{Faces and Fonts}).
  5691. When there are citations from multiple articles in the same message,
  5692. Gnus will try to give each citation from each article its own face.
  5693. This should make it easier to see who wrote what.
  5694. @item gnus-supercite-regexp
  5695. @vindex gnus-supercite-regexp
  5696. Regexp matching normal Supercite attribution lines.
  5697. @item gnus-supercite-secondary-regexp
  5698. @vindex gnus-supercite-secondary-regexp
  5699. Regexp matching mangled Supercite attribution lines.
  5700. @item gnus-cite-minimum-match-count
  5701. @vindex gnus-cite-minimum-match-count
  5702. Minimum number of identical prefixes we have to see before we believe
  5703. that it's a citation.
  5704. @item gnus-cite-attribution-prefix
  5705. @vindex gnus-cite-attribution-prefix
  5706. Regexp matching the beginning of an attribution line.
  5707. @item gnus-cite-attribution-suffix
  5708. @vindex gnus-cite-attribution-suffix
  5709. Regexp matching the end of an attribution line.
  5710. @item gnus-cite-attribution-face
  5711. @vindex gnus-cite-attribution-face
  5712. Face used for attribution lines. It is merged with the face for the
  5713. cited text belonging to the attribution.
  5714. @end table
  5715. @item W H s
  5716. @kindex W H s @r{(Summary)}
  5717. @vindex gnus-signature-separator
  5718. @vindex gnus-signature-face
  5719. @findex gnus-article-highlight-signature
  5720. Highlight the signature (@code{gnus-article-highlight-signature}).
  5721. Everything after @code{gnus-signature-separator} (@pxref{Article
  5722. Signature}) in an article will be considered a signature and will be
  5723. highlighted with @code{gnus-signature-face}, which is @code{italic} by
  5724. default.
  5725. @end table
  5726. @xref{Customizing Articles}, for how to highlight articles automatically.
  5727. @node Article Fontisizing
  5728. @subsection Article Fontisizing
  5729. @cindex emphasis
  5730. @cindex article emphasis
  5731. @findex gnus-article-emphasize
  5732. @kindex W e @r{(Summary)}
  5733. People commonly add emphasis to words in news articles by writing things
  5734. like @samp{_this_} or @samp{*this*} or @samp{/this/}. Gnus can make
  5735. this look nicer by running the article through the @kbd{W e}
  5736. (@code{gnus-article-emphasize}) command.
  5737. @vindex gnus-emphasis-alist
  5738. How the emphasis is computed is controlled by the
  5739. @code{gnus-emphasis-alist} variable. This is an alist where the first
  5740. element is a regular expression to be matched. The second is a number
  5741. that says what regular expression grouping is used to find the entire
  5742. emphasized word. The third is a number that says what regexp grouping
  5743. should be displayed and highlighted. (The text between these two
  5744. groupings will be hidden.) The fourth is the face used for
  5745. highlighting.
  5746. @lisp
  5747. (setq gnus-article-emphasis
  5748. '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
  5749. ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
  5750. @end lisp
  5751. @cindex slash
  5752. @cindex asterisk
  5753. @cindex underline
  5754. @cindex /
  5755. @cindex *
  5756. @vindex gnus-emphasis-underline
  5757. @vindex gnus-emphasis-bold
  5758. @vindex gnus-emphasis-italic
  5759. @vindex gnus-emphasis-underline-bold
  5760. @vindex gnus-emphasis-underline-italic
  5761. @vindex gnus-emphasis-bold-italic
  5762. @vindex gnus-emphasis-underline-bold-italic
  5763. By default, there are seven rules, and they use the following faces:
  5764. @code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
  5765. @code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
  5766. @code{gnus-emphasis-underline-italic},
  5767. @code{gnus-emphasis-underline-bold}, and
  5768. @code{gnus-emphasis-underline-bold-italic}.
  5769. If you want to change these faces, you can either use @kbd{M-x
  5770. customize}, or you can use @code{copy-face}. For instance, if you want
  5771. to make @code{gnus-emphasis-italic} use a red face instead, you could
  5772. say something like:
  5773. @lisp
  5774. (copy-face 'red 'gnus-emphasis-italic)
  5775. @end lisp
  5776. @vindex gnus-group-highlight-words-alist
  5777. If you want to highlight arbitrary words, you can use the
  5778. @code{gnus-group-highlight-words-alist} variable, which uses the same
  5779. syntax as @code{gnus-emphasis-alist}. The @code{highlight-words} group
  5780. parameter (@pxref{Group Parameters}) can also be used.
  5781. @xref{Customizing Articles}, for how to fontize articles automatically.
  5782. @node Article Hiding
  5783. @subsection Article Hiding
  5784. @cindex article hiding
  5785. Or rather, hiding certain things in each article. There usually is much
  5786. too much cruft in most articles.
  5787. @table @kbd
  5788. @item W W a
  5789. @kindex W W a @r{(Summary)}
  5790. @findex gnus-article-hide
  5791. Do quite a lot of hiding on the article buffer
  5792. (@kbd{gnus-article-hide}). In particular, this function will hide
  5793. headers, PGP, cited text and the signature.
  5794. @item W W h
  5795. @kindex W W h @r{(Summary)}
  5796. @findex gnus-article-hide-headers
  5797. Hide headers (@code{gnus-article-hide-headers}). @xref{Hiding
  5798. Headers}.
  5799. @item W W b
  5800. @kindex W W b @r{(Summary)}
  5801. @findex gnus-article-hide-boring-headers
  5802. Hide headers that aren't particularly interesting
  5803. (@code{gnus-article-hide-boring-headers}). @xref{Hiding Headers}.
  5804. @item W W s
  5805. @kindex W W s @r{(Summary)}
  5806. @findex gnus-article-hide-signature
  5807. Hide signature (@code{gnus-article-hide-signature}). @xref{Article
  5808. Signature}.
  5809. @item W W l
  5810. @kindex W W l @r{(Summary)}
  5811. @findex gnus-article-hide-list-identifiers
  5812. @vindex gnus-list-identifiers
  5813. Strip list identifiers specified in @code{gnus-list-identifiers}. These
  5814. are strings some mailing list servers add to the beginning of all
  5815. @code{Subject} headers---for example, @samp{[zebra 4711]}. Any leading
  5816. @samp{Re: } is skipped before stripping. @code{gnus-list-identifiers}
  5817. may not contain @code{\\(..\\)}.
  5818. @table @code
  5819. @item gnus-list-identifiers
  5820. @vindex gnus-list-identifiers
  5821. A regular expression that matches list identifiers to be removed from
  5822. subject. This can also be a list of regular expressions.
  5823. @end table
  5824. @item W W p
  5825. @kindex W W p @r{(Summary)}
  5826. @findex gnus-article-hide-pgp
  5827. @vindex gnus-article-hide-pgp-hook
  5828. Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}). The
  5829. @code{gnus-article-hide-pgp-hook} hook will be run after a @sc{pgp}
  5830. signature has been hidden. For example, to automatically verify
  5831. articles that have signatures in them do:
  5832. @lisp
  5833. ;;; Hide pgp cruft if any.
  5834. (setq gnus-treat-strip-pgp t)
  5835. ;;; After hiding pgp, verify the message;
  5836. ;;; only happens if pgp signature is found.
  5837. (add-hook 'gnus-article-hide-pgp-hook
  5838. (lambda ()
  5839. (save-excursion
  5840. (set-buffer gnus-original-article-buffer)
  5841. (mc-verify))))
  5842. @end lisp
  5843. @item W W P
  5844. @kindex W W P @r{(Summary)}
  5845. @findex gnus-article-hide-pem
  5846. Hide @sc{pem} (privacy enhanced messages) cruft
  5847. (@code{gnus-article-hide-pem}).
  5848. @item W W B
  5849. @kindex W W B @r{(Summary)}
  5850. @findex gnus-article-strip-banner
  5851. @cindex banner
  5852. @cindex OneList
  5853. @cindex stripping advertisements
  5854. @cindex advertisements
  5855. Strip the banner specified by the @code{banner} group parameter
  5856. (@code{gnus-article-strip-banner}). This is mainly used to hide those
  5857. annoying banners and/or signatures that some mailing lists and moderated
  5858. groups adds to all the messages. The way to use this function is to add
  5859. the @code{banner} group parameter (@pxref{Group Parameters}) to the
  5860. group you want banners stripped from. The parameter either be a string,
  5861. which will be interpreted as a regular expression matching text to be
  5862. removed, or the symbol @code{signature}, meaning that the (last)
  5863. signature should be removed, or other symbol, meaning that the
  5864. corresponding regular expression in @code{gnus-article-banner-alist} is
  5865. used.
  5866. @item W W c
  5867. @kindex W W c @r{(Summary)}
  5868. @findex gnus-article-hide-citation
  5869. Hide citation (@code{gnus-article-hide-citation}). Some variables for
  5870. customizing the hiding:
  5871. @table @code
  5872. @item gnus-cited-opened-text-button-line-format
  5873. @itemx gnus-cited-closed-text-button-line-format
  5874. @vindex gnus-cited-closed-text-button-line-format
  5875. @vindex gnus-cited-opened-text-button-line-format
  5876. Gnus adds buttons to show where the cited text has been hidden, and to
  5877. allow toggle hiding the text. The format of the variable is specified
  5878. by these format-like variable (@pxref{Formatting Variables}). These
  5879. specs are valid:
  5880. @table @samp
  5881. @item b
  5882. Starting point of the hidden text.
  5883. @item e
  5884. Ending point of the hidden text.
  5885. @item l
  5886. Number of characters in the hidden region.
  5887. @item n
  5888. Number of lines of hidden text.
  5889. @end table
  5890. @item gnus-cited-lines-visible
  5891. @vindex gnus-cited-lines-visible
  5892. The number of lines at the beginning of the cited text to leave
  5893. shown. This can also be a cons cell with the number of lines at the top
  5894. and bottom of the text, respectively, to remain visible.
  5895. @end table
  5896. @item W W C-c
  5897. @kindex W W C-c @r{(Summary)}
  5898. @findex gnus-article-hide-citation-maybe
  5899. Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the
  5900. following two variables:
  5901. @table @code
  5902. @item gnus-cite-hide-percentage
  5903. @vindex gnus-cite-hide-percentage
  5904. If the cited text is of a bigger percentage than this variable (default
  5905. 50), hide the cited text.
  5906. @item gnus-cite-hide-absolute
  5907. @vindex gnus-cite-hide-absolute
  5908. The cited text must have at least this length (default 10) before it
  5909. is hidden.
  5910. @end table
  5911. @item W W C
  5912. @kindex W W C @r{(Summary)}
  5913. @findex gnus-article-hide-citation-in-followups
  5914. Hide cited text in articles that aren't roots
  5915. (@code{gnus-article-hide-citation-in-followups}). This isn't very
  5916. useful as an interactive command, but might be a handy function to stick
  5917. have happen automatically (@pxref{Customizing Articles}).
  5918. @end table
  5919. All these ``hiding'' commands are toggles, but if you give a negative
  5920. prefix to these commands, they will show what they have previously
  5921. hidden. If you give a positive prefix, they will always hide.
  5922. Also @pxref{Article Highlighting} for further variables for
  5923. citation customization.
  5924. @xref{Customizing Articles}, for how to hide article elements
  5925. automatically.
  5926. @node Article Washing
  5927. @subsection Article Washing
  5928. @cindex washing
  5929. @cindex article washing
  5930. We call this ``article washing'' for a really good reason. Namely, the
  5931. @kbd{A} key was taken, so we had to use the @kbd{W} key instead.
  5932. @dfn{Washing} is defined by us as ``changing something from something to
  5933. something else'', but normally results in something looking better.
  5934. Cleaner, perhaps.
  5935. @xref{Customizing Articles}, if you want to change how Gnus displays
  5936. articles by default.
  5937. @table @kbd
  5938. @item C-u g
  5939. This is not really washing, it's sort of the opposite of washing. If
  5940. you type this, you see the article exactly as it exists on disk or on
  5941. the server.
  5942. @item W l
  5943. @kindex W l @r{(Summary)}
  5944. @findex gnus-summary-stop-page-breaking
  5945. Remove page breaks from the current article
  5946. (@code{gnus-summary-stop-page-breaking}). @xref{Misc Article}, for page
  5947. delimiters.
  5948. @item W r
  5949. @kindex W r @r{(Summary)}
  5950. @findex gnus-summary-caesar-message
  5951. @c @icon{gnus-summary-caesar-message}
  5952. Do a Caesar rotate (rot13) on the article buffer
  5953. (@code{gnus-summary-caesar-message}).
  5954. Unreadable articles that tell you to read them with Caesar rotate or rot13.
  5955. (Typically offensive jokes and such.)
  5956. It's commonly called @dfn{rot13} because each letter is rotated 13
  5957. positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter
  5958. #15). It is sometimes referred to as ``Caesar rotate'' because Caesar
  5959. is rumored to have employed this form of, uh, somewhat weak encryption.
  5960. @item W t
  5961. @item t
  5962. @kindex W t @r{(Summary)}
  5963. @kindex t @r{(Summary)}
  5964. @findex gnus-summary-toggle-header
  5965. Toggle whether to display all headers in the article buffer
  5966. (@code{gnus-summary-toggle-header}).
  5967. @item W v
  5968. @kindex W v @r{(Summary)}
  5969. @findex gnus-summary-verbose-header
  5970. Toggle whether to display all headers in the article buffer permanently
  5971. (@code{gnus-summary-verbose-header}).
  5972. @item W o
  5973. @kindex W o @r{(Summary)}
  5974. @findex gnus-article-treat-overstrike
  5975. Treat overstrike (@code{gnus-article-treat-overstrike}).
  5976. @item W d
  5977. @kindex W d @r{(Summary)}
  5978. @findex gnus-article-treat-dumbquotes
  5979. @vindex gnus-article-dumbquotes-map
  5980. @cindex Smartquotes
  5981. @cindex M******** sm*rtq**t*s
  5982. @cindex Latin 1
  5983. Treat M******** sm*rtq**t*s according to
  5984. @code{gnus-article-dumbquotes-map}
  5985. (@code{gnus-article-treat-dumbquotes}). Note that this function guesses
  5986. whether a character is a sm*rtq**t* or not, so it should only be used
  5987. interactively.
  5988. In reality, this function is translates a subset of the subset of the
  5989. @code{cp1252} (or @code{Windows-1252}) character set that isn't in ISO
  5990. Latin-1, including the quote characters @code{\222} and @code{\264}.
  5991. Messages in this character set often have a MIME header saying that
  5992. they are Latin-1.
  5993. @item W w
  5994. @kindex W w @r{(Summary)}
  5995. @findex gnus-article-fill-cited-article
  5996. Do word wrap (@code{gnus-article-fill-cited-article}).
  5997. You can give the command a numerical prefix to specify the width to use
  5998. when filling.
  5999. @item W Q
  6000. @kindex W Q @r{(Summary)}
  6001. @findex gnus-article-fill-long-lines
  6002. Fill long lines (@code{gnus-article-fill-long-lines}).
  6003. @item W C
  6004. @kindex W C @r{(Summary)}
  6005. @findex gnus-article-capitalize-sentences
  6006. Capitalize the first word in each sentence
  6007. (@code{gnus-article-capitalize-sentences}).
  6008. @item W c
  6009. @kindex W c @r{(Summary)}
  6010. @findex gnus-article-remove-cr
  6011. Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF
  6012. (this takes care of DOS line endings), and then translate any remaining
  6013. CRs into LF (this takes care of Mac line endings)
  6014. (@code{gnus-article-remove-cr}).
  6015. @item W q
  6016. @kindex W q @r{(Summary)}
  6017. @findex gnus-article-de-quoted-unreadable
  6018. Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
  6019. Quoted-Printable is one common @sc{mime} encoding employed when sending
  6020. non-ASCII (i. e., 8-bit) articles. It typically makes strings like
  6021. @samp{déjà vu} look like @samp{d=E9j=E0 vu}, which doesn't look very
  6022. readable to me. Note that the this is usually done automatically by
  6023. Gnus if the message in question has a @code{Content-Transfer-Encoding}
  6024. header that says that this encoding has been done.
  6025. @item W 6
  6026. @kindex W 6 @r{(Summary)}
  6027. @findex gnus-article-de-base64-unreadable
  6028. Treat base64 (@code{gnus-article-de-base64-unreadable}).
  6029. Base64 is one common @sc{mime} encoding employed when sending non-ASCII
  6030. (i. e., 8-bit) articles. Note that the this is usually done
  6031. automatically by Gnus if the message in question has a
  6032. @code{Content-Transfer-Encoding} header that says that this encoding has
  6033. been done.
  6034. @item W Z
  6035. @kindex W Z @r{(Summary)}
  6036. @findex gnus-article-decode-HZ
  6037. Treat HZ or HZP (@code{gnus-article-decode-HZ}). HZ (or HZP) is one
  6038. common encoding employed when sending Chinese articles. It typically
  6039. makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}.
  6040. @item W h
  6041. @kindex W h @r{(Summary)}
  6042. @findex gnus-article-wash-html
  6043. Treat HTML (@code{gnus-article-wash-html}).
  6044. Note that the this is usually done automatically by Gnus if the message
  6045. in question has a @code{Content-Type} header that says that this type
  6046. has been done.
  6047. @item W f
  6048. @kindex W f @r{(Summary)}
  6049. @cindex x-face
  6050. @findex gnus-article-display-x-face
  6051. @findex gnus-article-x-face-command
  6052. @vindex gnus-article-x-face-command
  6053. @vindex gnus-article-x-face-too-ugly
  6054. @iftex
  6055. @iflatex
  6056. \include{xface}
  6057. @end iflatex
  6058. @end iftex
  6059. @anchor{X-Face}
  6060. Look for and display any X-Face headers
  6061. (@code{gnus-article-display-x-face}). The command executed by this
  6062. function is given by the @code{gnus-article-x-face-command} variable.
  6063. If this variable is a string, this string will be executed in a
  6064. sub-shell. If it is a function, this function will be called with the
  6065. face as the argument. If the @code{gnus-article-x-face-too-ugly} (which
  6066. is a regexp) matches the @code{From} header, the face will not be shown.
  6067. The default action under Emacs is to fork off the @code{display}
  6068. program@footnote{@code{display} is from the ImageMagick package. For the
  6069. @code{uncompface} and @code{icontopbm} programs look for a package
  6070. like `compface' or `faces-xface' on a GNU/Linux system.}
  6071. to view the face. Under XEmacs or Emacs 21+ with suitable image
  6072. support, the default action is to display the face before the
  6073. @code{From} header. (It's nicer if XEmacs has been compiled with X-Face
  6074. support---that will make display somewhat faster. If there's no native
  6075. X-Face support, Gnus will try to convert the @code{X-Face} header using
  6076. external programs from the @code{pbmplus} package and
  6077. friends.@footnote{On a GNU/Linux system look for packages with names
  6078. like @code{netpbm} or @code{libgr-progs}.}) If you
  6079. want to have this function in the display hook, it should probably come
  6080. last.
  6081. @item W b
  6082. @kindex W b @r{(Summary)}
  6083. @findex gnus-article-add-buttons
  6084. Add clickable buttons to the article (@code{gnus-article-add-buttons}).
  6085. @xref{Article Buttons}.
  6086. @item W B
  6087. @kindex W B @r{(Summary)}
  6088. @findex gnus-article-add-buttons-to-head
  6089. Add clickable buttons to the article headers
  6090. (@code{gnus-article-add-buttons-to-head}).
  6091. @item W W H
  6092. @kindex W W H @r{(Summary)}
  6093. @findex gnus-article-strip-headers-from-body
  6094. Strip headers like the @code{X-No-Archive} header from the beginning of
  6095. article bodies (@code{gnus-article-strip-headers-from-body}).
  6096. @item W E l
  6097. @kindex W E l @r{(Summary)}
  6098. @findex gnus-article-strip-leading-blank-lines
  6099. Remove all blank lines from the beginning of the article
  6100. (@code{gnus-article-strip-leading-blank-lines}).
  6101. @item W E m
  6102. @kindex W E m @r{(Summary)}
  6103. @findex gnus-article-strip-multiple-blank-lines
  6104. Replace all blank lines with empty lines and then all multiple empty
  6105. lines with a single empty line.
  6106. (@code{gnus-article-strip-multiple-blank-lines}).
  6107. @item W E t
  6108. @kindex W E t @r{(Summary)}
  6109. @findex gnus-article-remove-trailing-blank-lines
  6110. Remove all blank lines at the end of the article
  6111. (@code{gnus-article-remove-trailing-blank-lines}).
  6112. @item W E a
  6113. @kindex W E a @r{(Summary)}
  6114. @findex gnus-article-strip-blank-lines
  6115. Do all the three commands above
  6116. (@code{gnus-article-strip-blank-lines}).
  6117. @item W E A
  6118. @kindex W E A @r{(Summary)}
  6119. @findex gnus-article-strip-all-blank-lines
  6120. Remove all blank lines
  6121. (@code{gnus-article-strip-all-blank-lines}).
  6122. @item W E s
  6123. @kindex W E s @r{(Summary)}
  6124. @findex gnus-article-strip-leading-space
  6125. Remove all white space from the beginning of all lines of the article
  6126. body (@code{gnus-article-strip-leading-space}).
  6127. @item W E e
  6128. @kindex W E e @r{(Summary)}
  6129. @findex gnus-article-strip-trailing-space
  6130. Remove all white space from the end of all lines of the article
  6131. body (@code{gnus-article-strip-trailing-space}).
  6132. @end table
  6133. @xref{Customizing Articles}, for how to wash articles automatically.
  6134. @node Article Buttons
  6135. @subsection Article Buttons
  6136. @cindex buttons
  6137. People often include references to other stuff in articles, and it would
  6138. be nice if Gnus could just fetch whatever it is that people talk about
  6139. with the minimum of fuzz when you hit @key{RET} or use the middle mouse
  6140. button on these references.
  6141. Gnus adds @dfn{buttons} to certain standard references by default:
  6142. Well-formed URLs, mail addresses and Message-IDs. This is controlled by
  6143. two variables, one that handles article bodies and one that handles
  6144. article heads:
  6145. @table @code
  6146. @item gnus-button-alist
  6147. @vindex gnus-button-alist
  6148. This is an alist where each entry has this form:
  6149. @lisp
  6150. (REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
  6151. @end lisp
  6152. @table @var
  6153. @item regexp
  6154. All text that match this regular expression will be considered an
  6155. external reference. Here's a typical regexp that matches embedded URLs:
  6156. @samp{<URL:\\([^\n\r>]*\\)>}.
  6157. @item button-par
  6158. Gnus has to know which parts of the matches is to be highlighted. This
  6159. is a number that says what sub-expression of the regexp is to be
  6160. highlighted. If you want it all highlighted, you use 0 here.
  6161. @item use-p
  6162. This form will be @code{eval}ed, and if the result is non-@code{nil},
  6163. this is considered a match. This is useful if you want extra sifting to
  6164. avoid false matches.
  6165. @item function
  6166. This function will be called when you click on this button.
  6167. @item data-par
  6168. As with @var{button-par}, this is a sub-expression number, but this one
  6169. says which part of the match is to be sent as data to @var{function}.
  6170. @end table
  6171. So the full entry for buttonizing URLs is then
  6172. @lisp
  6173. ("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
  6174. @end lisp
  6175. @item gnus-header-button-alist
  6176. @vindex gnus-header-button-alist
  6177. This is just like the other alist, except that it is applied to the
  6178. article head only, and that each entry has an additional element that is
  6179. used to say what headers to apply the buttonize coding to:
  6180. @lisp
  6181. (HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
  6182. @end lisp
  6183. @var{header} is a regular expression.
  6184. @item gnus-button-url-regexp
  6185. @vindex gnus-button-url-regexp
  6186. A regular expression that matches embedded URLs. It is used in the
  6187. default values of the variables above.
  6188. @item gnus-article-button-face
  6189. @vindex gnus-article-button-face
  6190. Face used on buttons.
  6191. @item gnus-article-mouse-face
  6192. @vindex gnus-article-mouse-face
  6193. Face used when the mouse cursor is over a button.
  6194. @end table
  6195. @xref{Customizing Articles}, for how to buttonize articles automatically.
  6196. @node Article Date
  6197. @subsection Article Date
  6198. The date is most likely generated in some obscure timezone you've never
  6199. heard of, so it's quite nice to be able to find out what the time was
  6200. when the article was sent.
  6201. @table @kbd
  6202. @item W T u
  6203. @kindex W T u @r{(Summary)}
  6204. @findex gnus-article-date-ut
  6205. Display the date in UT (aka. GMT, aka ZULU)
  6206. (@code{gnus-article-date-ut}).
  6207. @item W T i
  6208. @kindex W T i @r{(Summary)}
  6209. @findex gnus-article-date-iso8601
  6210. @cindex ISO 8601
  6211. Display the date in international format, aka. ISO 8601
  6212. (@code{gnus-article-date-iso8601}).
  6213. @item W T l
  6214. @kindex W T l @r{(Summary)}
  6215. @findex gnus-article-date-local
  6216. Display the date in the local timezone (@code{gnus-article-date-local}).
  6217. @item W T s
  6218. @kindex W T s @r{(Summary)}
  6219. @vindex gnus-article-time-format
  6220. @findex gnus-article-date-user
  6221. @findex format-time-string
  6222. Display the date using a user-defined format
  6223. (@code{gnus-article-date-user}). The format is specified by the
  6224. @code{gnus-article-time-format} variable, and is a string that's passed
  6225. to @code{format-time-string}. See the documentation of that variable
  6226. for a list of possible format specs.
  6227. @item W T e
  6228. @kindex W T e @r{(Summary)}
  6229. @findex gnus-article-date-lapsed
  6230. @findex gnus-start-date-timer
  6231. @findex gnus-stop-date-timer
  6232. Say how much time has elapsed between the article was posted and now
  6233. (@code{gnus-article-date-lapsed}). It looks something like:
  6234. @example
  6235. X-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago
  6236. @end example
  6237. The value of @code{gnus-article-date-lapsed-new-header} determines
  6238. whether this header will just be added below the old Date one, or will
  6239. replace it.
  6240. An advantage of using Gnus to read mail is that it converts simple bugs
  6241. into wonderful absurdities.
  6242. If you want to have this line updated continually, you can put
  6243. @lisp
  6244. (gnus-start-date-timer)
  6245. @end lisp
  6246. in your @file{.gnus.el} file, or you can run it off of some hook. If
  6247. you want to stop the timer, you can use the @code{gnus-stop-date-timer}
  6248. command.
  6249. @item W T o
  6250. @kindex W T o @r{(Summary)}
  6251. @findex gnus-article-date-original
  6252. Display the original date (@code{gnus-article-date-original}). This can
  6253. be useful if you normally use some other conversion function and are
  6254. worried that it might be doing something totally wrong. Say, claiming
  6255. that the article was posted in 1854. Although something like that is
  6256. @emph{totally} impossible. Don't you trust me? *titter*
  6257. @end table
  6258. @xref{Customizing Articles}, for how to display the date in your
  6259. preferred format automatically.
  6260. @node Article Signature
  6261. @subsection Article Signature
  6262. @cindex signatures
  6263. @cindex article signature
  6264. @vindex gnus-signature-separator
  6265. Each article is divided into two parts---the head and the body. The
  6266. body can be divided into a signature part and a text part. The variable
  6267. that says what is to be considered a signature is
  6268. @code{gnus-signature-separator}. This is normally the standard
  6269. @samp{^-- $} as mandated by son-of-RFC 1036. However, many people use
  6270. non-standard signature separators, so this variable can also be a list
  6271. of regular expressions to be tested, one by one. (Searches are done
  6272. from the end of the body towards the beginning.) One likely value is:
  6273. @lisp
  6274. (setq gnus-signature-separator
  6275. '("^-- $" ; The standard
  6276. "^-- *$" ; A common mangling
  6277. "^-------*$" ; Many people just use a looong
  6278. ; line of dashes. Shame!
  6279. "^ *--------*$" ; Double-shame!
  6280. "^________*$" ; Underscores are also popular
  6281. "^========*$")) ; Pervert!
  6282. @end lisp
  6283. The more permissive you are, the more likely it is that you'll get false
  6284. positives.
  6285. @vindex gnus-signature-limit
  6286. @code{gnus-signature-limit} provides a limit to what is considered a
  6287. signature when displaying articles.
  6288. @enumerate
  6289. @item
  6290. If it is an integer, no signature may be longer (in characters) than
  6291. that integer.
  6292. @item
  6293. If it is a floating point number, no signature may be longer (in lines)
  6294. than that number.
  6295. @item
  6296. If it is a function, the function will be called without any parameters,
  6297. and if it returns @code{nil}, there is no signature in the buffer.
  6298. @item
  6299. If it is a string, it will be used as a regexp. If it matches, the text
  6300. in question is not a signature.
  6301. @end enumerate
  6302. This variable can also be a list where the elements may be of the types
  6303. listed above. Here's an example:
  6304. @lisp
  6305. (setq gnus-signature-limit
  6306. '(200.0 "^---*Forwarded article"))
  6307. @end lisp
  6308. This means that if there are more than 200 lines after the signature
  6309. separator, or the text after the signature separator is matched by
  6310. the regular expression @samp{^---*Forwarded article}, then it isn't a
  6311. signature after all.
  6312. @node Article Miscellania
  6313. @subsection Article Miscellania
  6314. @table @kbd
  6315. @item A t
  6316. @kindex A t @r{(Summary)}
  6317. @findex gnus-article-babel
  6318. Translate the article from one language to another
  6319. (@code{gnus-article-babel}).
  6320. @end table
  6321. @node MIME Commands
  6322. @section @sc{mime} Commands
  6323. @cindex MIME decoding
  6324. @cindex attachments
  6325. @cindex viewing attachments
  6326. The following commands all understand the numerical prefix. For
  6327. instance, @kbd{3 b} means ``view the third @sc{mime} part''.
  6328. @table @kbd
  6329. @item b
  6330. @itemx K v
  6331. @kindex b @r{(Summary)}
  6332. @kindex K v @r{(Summary)}
  6333. View the @sc{mime} part.
  6334. @item K o
  6335. @kindex K o @r{(Summary)}
  6336. Save the @sc{mime} part.
  6337. @item K c
  6338. @kindex K c @r{(Summary)}
  6339. Copy the @sc{mime} part.
  6340. @item K e
  6341. @kindex K e @r{(Summary)}
  6342. View the @sc{mime} part externally.
  6343. @item K i
  6344. @kindex K i @r{(Summary)}
  6345. View the @sc{mime} part internally.
  6346. @item K |
  6347. @kindex K | @r{(Summary)}
  6348. Pipe the @sc{mime} part to an external command.
  6349. @end table
  6350. The rest of these @sc{mime} commands do not use the numerical prefix in
  6351. the same manner:
  6352. @table @kbd
  6353. @item K b
  6354. @kindex K b @r{(Summary)}
  6355. Make all the @sc{mime} parts have buttons in front of them. This is
  6356. mostly useful if you wish to save (or perform other actions) on inlined
  6357. parts.
  6358. @item K m
  6359. @kindex K m @r{(Summary)}
  6360. @findex gnus-summary-repair-multipart
  6361. Some multipart messages are transmitted with missing or faulty headers.
  6362. This command will attempt to ``repair'' these messages so that they can
  6363. be viewed in a more pleasant manner
  6364. (@code{gnus-summary-repair-multipart}).
  6365. @item X m
  6366. @kindex X m @r{(Summary)}
  6367. @findex gnus-summary-save-parts
  6368. Save all parts matching a @sc{mime} type to a directory
  6369. (@code{gnus-summary-save-parts}). Understands the process/prefix
  6370. convention (@pxref{Process/Prefix}).
  6371. @item M-t
  6372. @kindex M-t @r{(Summary)}
  6373. @findex gnus-summary-display-buttonized
  6374. Toggle the buttonized display of the article buffer
  6375. (@code{gnus-summary-toggle-display-buttonized}).
  6376. @item W M w
  6377. @kindex W M w @r{(Summary)}
  6378. Decode RFC 2047-encoded words in the article headers
  6379. (@code{gnus-article-decode-mime-words}).
  6380. @item W M c
  6381. @kindex W M c @r{(Summary)}
  6382. Decode encoded article bodies as well as charsets
  6383. (@code{gnus-article-decode-charset}).
  6384. This command looks in the @code{Content-Type} header to determine the
  6385. charset. If there is no such header in the article, you can give it a
  6386. prefix, which will prompt for the charset to decode as. In regional
  6387. groups where people post using some common encoding (but do not include
  6388. MIME headers), you can set the @code{charset} group/topic parameter to
  6389. the required charset (@pxref{Group Parameters}).
  6390. @item W M v
  6391. @kindex W M v @r{(Summary)}
  6392. View all the @sc{mime} parts in the current article
  6393. (@code{gnus-mime-view-all-parts}).
  6394. @end table
  6395. Relevant variables:
  6396. @table @code
  6397. @item gnus-ignored-mime-types
  6398. @vindex gnus-ignored-mime-types
  6399. This is a list of regexps. @sc{mime} types that match a regexp from
  6400. this list will be completely ignored by Gnus. The default value is
  6401. @code{nil}.
  6402. To have all Vcards be ignored, you'd say something like this:
  6403. @lisp
  6404. (setq gnus-ignored-mime-types
  6405. '("text/x-vcard"))
  6406. @end lisp
  6407. @item gnus-unbuttonized-mime-types
  6408. @vindex gnus-unbuttonized-mime-types
  6409. This is a list of regexps. @sc{mime} types that match a regexp from
  6410. this list won't have @sc{mime} buttons inserted unless they aren't
  6411. displayed. The default value is @code{(".*/.*")}.
  6412. @item gnus-article-mime-part-function
  6413. @vindex gnus-article-mime-part-function
  6414. For each @sc{mime} part, this function will be called with the @sc{mime}
  6415. handle as the parameter. The function is meant to be used to allow
  6416. users to gather information from the article (e. g., add Vcard info to
  6417. the bbdb database) or to do actions based on parts (e. g., automatically
  6418. save all jpegs into some directory).
  6419. Here's an example function the does the latter:
  6420. @lisp
  6421. (defun my-save-all-jpeg-parts (handle)
  6422. (when (equal (car (mm-handle-type handle)) "image/jpeg")
  6423. (with-temp-buffer
  6424. (insert (mm-get-part handle))
  6425. (write-region (point-min) (point-max)
  6426. (read-file-name "Save jpeg to: ")))))
  6427. (setq gnus-article-mime-part-function
  6428. 'my-save-all-jpeg-parts)
  6429. @end lisp
  6430. @vindex gnus-mime-multipart-functions
  6431. @item gnus-mime-multipart-functions
  6432. Alist of @sc{mime} multipart types and functions to handle them.
  6433. @end table
  6434. @node Charsets
  6435. @section Charsets
  6436. @cindex charsets
  6437. People use different charsets, and we have @sc{mime} to let us know what
  6438. charsets they use. Or rather, we wish we had. Many people use
  6439. newsreaders and mailers that do not understand or use @sc{mime}, and
  6440. just send out messages without saying what character sets they use. To
  6441. help a bit with this, some local news hierarchies have policies that say
  6442. what character set is the default. For instance, the @samp{fj}
  6443. hierarchy uses @code{iso-2022-jp-2}.
  6444. @vindex gnus-group-charset-alist
  6445. This knowledge is encoded in the @code{gnus-group-charset-alist}
  6446. variable, which is an alist of regexps (to match group names) and
  6447. default charsets to be used when reading these groups.
  6448. In addition, some people do use soi-disant @sc{mime}-aware agents that
  6449. aren't. These blithely mark messages as being in @code{iso-8859-1} even
  6450. if they really are in @code{koi-8}. To help here, the
  6451. @code{gnus-newsgroup-ignored-charsets} variable can be used. The
  6452. charsets that are listed here will be ignored. The variable can be set
  6453. on a group-by-group basis using the group parameters (@pxref{Group
  6454. Parameters}). The default value is @code{(unknown-8bit)}, which is
  6455. something some agents insist on having in there.
  6456. @vindex gnus-group-posting-charset-alist
  6457. When posting, @code{gnus-group-posting-charset-alist} is used to
  6458. determine which charsets should not be encoded using the @sc{mime}
  6459. encodings. For instance, some hierarchies discourage using
  6460. quoted-printable header encoding.
  6461. This variable is an alist of regexps and permitted unencoded charsets
  6462. for posting. Each element of the alist has the form @code{(}@var{test
  6463. header body-list}@code{)}, where:
  6464. @table @var
  6465. @item test
  6466. is either a regular expression matching the newsgroup header or a
  6467. variable to query,
  6468. @item header
  6469. is the charset which may be left unencoded in the header (@code{nil}
  6470. means encode all charsets),
  6471. @item body-list
  6472. is a list of charsets which may be encoded using 8bit content-transfer
  6473. encoding in the body, or one of the special values @code{nil} (always
  6474. encode using quoted-printable) or @code{t} (always use 8bit).
  6475. @end table
  6476. @cindex Russian
  6477. @cindex koi8-r
  6478. @cindex koi8-u
  6479. @cindex iso-8859-5
  6480. @cindex coding system aliases
  6481. @cindex preferred charset
  6482. Other charset tricks that may be useful, although not Gnus-specific:
  6483. If there are several @sc{mime} charsets that encode the same Emacs
  6484. charset, you can choose what charset to use by saying the following:
  6485. @lisp
  6486. (put-charset-property 'cyrillic-iso8859-5
  6487. 'preferred-coding-system 'koi8-r)
  6488. @end lisp
  6489. This means that Russian will be encoded using @code{koi8-r} instead of
  6490. the default @code{iso-8859-5} @sc{mime} charset.
  6491. If you want to read messages in @code{koi8-u}, you can cheat and say
  6492. @lisp
  6493. (define-coding-system-alias 'koi8-u 'koi8-r)
  6494. @end lisp
  6495. This will almost do the right thing.
  6496. And finally, to read charsets like @code{windows-1251}, you can say
  6497. something like
  6498. @lisp
  6499. (codepage-setup 1251)
  6500. (define-coding-system-alias 'windows-1251 'cp1251)
  6501. @end lisp
  6502. while if you use a non-Latin-1 language environment you could see the
  6503. Latin-1 subset of @code{windows-1252} using:
  6504. @lisp
  6505. (define-coding-system-alias 'windows-1252 'latin-1)
  6506. @end lisp
  6507. @node Article Commands
  6508. @section Article Commands
  6509. @table @kbd
  6510. @item A P
  6511. @cindex PostScript
  6512. @cindex printing
  6513. @kindex A P @r{(Summary)}
  6514. @vindex gnus-ps-print-hook
  6515. @findex gnus-summary-print-article
  6516. Generate and print a PostScript image of the article buffer
  6517. (@code{gnus-summary-print-article}). @code{gnus-ps-print-hook} will be
  6518. run just before printing the buffer.
  6519. @end table
  6520. @node Summary Sorting
  6521. @section Summary Sorting
  6522. @cindex summary sorting
  6523. You can have the summary buffer sorted in various ways, even though I
  6524. can't really see why you'd want that.
  6525. @table @kbd
  6526. @item C-c C-s C-n
  6527. @kindex C-c C-s C-n @r{(Summary)}
  6528. @findex gnus-summary-sort-by-number
  6529. Sort by article number (@code{gnus-summary-sort-by-number}).
  6530. @item C-c C-s C-a
  6531. @kindex C-c C-s C-a @r{(Summary)}
  6532. @findex gnus-summary-sort-by-author
  6533. Sort by author (@code{gnus-summary-sort-by-author}).
  6534. @item C-c C-s C-s
  6535. @kindex C-c C-s C-s @r{(Summary)}
  6536. @findex gnus-summary-sort-by-subject
  6537. Sort by subject (@code{gnus-summary-sort-by-subject}).
  6538. @item C-c C-s C-d
  6539. @kindex C-c C-s C-d @r{(Summary)}
  6540. @findex gnus-summary-sort-by-date
  6541. Sort by date (@code{gnus-summary-sort-by-date}).
  6542. @item C-c C-s C-l
  6543. @kindex C-c C-s C-l @r{(Summary)}
  6544. @findex gnus-summary-sort-by-lines
  6545. Sort by lines (@code{gnus-summary-sort-by-lines}).
  6546. @item C-c C-s C-c
  6547. @kindex C-c C-s C-c @r{(Summary)}
  6548. @findex gnus-summary-sort-by-chars
  6549. Sort by article length (@code{gnus-summary-sort-by-chars}).
  6550. @item C-c C-s C-i
  6551. @kindex C-c C-s C-i @r{(Summary)}
  6552. @findex gnus-summary-sort-by-score
  6553. Sort by score (@code{gnus-summary-sort-by-score}).
  6554. @end table
  6555. These functions will work both when you use threading and when you don't
  6556. use threading. In the latter case, all summary lines will be sorted,
  6557. line by line. In the former case, sorting will be done on a
  6558. root-by-root basis, which might not be what you were looking for. To
  6559. toggle whether to use threading, type @kbd{T T} (@pxref{Thread
  6560. Commands}).
  6561. @node Finding the Parent
  6562. @section Finding the Parent
  6563. @cindex parent articles
  6564. @cindex referring articles
  6565. @table @kbd
  6566. @item ^
  6567. @kindex ^ @r{(Summary)}
  6568. @findex gnus-summary-refer-parent-article
  6569. If you'd like to read the parent of the current article, and it is not
  6570. displayed in the summary buffer, you might still be able to. That is,
  6571. if the current group is fetched by @sc{nntp}, the parent hasn't expired
  6572. and the @code{References} in the current article are not mangled, you
  6573. can just press @kbd{^} or @kbd{A r}
  6574. (@code{gnus-summary-refer-parent-article}). If everything goes well,
  6575. you'll get the parent. If the parent is already displayed in the
  6576. summary buffer, point will just move to this article.
  6577. If given a positive numerical prefix, fetch that many articles back into
  6578. the ancestry. If given a negative numerical prefix, fetch just that
  6579. ancestor. So if you say @kbd{3 ^}, Gnus will fetch the parent, the
  6580. grandparent and the grandgrandparent of the current article. If you say
  6581. @kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
  6582. article.
  6583. @item A R @r{(Summary)}
  6584. @findex gnus-summary-refer-references
  6585. @kindex A R @r{(Summary)}
  6586. Fetch all articles mentioned in the @code{References} header of the
  6587. article (@code{gnus-summary-refer-references}).
  6588. @item A T @r{(Summary)}
  6589. @findex gnus-summary-refer-thread
  6590. @kindex A T @r{(Summary)}
  6591. Display the full thread where the current article appears
  6592. (@code{gnus-summary-refer-thread}). This command has to fetch all the
  6593. headers in the current group to work, so it usually takes a while. If
  6594. you do it often, you may consider setting @code{gnus-fetch-old-headers}
  6595. to @code{invisible} (@pxref{Filling In Threads}). This won't have any
  6596. visible effects normally, but it'll make this command work a whole lot
  6597. faster. Of course, it'll make group entry somewhat slow.
  6598. @vindex gnus-refer-thread-limit
  6599. The @code{gnus-refer-thread-limit} variable says how many old (i. e.,
  6600. articles before the first displayed in the current group) headers to
  6601. fetch when doing this command. The default is 200. If @code{t}, all
  6602. the available headers will be fetched. This variable can be overridden
  6603. by giving the @kbd{A T} command a numerical prefix.
  6604. @item M-^ @r{(Summary)}
  6605. @findex gnus-summary-refer-article
  6606. @kindex M-^ @r{(Summary)}
  6607. @cindex Message-ID
  6608. @cindex fetching by Message-ID
  6609. You can also ask the @sc{nntp} server for an arbitrary article, no
  6610. matter what group it belongs to. @kbd{M-^}
  6611. (@code{gnus-summary-refer-article}) will ask you for a
  6612. @code{Message-ID}, which is one of those long, hard-to-read thingies
  6613. that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}. You
  6614. have to get it all exactly right. No fuzzy searches, I'm afraid.
  6615. @end table
  6616. The current select method will be used when fetching by
  6617. @code{Message-ID} from non-news select method, but you can override this
  6618. by giving this command a prefix.
  6619. @vindex gnus-refer-article-method
  6620. If the group you are reading is located on a back end that does not
  6621. support fetching by @code{Message-ID} very well (like @code{nnspool}),
  6622. you can set @code{gnus-refer-article-method} to an @sc{nntp} method. It
  6623. would, perhaps, be best if the @sc{nntp} server you consult is the one
  6624. updating the spool you are reading from, but that's not really
  6625. necessary.
  6626. It can also be a list of select methods, as well as the special symbol
  6627. @code{current}, which means to use the current select method. If it
  6628. is a list, Gnus will try all the methods in the list until it finds a
  6629. match.
  6630. Here's an example setting that will first try the current method, and
  6631. then ask Deja if that fails:
  6632. @lisp
  6633. (setq gnus-refer-article-method
  6634. '(current
  6635. (nnweb "refer" (nnweb-type dejanews))))
  6636. @end lisp
  6637. Most of the mail back ends support fetching by @code{Message-ID}, but do
  6638. not do a particularly excellent job at it. That is, @code{nnmbox} and
  6639. @code{nnbabyl} are able to locate articles from any groups, while
  6640. @code{nnml} and @code{nnfolder} are only able to locate articles that
  6641. have been posted to the current group. (Anything else would be too time
  6642. consuming.) @code{nnmh} does not support this at all.
  6643. @node Alternative Approaches
  6644. @section Alternative Approaches
  6645. Different people like to read news using different methods. This being
  6646. Gnus, we offer a small selection of minor modes for the summary buffers.
  6647. @menu
  6648. * Pick and Read:: First mark articles and then read them.
  6649. * Binary Groups:: Auto-decode all articles.
  6650. @end menu
  6651. @node Pick and Read
  6652. @subsection Pick and Read
  6653. @cindex pick and read
  6654. Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
  6655. a two-phased reading interface. The user first marks in a summary
  6656. buffer the articles she wants to read. Then she starts reading the
  6657. articles with just an article buffer displayed.
  6658. @findex gnus-pick-mode
  6659. @kindex M-x gnus-pick-mode
  6660. Gnus provides a summary buffer minor mode that allows
  6661. this---@code{gnus-pick-mode}. This basically means that a few process
  6662. mark commands become one-keystroke commands to allow easy marking, and
  6663. it provides one additional command for switching to the summary buffer.
  6664. Here are the available keystrokes when using pick mode:
  6665. @table @kbd
  6666. @item .
  6667. @kindex . (Pick)
  6668. @findex gnus-pick-article-or-thread
  6669. Pick the article or thread on the current line
  6670. (@code{gnus-pick-article-or-thread}). If the variable
  6671. @code{gnus-thread-hide-subtree} is true, then this key selects the
  6672. entire thread when used at the first article of the thread. Otherwise,
  6673. it selects just the article. If given a numerical prefix, go to that
  6674. thread or article and pick it. (The line number is normally displayed
  6675. at the beginning of the summary pick lines.)
  6676. @item @key{SPC}
  6677. @kindex @key{SPC} (Pick)
  6678. @findex gnus-pick-next-page
  6679. Scroll the summary buffer up one page (@code{gnus-pick-next-page}). If
  6680. at the end of the buffer, start reading the picked articles.
  6681. @item u
  6682. @kindex u (Pick)
  6683. @findex gnus-pick-unmark-article-or-thread.
  6684. Unpick the thread or article
  6685. (@code{gnus-pick-unmark-article-or-thread}). If the variable
  6686. @code{gnus-thread-hide-subtree} is true, then this key unpicks the
  6687. thread if used at the first article of the thread. Otherwise it unpicks
  6688. just the article. You can give this key a numerical prefix to unpick
  6689. the thread or article at that line.
  6690. @item @key{RET}
  6691. @kindex @key{RET} (Pick)
  6692. @findex gnus-pick-start-reading
  6693. @vindex gnus-pick-display-summary
  6694. Start reading the picked articles (@code{gnus-pick-start-reading}). If
  6695. given a prefix, mark all unpicked articles as read first. If
  6696. @code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
  6697. will still be visible when you are reading.
  6698. @end table
  6699. All the normal summary mode commands are still available in the
  6700. pick-mode, with the exception of @kbd{u}. However @kbd{!} is available
  6701. which is mapped to the same function
  6702. @code{gnus-summary-tick-article-forward}.
  6703. If this sounds like a good idea to you, you could say:
  6704. @lisp
  6705. (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
  6706. @end lisp
  6707. @vindex gnus-pick-mode-hook
  6708. @code{gnus-pick-mode-hook} is run in pick minor mode buffers.
  6709. @vindex gnus-mark-unpicked-articles-as-read
  6710. If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
  6711. all unpicked articles as read. The default is @code{nil}.
  6712. @vindex gnus-summary-pick-line-format
  6713. The summary line format in pick mode is slightly different from the
  6714. standard format. At the beginning of each line the line number is
  6715. displayed. The pick mode line format is controlled by the
  6716. @code{gnus-summary-pick-line-format} variable (@pxref{Formatting
  6717. Variables}). It accepts the same format specs that
  6718. @code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}).
  6719. @node Binary Groups
  6720. @subsection Binary Groups
  6721. @cindex binary groups
  6722. @findex gnus-binary-mode
  6723. @kindex M-x gnus-binary-mode
  6724. If you spend much time in binary groups, you may grow tired of hitting
  6725. @kbd{X u}, @kbd{n}, @key{RET} all the time. @kbd{M-x gnus-binary-mode}
  6726. is a minor mode for summary buffers that makes all ordinary Gnus article
  6727. selection functions uudecode series of articles and display the result
  6728. instead of just displaying the articles the normal way.
  6729. @kindex g (Binary)
  6730. @findex gnus-binary-show-article
  6731. The only way, in fact, to see the actual articles is the @kbd{g}
  6732. command, when you have turned on this mode
  6733. (@code{gnus-binary-show-article}).
  6734. @vindex gnus-binary-mode-hook
  6735. @code{gnus-binary-mode-hook} is called in binary minor mode buffers.
  6736. @node Tree Display
  6737. @section Tree Display
  6738. @cindex trees
  6739. @vindex gnus-use-trees
  6740. If you don't like the normal Gnus summary display, you might try setting
  6741. @code{gnus-use-trees} to @code{t}. This will create (by default) an
  6742. additional @dfn{tree buffer}. You can execute all summary mode commands
  6743. in the tree buffer.
  6744. There are a few variables to customize the tree display, of course:
  6745. @table @code
  6746. @item gnus-tree-mode-hook
  6747. @vindex gnus-tree-mode-hook
  6748. A hook called in all tree mode buffers.
  6749. @item gnus-tree-mode-line-format
  6750. @vindex gnus-tree-mode-line-format
  6751. A format string for the mode bar in the tree mode buffers (@pxref{Mode
  6752. Line Formatting}). The default is @samp{Gnus: %%b %S %Z}. For a list
  6753. of valid specs, @pxref{Summary Buffer Mode Line}.
  6754. @item gnus-selected-tree-face
  6755. @vindex gnus-selected-tree-face
  6756. Face used for highlighting the selected article in the tree buffer. The
  6757. default is @code{modeline}.
  6758. @item gnus-tree-line-format
  6759. @vindex gnus-tree-line-format
  6760. A format string for the tree nodes. The name is a bit of a misnomer,
  6761. though---it doesn't define a line, but just the node. The default value
  6762. is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
  6763. the name of the poster. It is vital that all nodes are of the same
  6764. length, so you @emph{must} use @samp{%4,4n}-like specifiers.
  6765. Valid specs are:
  6766. @table @samp
  6767. @item n
  6768. The name of the poster.
  6769. @item f
  6770. The @code{From} header.
  6771. @item N
  6772. The number of the article.
  6773. @item [
  6774. The opening bracket.
  6775. @item ]
  6776. The closing bracket.
  6777. @item s
  6778. The subject.
  6779. @end table
  6780. @xref{Formatting Variables}.
  6781. Variables related to the display are:
  6782. @table @code
  6783. @item gnus-tree-brackets
  6784. @vindex gnus-tree-brackets
  6785. This is used for differentiating between ``real'' articles and
  6786. ``sparse'' articles. The format is @code{((@var{real-open} . @var{real-close})
  6787. (@var{sparse-open} . @var{sparse-close}) (@var{dummy-open} . @var{dummy-close}))}, and the
  6788. default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.
  6789. @item gnus-tree-parent-child-edges
  6790. @vindex gnus-tree-parent-child-edges
  6791. This is a list that contains the characters used for connecting parent
  6792. nodes to their children. The default is @code{(?- ?\\ ?|)}.
  6793. @end table
  6794. @item gnus-tree-minimize-window
  6795. @vindex gnus-tree-minimize-window
  6796. If this variable is non-@code{nil}, Gnus will try to keep the tree
  6797. buffer as small as possible to allow more room for the other Gnus
  6798. windows. If this variable is a number, the tree buffer will never be
  6799. higher than that number. The default is @code{t}. Note that if you
  6800. have several windows displayed side-by-side in a frame and the tree
  6801. buffer is one of these, minimizing the tree window will also resize all
  6802. other windows displayed next to it.
  6803. @item gnus-generate-tree-function
  6804. @vindex gnus-generate-tree-function
  6805. @findex gnus-generate-horizontal-tree
  6806. @findex gnus-generate-vertical-tree
  6807. The function that actually generates the thread tree. Two predefined
  6808. functions are available: @code{gnus-generate-horizontal-tree} and
  6809. @code{gnus-generate-vertical-tree} (which is the default).
  6810. @end table
  6811. Here's an example from a horizontal tree buffer:
  6812. @example
  6813. @{***@}-(***)-[odd]-[Gun]
  6814. | \[Jan]
  6815. | \[odd]-[Eri]
  6816. | \(***)-[Eri]
  6817. | \[odd]-[Paa]
  6818. \[Bjo]
  6819. \[Gun]
  6820. \[Gun]-[Jor]
  6821. @end example
  6822. Here's the same thread displayed in a vertical tree buffer:
  6823. @example
  6824. @{***@}
  6825. |--------------------------\-----\-----\
  6826. (***) [Bjo] [Gun] [Gun]
  6827. |--\-----\-----\ |
  6828. [odd] [Jan] [odd] (***) [Jor]
  6829. | | |--\
  6830. [Gun] [Eri] [Eri] [odd]
  6831. |
  6832. [Paa]
  6833. @end example
  6834. If you're using horizontal trees, it might be nice to display the trees
  6835. side-by-side with the summary buffer. You could add something like the
  6836. following to your @file{.gnus.el} file:
  6837. @lisp
  6838. (setq gnus-use-trees t
  6839. gnus-generate-tree-function 'gnus-generate-horizontal-tree
  6840. gnus-tree-minimize-window nil)
  6841. (gnus-add-configuration
  6842. '(article
  6843. (vertical 1.0
  6844. (horizontal 0.25
  6845. (summary 0.75 point)
  6846. (tree 1.0))
  6847. (article 1.0))))
  6848. @end lisp
  6849. @xref{Windows Configuration}.
  6850. @node Mail Group Commands
  6851. @section Mail Group Commands
  6852. @cindex mail group commands
  6853. Some commands only make sense in mail groups. If these commands are
  6854. invalid in the current group, they will raise a hell and let you know.
  6855. All these commands (except the expiry and edit commands) use the
  6856. process/prefix convention (@pxref{Process/Prefix}).
  6857. @table @kbd
  6858. @item B e
  6859. @kindex B e @r{(Summary)}
  6860. @findex gnus-summary-expire-articles
  6861. Expire all expirable articles in the group
  6862. (@code{gnus-summary-expire-articles}).
  6863. @item B C-M-e
  6864. @kindex B C-M-e @r{(Summary)}
  6865. @findex gnus-summary-expire-articles-now
  6866. Delete all the expirable articles in the group
  6867. (@code{gnus-summary-expire-articles-now}). This means that @strong{all}
  6868. articles eligible for expiry in the current group will
  6869. disappear forever into that big @file{/dev/null} in the sky.
  6870. @item B @key{DEL}
  6871. @kindex B @key{DEL} @r{(Summary)}
  6872. @findex gnus-summary-delete-article
  6873. @c @icon{gnus-summary-mail-delete}
  6874. Delete the mail article. This is ``delete'' as in ``delete it from your
  6875. disk forever and ever, never to return again.'' Use with caution.
  6876. (@code{gnus-summary-delete-article}).
  6877. @item B m
  6878. @kindex B m @r{(Summary)}
  6879. @cindex move mail
  6880. @findex gnus-summary-move-article
  6881. @vindex gnus-preserve-marks
  6882. Move the article from one mail group to another
  6883. (@code{gnus-summary-move-article}). Marks will be preserved if
  6884. @var{gnus-preserve-marks} is non-@code{nil} (which is the default).
  6885. @item B c
  6886. @kindex B c @r{(Summary)}
  6887. @cindex copy mail
  6888. @findex gnus-summary-copy-article
  6889. @c @icon{gnus-summary-mail-copy}
  6890. Copy the article from one group (mail group or not) to a mail group
  6891. (@code{gnus-summary-copy-article}). Marks will be preserved if
  6892. @var{gnus-preserve-marks} is non-@code{nil} (which is the default).
  6893. @item B B
  6894. @kindex B B @r{(Summary)}
  6895. @cindex crosspost mail
  6896. @findex gnus-summary-crosspost-article
  6897. Crosspost the current article to some other group
  6898. (@code{gnus-summary-crosspost-article}). This will create a new copy of
  6899. the article in the other group, and the Xref headers of the article will
  6900. be properly updated.
  6901. @item B i
  6902. @kindex B i @r{(Summary)}
  6903. @findex gnus-summary-import-article
  6904. Import an arbitrary file into the current mail newsgroup
  6905. (@code{gnus-summary-import-article}). You will be prompted for a file
  6906. name, a @code{From} header and a @code{Subject} header.
  6907. @item B r
  6908. @kindex B r @r{(Summary)}
  6909. @findex gnus-summary-respool-article
  6910. Respool the mail article (@code{gnus-summary-respool-article}).
  6911. @code{gnus-summary-respool-default-method} will be used as the default
  6912. select method when respooling. This variable is @code{nil} by default,
  6913. which means that the current group select method will be used instead.
  6914. Marks will be preserved if @var{gnus-preserve-marks} is non-@code{nil}
  6915. (which is the default).
  6916. @item B w
  6917. @itemx e
  6918. @kindex B w @r{(Summary)}
  6919. @kindex e @r{(Summary)}
  6920. @findex gnus-summary-edit-article
  6921. @kindex C-c C-c @r{(Article)}
  6922. Edit the current article (@code{gnus-summary-edit-article}). To finish
  6923. editing and make the changes permanent, type @kbd{C-c C-c}
  6924. (@kbd{gnus-summary-edit-article-done}). If you give a prefix to the
  6925. @kbd{C-c C-c} command, Gnus won't re-highlight the article.
  6926. @item B q
  6927. @kindex B q @r{(Summary)}
  6928. @findex gnus-summary-respool-query
  6929. If you want to re-spool an article, you might be curious as to what group
  6930. the article will end up in before you do the re-spooling. This command
  6931. will tell you (@code{gnus-summary-respool-query}).
  6932. @item B t
  6933. @kindex B t @r{(Summary)}
  6934. @findex gnus-summary-respool-trace
  6935. Similarly, this command will display all fancy splitting patterns used
  6936. when repooling, if any (@code{gnus-summary-respool-trace}).
  6937. @item B p
  6938. @kindex B p @r{(Summary)}
  6939. @findex gnus-summary-article-posted-p
  6940. Some people have a tendency to send you "courtesy" copies when they
  6941. follow up to articles you have posted. These usually have a
  6942. @code{Newsgroups} header in them, but not always. This command
  6943. (@code{gnus-summary-article-posted-p}) will try to fetch the current
  6944. article from your news server (or rather, from
  6945. @code{gnus-refer-article-method} or @code{gnus-select-method}) and will
  6946. report back whether it found the article or not. Even if it says that
  6947. it didn't find the article, it may have been posted anyway---mail
  6948. propagation is much faster than news propagation, and the news copy may
  6949. just not have arrived yet.
  6950. @end table
  6951. @vindex gnus-move-split-methods
  6952. @cindex moving articles
  6953. If you move (or copy) articles regularly, you might wish to have Gnus
  6954. suggest where to put the articles. @code{gnus-move-split-methods} is a
  6955. variable that uses the same syntax as @code{gnus-split-methods}
  6956. (@pxref{Saving Articles}). You may customize that variable to create
  6957. suggestions you find reasonable. (Note that
  6958. @code{gnus-move-split-methods} uses group names where
  6959. @code{gnus-split-methods} uses file names.)
  6960. @lisp
  6961. (setq gnus-move-split-methods
  6962. '(("^From:.*Lars Magne" "nnml:junk")
  6963. ("^Subject:.*gnus" "nnfolder:important")
  6964. (".*" "nnml:misc")))
  6965. @end lisp
  6966. @node Various Summary Stuff
  6967. @section Various Summary Stuff
  6968. @menu
  6969. * Summary Group Information:: Information oriented commands.
  6970. * Searching for Articles:: Multiple article commands.
  6971. * Summary Generation Commands:: (Re)generating the summary buffer.
  6972. * Really Various Summary Commands:: Those pesky non-conformant commands.
  6973. @end menu
  6974. @table @code
  6975. @vindex gnus-summary-mode-hook
  6976. @item gnus-summary-mode-hook
  6977. This hook is called when creating a summary mode buffer.
  6978. @vindex gnus-summary-generate-hook
  6979. @item gnus-summary-generate-hook
  6980. This is called as the last thing before doing the threading and the
  6981. generation of the summary buffer. It's quite convenient for customizing
  6982. the threading variables based on what data the newsgroup has. This hook
  6983. is called from the summary buffer after most summary buffer variables
  6984. have been set.
  6985. @vindex gnus-summary-prepare-hook
  6986. @item gnus-summary-prepare-hook
  6987. It is called after the summary buffer has been generated. You might use
  6988. it to, for instance, highlight lines or modify the look of the buffer in
  6989. some other ungodly manner. I don't care.
  6990. @vindex gnus-summary-prepared-hook
  6991. @item gnus-summary-prepared-hook
  6992. A hook called as the very last thing after the summary buffer has been
  6993. generated.
  6994. @vindex gnus-summary-ignore-duplicates
  6995. @item gnus-summary-ignore-duplicates
  6996. When Gnus discovers two articles that have the same @code{Message-ID},
  6997. it has to do something drastic. No articles are allowed to have the
  6998. same @code{Message-ID}, but this may happen when reading mail from some
  6999. sources. Gnus allows you to customize what happens with this variable.
  7000. If it is @code{nil} (which is the default), Gnus will rename the
  7001. @code{Message-ID} (for display purposes only) and display the article as
  7002. any other article. If this variable is @code{t}, it won't display the
  7003. article---it'll be as if it never existed.
  7004. @vindex gnus-alter-articles-to-read-function
  7005. @item gnus-alter-articles-to-read-function
  7006. This function, which takes two parameters (the group name and the list
  7007. of articles to be selected), is called to allow the user to alter the
  7008. list of articles to be selected.
  7009. For instance, the following function adds the list of cached articles to
  7010. the list in one particular group:
  7011. @lisp
  7012. (defun my-add-cached-articles (group articles)
  7013. (if (string= group "some.group")
  7014. (append gnus-newsgroup-cached articles)
  7015. articles))
  7016. @end lisp
  7017. @end table
  7018. @node Summary Group Information
  7019. @subsection Summary Group Information
  7020. @table @kbd
  7021. @item H f
  7022. @kindex H f @r{(Summary)}
  7023. @findex gnus-summary-fetch-faq
  7024. @vindex gnus-group-faq-directory
  7025. Try to fetch the FAQ (list of frequently asked questions) for the
  7026. current group (@code{gnus-summary-fetch-faq}). Gnus will try to get the
  7027. FAQ from @code{gnus-group-faq-directory}, which is usually a directory
  7028. on a remote machine. This variable can also be a list of directories.
  7029. In that case, giving a prefix to this command will allow you to choose
  7030. between the various sites. @code{ange-ftp} or @code{efs} will probably
  7031. be used for fetching the file.
  7032. @item H d
  7033. @kindex H d @r{(Summary)}
  7034. @findex gnus-summary-describe-group
  7035. Give a brief description of the current group
  7036. (@code{gnus-summary-describe-group}). If given a prefix, force
  7037. rereading the description from the server.
  7038. @item H h
  7039. @kindex H h @r{(Summary)}
  7040. @findex gnus-summary-describe-briefly
  7041. Give an extremely brief description of the most important summary
  7042. keystrokes (@code{gnus-summary-describe-briefly}).
  7043. @item H i
  7044. @kindex H i @r{(Summary)}
  7045. @findex gnus-info-find-node
  7046. Go to the Gnus info node (@code{gnus-info-find-node}).
  7047. @end table
  7048. @node Searching for Articles
  7049. @subsection Searching for Articles
  7050. @table @kbd
  7051. @item M-s
  7052. @kindex M-s @r{(Summary)}
  7053. @findex gnus-summary-search-article-forward
  7054. Search through all subsequent articles for a regexp
  7055. (@code{gnus-summary-search-article-forward}).
  7056. @item M-r
  7057. @kindex M-r @r{(Summary)}
  7058. @findex gnus-summary-search-article-backward
  7059. Search through all previous articles for a regexp
  7060. (@code{gnus-summary-search-article-backward}).
  7061. @item &
  7062. @kindex & @r{(Summary)}
  7063. @findex gnus-summary-execute-command
  7064. This command will prompt you for a header, a regular expression to match
  7065. on this field, and a command to be executed if the match is made
  7066. (@code{gnus-summary-execute-command}). If the header is an empty
  7067. string, the match is done on the entire article. If given a prefix,
  7068. search backward instead.
  7069. For instance, @kbd{& @key{RET} some.*string #} will put the process mark on
  7070. all articles that have heads or bodies that match @samp{some.*string}.
  7071. @item M-&
  7072. @kindex M-& @r{(Summary)}
  7073. @findex gnus-summary-universal-argument
  7074. Perform any operation on all articles that have been marked with
  7075. the process mark (@code{gnus-summary-universal-argument}).
  7076. @end table
  7077. @node Summary Generation Commands
  7078. @subsection Summary Generation Commands
  7079. @table @kbd
  7080. @item Y g
  7081. @kindex Y g @r{(Summary)}
  7082. @findex gnus-summary-prepare
  7083. Regenerate the current summary buffer (@code{gnus-summary-prepare}).
  7084. @item Y c
  7085. @kindex Y c @r{(Summary)}
  7086. @findex gnus-summary-insert-cached-articles
  7087. Pull all cached articles (for the current group) into the summary buffer
  7088. (@code{gnus-summary-insert-cached-articles}).
  7089. @end table
  7090. @node Really Various Summary Commands
  7091. @subsection Really Various Summary Commands
  7092. @table @kbd
  7093. @item A D
  7094. @itemx C-d
  7095. @kindex C-d @r{(Summary)}
  7096. @kindex A D @r{(Summary)}
  7097. @findex gnus-summary-enter-digest-group
  7098. If the current article is a collection of other articles (for instance,
  7099. a digest), you might use this command to enter a group based on the that
  7100. article (@code{gnus-summary-enter-digest-group}). Gnus will try to
  7101. guess what article type is currently displayed unless you give a prefix
  7102. to this command, which forces a ``digest'' interpretation. Basically,
  7103. whenever you see a message that is a collection of other messages of
  7104. some format, you @kbd{C-d} and read these messages in a more convenient
  7105. fashion.
  7106. @item C-M-d
  7107. @kindex C-M-d @r{(Summary)}
  7108. @findex gnus-summary-read-document
  7109. This command is very similar to the one above, but lets you gather
  7110. several documents into one biiig group
  7111. (@code{gnus-summary-read-document}). It does this by opening several
  7112. @code{nndoc} groups for each document, and then opening an
  7113. @code{nnvirtual} group on top of these @code{nndoc} groups. This
  7114. command understands the process/prefix convention
  7115. (@pxref{Process/Prefix}).
  7116. @item C-t
  7117. @kindex C-t @r{(Summary)}
  7118. @findex gnus-summary-toggle-truncation
  7119. Toggle truncation of summary lines
  7120. (@code{gnus-summary-toggle-truncation}). This will probably confuse the
  7121. line centering function in the summary buffer, so it's not a good idea
  7122. to have truncation switched off while reading articles.
  7123. @item =
  7124. @kindex = @r{(Summary)}
  7125. @findex gnus-summary-expand-window
  7126. Expand the summary buffer window (@code{gnus-summary-expand-window}).
  7127. If given a prefix, force an @code{article} window configuration.
  7128. @item C-M-e
  7129. @kindex C-M-e @r{(Summary)}
  7130. @findex gnus-summary-edit-parameters
  7131. Edit the group parameters (@pxref{Group Parameters}) of the current
  7132. group (@code{gnus-summary-edit-parameters}).
  7133. @item C-M-a
  7134. @kindex C-M-a @r{(Summary)}
  7135. @findex gnus-summary-customize-parameters
  7136. Customize the group parameters (@pxref{Group Parameters}) of the current
  7137. group (@code{gnus-summary-customize-parameters}).
  7138. @end table
  7139. @node Exiting the Summary Buffer
  7140. @section Exiting the Summary Buffer
  7141. @cindex summary exit
  7142. @cindex exiting groups
  7143. Exiting from the summary buffer will normally update all info on the
  7144. group and return you to the group buffer.
  7145. @table @kbd
  7146. @item Z Z
  7147. @itemx q
  7148. @kindex Z Z @r{(Summary)}
  7149. @kindex q @r{(Summary)}
  7150. @findex gnus-summary-exit
  7151. @vindex gnus-summary-exit-hook
  7152. @vindex gnus-summary-prepare-exit-hook
  7153. @c @icon{gnus-summary-exit}
  7154. Exit the current group and update all information on the group
  7155. (@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is
  7156. called before doing much of the exiting, which calls
  7157. @code{gnus-summary-expire-articles} by default.
  7158. @code{gnus-summary-exit-hook} is called after finishing the exit
  7159. process. @code{gnus-group-no-more-groups-hook} is run when returning to
  7160. group mode having no more (unread) groups.
  7161. @item Z E
  7162. @itemx Q
  7163. @kindex Z E @r{(Summary)}
  7164. @kindex Q @r{(Summary)}
  7165. @findex gnus-summary-exit-no-update
  7166. Exit the current group without updating any information on the group
  7167. (@code{gnus-summary-exit-no-update}).
  7168. @item Z c
  7169. @itemx c
  7170. @kindex Z c @r{(Summary)}
  7171. @kindex c @r{(Summary)}
  7172. @findex gnus-summary-catchup-and-exit
  7173. @c @icon{gnus-summary-catchup-and-exit}
  7174. Mark all unticked articles in the group as read and then exit
  7175. (@code{gnus-summary-catchup-and-exit}).
  7176. @item Z C
  7177. @kindex Z C @r{(Summary)}
  7178. @findex gnus-summary-catchup-all-and-exit
  7179. Mark all articles, even the ticked ones, as read and then exit
  7180. (@code{gnus-summary-catchup-all-and-exit}).
  7181. @item Z n
  7182. @kindex Z n @r{(Summary)}
  7183. @findex gnus-summary-catchup-and-goto-next-group
  7184. Mark all articles as read and go to the next group
  7185. (@code{gnus-summary-catchup-and-goto-next-group}).
  7186. @item Z R
  7187. @kindex Z R @r{(Summary)}
  7188. @findex gnus-summary-reselect-current-group
  7189. Exit this group, and then enter it again
  7190. (@code{gnus-summary-reselect-current-group}). If given a prefix, select
  7191. all articles, both read and unread.
  7192. @item Z G
  7193. @itemx M-g
  7194. @kindex Z G @r{(Summary)}
  7195. @kindex M-g @r{(Summary)}
  7196. @findex gnus-summary-rescan-group
  7197. @c @icon{gnus-summary-mail-get}
  7198. Exit the group, check for new articles in the group, and select the
  7199. group (@code{gnus-summary-rescan-group}). If given a prefix, select all
  7200. articles, both read and unread.
  7201. @item Z N
  7202. @kindex Z N @r{(Summary)}
  7203. @findex gnus-summary-next-group
  7204. Exit the group and go to the next group
  7205. (@code{gnus-summary-next-group}).
  7206. @item Z P
  7207. @kindex Z P @r{(Summary)}
  7208. @findex gnus-summary-prev-group
  7209. Exit the group and go to the previous group
  7210. (@code{gnus-summary-prev-group}).
  7211. @item Z s
  7212. @kindex Z s @r{(Summary)}
  7213. @findex gnus-summary-save-newsrc
  7214. Save the current number of read/marked articles in the dribble buffer
  7215. and then save the dribble buffer (@code{gnus-summary-save-newsrc}). If
  7216. given a prefix, also save the @file{.newsrc} file(s). Using this
  7217. command will make exit without updating (the @kbd{Q} command) worthless.
  7218. @end table
  7219. @vindex gnus-exit-group-hook
  7220. @code{gnus-exit-group-hook} is called when you exit the current group
  7221. with an ``updating'' exit. For instance @kbd{Q}
  7222. (@code{gnus-summary-exit-no-update}) does not call this hook.
  7223. @findex gnus-summary-wake-up-the-dead
  7224. @findex gnus-dead-summary-mode
  7225. @vindex gnus-kill-summary-on-exit
  7226. If you're in the habit of exiting groups, and then changing your mind
  7227. about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
  7228. If you do that, Gnus won't kill the summary buffer when you exit it.
  7229. (Quelle surprise!) Instead it will change the name of the buffer to
  7230. something like @samp{*Dead Summary ... *} and install a minor mode
  7231. called @code{gnus-dead-summary-mode}. Now, if you switch back to this
  7232. buffer, you'll find that all keys are mapped to a function called
  7233. @code{gnus-summary-wake-up-the-dead}. So tapping any keys in a dead
  7234. summary buffer will result in a live, normal summary buffer.
  7235. There will never be more than one dead summary buffer at any one time.
  7236. @vindex gnus-use-cross-reference
  7237. The data on the current group will be updated (which articles you have
  7238. read, which articles you have replied to, etc.) when you exit the
  7239. summary buffer. If the @code{gnus-use-cross-reference} variable is
  7240. @code{t} (which is the default), articles that are cross-referenced to
  7241. this group and are marked as read, will also be marked as read in the
  7242. other subscribed groups they were cross-posted to. If this variable is
  7243. neither @code{nil} nor @code{t}, the article will be marked as read in
  7244. both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
  7245. @node Crosspost Handling
  7246. @section Crosspost Handling
  7247. @cindex velveeta
  7248. @cindex spamming
  7249. Marking cross-posted articles as read ensures that you'll never have to
  7250. read the same article more than once. Unless, of course, somebody has
  7251. posted it to several groups separately. Posting the same article to
  7252. several groups (not cross-posting) is called @dfn{spamming}, and you are
  7253. by law required to send nasty-grams to anyone who perpetrates such a
  7254. heinous crime. You may want to try NoCeM handling to filter out spam
  7255. (@pxref{NoCeM}).
  7256. Remember: Cross-posting is kinda ok, but posting the same article
  7257. separately to several groups is not. Massive cross-posting (aka.
  7258. @dfn{velveeta}) is to be avoided at all costs, and you can even use the
  7259. @code{gnus-summary-mail-crosspost-complaint} command to complain about
  7260. excessive crossposting (@pxref{Summary Mail Commands}).
  7261. @cindex cross-posting
  7262. @cindex Xref
  7263. @cindex @sc{nov}
  7264. One thing that may cause Gnus to not do the cross-posting thing
  7265. correctly is if you use an @sc{nntp} server that supports @sc{xover}
  7266. (which is very nice, because it speeds things up considerably) which
  7267. does not include the @code{Xref} header in its @sc{nov} lines. This is
  7268. Evil, but all too common, alas, alack. Gnus tries to Do The Right Thing
  7269. even with @sc{xover} by registering the @code{Xref} lines of all
  7270. articles you actually read, but if you kill the articles, or just mark
  7271. them as read without reading them, Gnus will not get a chance to snoop
  7272. the @code{Xref} lines out of these articles, and will be unable to use
  7273. the cross reference mechanism.
  7274. @cindex LIST overview.fmt
  7275. @cindex overview.fmt
  7276. To check whether your @sc{nntp} server includes the @code{Xref} header
  7277. in its overview files, try @samp{telnet your.nntp.server nntp},
  7278. @samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
  7279. overview.fmt}. This may not work, but if it does, and the last line you
  7280. get does not read @samp{Xref:full}, then you should shout and whine at
  7281. your news admin until she includes the @code{Xref} header in the
  7282. overview files.
  7283. @vindex gnus-nov-is-evil
  7284. If you want Gnus to get the @code{Xref}s right all the time, you have to
  7285. set @code{gnus-nov-is-evil} to @code{t}, which slows things down
  7286. considerably.
  7287. C'est la vie.
  7288. For an alternative approach, @pxref{Duplicate Suppression}.
  7289. @node Duplicate Suppression
  7290. @section Duplicate Suppression
  7291. By default, Gnus tries to make sure that you don't have to read the same
  7292. article more than once by utilizing the crossposting mechanism
  7293. (@pxref{Crosspost Handling}). However, that simple and efficient
  7294. approach may not work satisfactory for some users for various
  7295. reasons.
  7296. @enumerate
  7297. @item
  7298. The @sc{nntp} server may fail to generate the @code{Xref} header. This
  7299. is evil and not very common.
  7300. @item
  7301. The @sc{nntp} server may fail to include the @code{Xref} header in the
  7302. @file{.overview} data bases. This is evil and all too common, alas.
  7303. @item
  7304. You may be reading the same group (or several related groups) from
  7305. different @sc{nntp} servers.
  7306. @item
  7307. You may be getting mail that duplicates articles posted to groups.
  7308. @end enumerate
  7309. I'm sure there are other situations where @code{Xref} handling fails as
  7310. well, but these four are the most common situations.
  7311. If, and only if, @code{Xref} handling fails for you, then you may
  7312. consider switching on @dfn{duplicate suppression}. If you do so, Gnus
  7313. will remember the @code{Message-ID}s of all articles you have read or
  7314. otherwise marked as read, and then, as if by magic, mark them as read
  7315. all subsequent times you see them---in @emph{all} groups. Using this
  7316. mechanism is quite likely to be somewhat inefficient, but not overly
  7317. so. It's certainly preferable to reading the same articles more than
  7318. once.
  7319. Duplicate suppression is not a very subtle instrument. It's more like a
  7320. sledge hammer than anything else. It works in a very simple
  7321. fashion---if you have marked an article as read, it adds this Message-ID
  7322. to a cache. The next time it sees this Message-ID, it will mark the
  7323. article as read with the @samp{M} mark. It doesn't care what group it
  7324. saw the article in.
  7325. @table @code
  7326. @item gnus-suppress-duplicates
  7327. @vindex gnus-suppress-duplicates
  7328. If non-@code{nil}, suppress duplicates.
  7329. @item gnus-save-duplicate-list
  7330. @vindex gnus-save-duplicate-list
  7331. If non-@code{nil}, save the list of duplicates to a file. This will
  7332. make startup and shutdown take longer, so the default is @code{nil}.
  7333. However, this means that only duplicate articles read in a single Gnus
  7334. session are suppressed.
  7335. @item gnus-duplicate-list-length
  7336. @vindex gnus-duplicate-list-length
  7337. This variable says how many @code{Message-ID}s to keep in the duplicate
  7338. suppression list. The default is 10000.
  7339. @item gnus-duplicate-file
  7340. @vindex gnus-duplicate-file
  7341. The name of the file to store the duplicate suppression list in. The
  7342. default is @file{~/News/suppression}.
  7343. @end table
  7344. If you have a tendency to stop and start Gnus often, setting
  7345. @code{gnus-save-duplicate-list} to @code{t} is probably a good idea. If
  7346. you leave Gnus running for weeks on end, you may have it @code{nil}. On
  7347. the other hand, saving the list makes startup and shutdown much slower,
  7348. so that means that if you stop and start Gnus often, you should set
  7349. @code{gnus-save-duplicate-list} to @code{nil}. Uhm. I'll leave this up
  7350. to you to figure out, I think.
  7351. @node The Article Buffer
  7352. @chapter The Article Buffer
  7353. @cindex article buffer
  7354. The articles are displayed in the article buffer, of which there is only
  7355. one. All the summary buffers share the same article buffer unless you
  7356. tell Gnus otherwise.
  7357. @menu
  7358. * Hiding Headers:: Deciding what headers should be displayed.
  7359. * Using MIME:: Pushing articles through @sc{mime} before reading them.
  7360. * Customizing Articles:: Tailoring the look of the articles.
  7361. * Article Keymap:: Keystrokes available in the article buffer.
  7362. * Misc Article:: Other stuff.
  7363. @end menu
  7364. @node Hiding Headers
  7365. @section Hiding Headers
  7366. @cindex hiding headers
  7367. @cindex deleting headers
  7368. The top section of each article is the @dfn{head}. (The rest is the
  7369. @dfn{body}, but you may have guessed that already.)
  7370. @vindex gnus-show-all-headers
  7371. There is a lot of useful information in the head: the name of the person
  7372. who wrote the article, the date it was written and the subject of the
  7373. article. That's well and nice, but there's also lots of information
  7374. most people do not want to see---what systems the article has passed
  7375. through before reaching you, the @code{Message-ID}, the
  7376. @code{References}, etc. ad nauseum---and you'll probably want to get rid
  7377. of some of those lines. If you want to keep all those lines in the
  7378. article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
  7379. Gnus provides you with two variables for sifting headers:
  7380. @table @code
  7381. @item gnus-visible-headers
  7382. @vindex gnus-visible-headers
  7383. If this variable is non-@code{nil}, it should be a regular expression
  7384. that says what headers you wish to keep in the article buffer. All
  7385. headers that do not match this variable will be hidden.
  7386. For instance, if you only want to see the name of the person who wrote
  7387. the article and the subject, you'd say:
  7388. @lisp
  7389. (setq gnus-visible-headers "^From:\\|^Subject:")
  7390. @end lisp
  7391. This variable can also be a list of regexps to match headers to
  7392. remain visible.
  7393. @item gnus-ignored-headers
  7394. @vindex gnus-ignored-headers
  7395. This variable is the reverse of @code{gnus-visible-headers}. If this
  7396. variable is set (and @code{gnus-visible-headers} is @code{nil}), it
  7397. should be a regular expression that matches all lines that you want to
  7398. hide. All lines that do not match this variable will remain visible.
  7399. For instance, if you just want to get rid of the @code{References} line
  7400. and the @code{Xref} line, you might say:
  7401. @lisp
  7402. (setq gnus-ignored-headers "^References:\\|^Xref:")
  7403. @end lisp
  7404. This variable can also be a list of regexps to match headers to
  7405. be removed.
  7406. Note that if @code{gnus-visible-headers} is non-@code{nil}, this
  7407. variable will have no effect.
  7408. @end table
  7409. @vindex gnus-sorted-header-list
  7410. Gnus can also sort the headers for you. (It does this by default.) You
  7411. can control the sorting by setting the @code{gnus-sorted-header-list}
  7412. variable. It is a list of regular expressions that says in what order
  7413. the headers are to be displayed.
  7414. For instance, if you want the name of the author of the article first,
  7415. and then the subject, you might say something like:
  7416. @lisp
  7417. (setq gnus-sorted-header-list '("^From:" "^Subject:"))
  7418. @end lisp
  7419. Any headers that are to remain visible, but are not listed in this
  7420. variable, will be displayed in random order after all the headers listed in this variable.
  7421. @findex gnus-article-hide-boring-headers
  7422. @vindex gnus-boring-article-headers
  7423. You can hide further boring headers by setting
  7424. @code{gnus-treat-hide-boring-header} to @code{head}. What this function
  7425. does depends on the @code{gnus-boring-article-headers} variable. It's a
  7426. list, but this list doesn't actually contain header names. Instead is
  7427. lists various @dfn{boring conditions} that Gnus can check and remove
  7428. from sight.
  7429. These conditions are:
  7430. @table @code
  7431. @item empty
  7432. Remove all empty headers.
  7433. @item followup-to
  7434. Remove the @code{Followup-To} header if it is identical to the
  7435. @code{Newsgroups} header.
  7436. @item reply-to
  7437. Remove the @code{Reply-To} header if it lists the same address as the
  7438. @code{From} header.
  7439. @item newsgroups
  7440. Remove the @code{Newsgroups} header if it only contains the current group
  7441. name.
  7442. @item date
  7443. Remove the @code{Date} header if the article is less than three days
  7444. old.
  7445. @item long-to
  7446. Remove the @code{To} header if it is very long.
  7447. @item many-to
  7448. Remove all @code{To} headers if there are more than one.
  7449. @end table
  7450. To include the four three elements, you could say something like;
  7451. @lisp
  7452. (setq gnus-boring-article-headers
  7453. '(empty followup-to reply-to))
  7454. @end lisp
  7455. This is also the default value for this variable.
  7456. @node Using MIME
  7457. @section Using @sc{mime}
  7458. @cindex @sc{mime}
  7459. Mime is a standard for waving your hands through the air, aimlessly,
  7460. while people stand around yawning.
  7461. @sc{mime}, however, is a standard for encoding your articles, aimlessly,
  7462. while all newsreaders die of fear.
  7463. @sc{mime} may specify what character set the article uses, the encoding
  7464. of the characters, and it also makes it possible to embed pictures and
  7465. other naughty stuff in innocent-looking articles.
  7466. @vindex gnus-display-mime-function
  7467. @findex gnus-display-mime
  7468. Gnus pushes @sc{mime} articles through @code{gnus-display-mime-function}
  7469. to display the @sc{mime} parts. This is @code{gnus-display-mime} by
  7470. default, which creates a bundle of clickable buttons that can be used to
  7471. display, save and manipulate the @sc{mime} objects.
  7472. The following commands are available when you have placed point over a
  7473. @sc{mime} button:
  7474. @table @kbd
  7475. @findex gnus-article-press-button
  7476. @item @key{RET} @r{(Article)}
  7477. @itemx Mouse-2 @r{(Article)}
  7478. Toggle displaying of the @sc{mime} object
  7479. (@code{gnus-article-press-button}).
  7480. @findex gnus-mime-view-part
  7481. @item M-@key{RET} @r{(Article)}
  7482. @itemx v @r{(Article)}
  7483. Prompt for a method, and then view the @sc{mime} object using this
  7484. method (@code{gnus-mime-view-part}).
  7485. @findex gnus-mime-save-part
  7486. @item o @r{(Article)}
  7487. Prompt for a file name, and then save the @sc{mime} object
  7488. (@code{gnus-mime-save-part}).
  7489. @findex gnus-mime-copy-part
  7490. @item c @r{(Article)}
  7491. Copy the @sc{mime} object to a fresh buffer and display this buffer
  7492. (@code{gnus-mime-copy-part}).
  7493. @findex gnus-mime-view-part-as-type
  7494. @item t @r{(Article)}
  7495. View the @sc{mime} object as if it were a different @sc{mime} media type
  7496. (@code{gnus-mime-view-part-as-type}).
  7497. @findex gnus-mime-pipe-part
  7498. @item | @r{(Article)}
  7499. Output the @sc{mime} object to a process (@code{gnus-mime-pipe-part}).
  7500. @findex gnus-mime-inline-part
  7501. @item i @r{(Article)}
  7502. Insert the contents of the @sc{mime} object into the buffer
  7503. (@code{gnus-mime-inline-part}) as text/plain. If given a prefix, insert
  7504. the raw contents without decoding. If given a numerical prefix, you can
  7505. do semi-manual charset stuff (see
  7506. @code{gnus-summary-show-article-charset-alist} in @pxref{Paging the
  7507. Article}).
  7508. @findex gnus-mime-action-on-part
  7509. @item . @r{(Article)}
  7510. Interactively run an action on the @sc{mime} object
  7511. (@code{gnus-mime-action-on-part}).
  7512. @end table
  7513. Gnus will display some @sc{mime} objects automatically. The way Gnus
  7514. determines which parts to do this with is described in the Emacs MIME
  7515. manual.
  7516. It might be best to just use the toggling functions from the article
  7517. buffer to avoid getting nasty surprises. (For instance, you enter the
  7518. group @samp{alt.sing-a-long} and, before you know it, @sc{mime} has
  7519. decoded the sound file in the article and some horrible sing-a-long song
  7520. comes screaming out your speakers, and you can't find the volume button,
  7521. because there isn't one, and people are starting to look at you, and you
  7522. try to stop the program, but you can't, and you can't find the program
  7523. to control the volume, and everybody else in the room suddenly decides
  7524. to look at you disdainfully, and you'll feel rather stupid.)
  7525. Any similarity to real events and people is purely coincidental. Ahem.
  7526. Also see @pxref{MIME Commands}.
  7527. @node Customizing Articles
  7528. @section Customizing Articles
  7529. @cindex article customization
  7530. A slew of functions for customizing how the articles are to look like
  7531. exist. You can call these functions interactively, or you can have them
  7532. called automatically when you select the articles.
  7533. To have them called automatically, you should set the corresponding
  7534. ``treatment'' variable. For instance, to have headers hidden, you'd set
  7535. @code{gnus-treat-hide-headers}. Below is a list of variables that can
  7536. be set, but first we discuss the values these variables can have.
  7537. Note: Some values, while valid, make little sense. Check the list below
  7538. for sensible values.
  7539. @enumerate
  7540. @item
  7541. @code{nil}: Don't do this treatment.
  7542. @item
  7543. @code{t}: Do this treatment on all body parts.
  7544. @item
  7545. @code{head}: Do the treatment on the headers.
  7546. @item
  7547. @code{last}: Do this treatment on the last part.
  7548. @item
  7549. An integer: Do this treatment on all body parts that have a length less
  7550. than this number.
  7551. @item
  7552. A list of strings: Do this treatment on all body parts that are in
  7553. articles that are read in groups that have names that match one of the
  7554. regexps in the list.
  7555. @item
  7556. A list where the first element is not a string:
  7557. The list is evaluated recursively. The first element of the list is a
  7558. predicate. The following predicates are recognized: @code{or},
  7559. @code{and}, @code{not} and @code{typep}. Here's an example:
  7560. @lisp
  7561. (or last
  7562. (typep "text/x-vcard"))
  7563. @end lisp
  7564. @end enumerate
  7565. You may have noticed that the word @dfn{part} is used here. This refers
  7566. to the fact that some messages are @sc{mime} multipart articles that may
  7567. be divided into several parts. Articles that are not multiparts are
  7568. considered to contain just a single part.
  7569. @vindex gnus-article-treat-types
  7570. Are the treatments applied to all sorts of multipart parts? Yes, if you
  7571. want to, but by default, only @samp{text/plain} parts are given the
  7572. treatment. This is controlled by the @code{gnus-article-treat-types}
  7573. variable, which is a list of regular expressions that are matched to the
  7574. type of the part. This variable is ignored if the value of the
  7575. controlling variable is a predicate list, as described above.
  7576. The following treatment options are available. The easiest way to
  7577. customize this is to examine the @code{gnus-article-treat} customization
  7578. group. Values in parenthesis are suggested sensible values. Others are
  7579. possible but those listed are probably sufficient for most people.
  7580. @table @code
  7581. @item gnus-treat-highlight-signature (t, last)
  7582. @item gnus-treat-buttonize (t, integer)
  7583. @item gnus-treat-buttonize-head (head)
  7584. @item gnus-treat-emphasize (t, head, integer)
  7585. @item gnus-treat-fill-article (t, integer)
  7586. @item gnus-treat-strip-cr (t, integer)
  7587. @item gnus-treat-hide-headers (head)
  7588. @item gnus-treat-hide-boring-headers (head)
  7589. @item gnus-treat-hide-signature (t, last)
  7590. @item gnus-treat-hide-citation (t, integer)
  7591. @item gnus-treat-strip-pgp (t, last, integer)
  7592. @item gnus-treat-strip-pem (t, last, integer)
  7593. @item gnus-treat-highlight-headers (head)
  7594. @item gnus-treat-highlight-citation (t, integer)
  7595. @item gnus-treat-highlight-signature (t, last, integer)
  7596. @item gnus-treat-date-ut (head)
  7597. @item gnus-treat-date-local (head)
  7598. @item gnus-treat-date-lapsed (head)
  7599. @item gnus-treat-date-original (head)
  7600. @item gnus-treat-strip-headers-in-body (t, integer)
  7601. @item gnus-treat-strip-trailing-blank-lines (t, last, integer)
  7602. @item gnus-treat-strip-leading-blank-lines (t, integer)
  7603. @item gnus-treat-strip-multiple-blank-lines (t, integer)
  7604. @item gnus-treat-overstrike (t, integer)
  7605. @item gnus-treat-display-xface (head)
  7606. @item gnus-treat-display-smileys (t, integer)
  7607. @item gnus-treat-display-picons (head)
  7608. @item gnus-treat-capitalize-sentences (t, integer)
  7609. @item gnus-treat-fill-long-lines (t, integer)
  7610. @item gnus-treat-play-sounds
  7611. @item gnus-treat-translate
  7612. @end table
  7613. @vindex gnus-part-display-hook
  7614. You can, of course, write your own functions to be called from
  7615. @code{gnus-part-display-hook}. The functions are called narrowed to the
  7616. part, and you can do anything you like, pretty much. There is no
  7617. information that you have to keep in the buffer---you can change
  7618. everything.
  7619. @node Article Keymap
  7620. @section Article Keymap
  7621. Most of the keystrokes in the summary buffer can also be used in the
  7622. article buffer. They should behave as if you typed them in the summary
  7623. buffer, which means that you don't actually have to have a summary
  7624. buffer displayed while reading. You can do it all from the article
  7625. buffer.
  7626. A few additional keystrokes are available:
  7627. @table @kbd
  7628. @item @key{SPC}
  7629. @kindex @key{SPC} @r{(Article)}
  7630. @findex gnus-article-next-page
  7631. Scroll forwards one page (@code{gnus-article-next-page}).
  7632. @item @key{DEL}
  7633. @kindex @key{DEL} @r{(Article)}
  7634. @findex gnus-article-prev-page
  7635. Scroll backwards one page (@code{gnus-article-prev-page}).
  7636. @item C-c ^
  7637. @kindex C-c ^ @r{(Article)}
  7638. @findex gnus-article-refer-article
  7639. If point is in the neighborhood of a @code{Message-ID} and you press
  7640. @kbd{C-c ^}, Gnus will try to get that article from the server
  7641. (@code{gnus-article-refer-article}).
  7642. @item C-c C-m
  7643. @kindex C-c C-m @r{(Article)}
  7644. @findex gnus-article-mail
  7645. Send a reply to the address near point (@code{gnus-article-mail}). If
  7646. given a prefix, include the mail.
  7647. @item s
  7648. @kindex s @r{(Article)}
  7649. @findex gnus-article-show-summary
  7650. Reconfigure the buffers so that the summary buffer becomes visible
  7651. (@code{gnus-article-show-summary}).
  7652. @item ?
  7653. @kindex ? @r{(Article)}
  7654. @findex gnus-article-describe-briefly
  7655. Give a very brief description of the available keystrokes
  7656. (@code{gnus-article-describe-briefly}).
  7657. @item TAB
  7658. @kindex TAB @r{(Article)}
  7659. @findex gnus-article-next-button
  7660. Go to the next button, if any (@code{gnus-article-next-button}). This
  7661. only makes sense if you have buttonizing turned on.
  7662. @item M-TAB
  7663. @kindex M-TAB @r{(Article)}
  7664. @findex gnus-article-prev-button
  7665. Go to the previous button, if any (@code{gnus-article-prev-button}).
  7666. @end table
  7667. @node Misc Article
  7668. @section Misc Article
  7669. @table @code
  7670. @item gnus-single-article-buffer
  7671. @vindex gnus-single-article-buffer
  7672. If non-@code{nil}, use the same article buffer for all the groups.
  7673. (This is the default.) If @code{nil}, each group will have its own
  7674. article buffer.
  7675. @vindex gnus-article-decode-hook
  7676. @item gnus-article-decode-hook
  7677. @cindex MIME
  7678. Hook used to decode @sc{mime} articles. The default value is
  7679. @code{(article-decode-charset article-decode-encoded-words)}
  7680. @vindex gnus-article-prepare-hook
  7681. @item gnus-article-prepare-hook
  7682. This hook is called right after the article has been inserted into the
  7683. article buffer. It is mainly intended for functions that do something
  7684. depending on the contents; it should probably not be used for changing
  7685. the contents of the article buffer.
  7686. @item gnus-article-mode-hook
  7687. @vindex gnus-article-mode-hook
  7688. Hook called in article mode buffers.
  7689. @item gnus-article-mode-syntax-table
  7690. @vindex gnus-article-mode-syntax-table
  7691. Syntax table used in article buffers. It is initialized from
  7692. @code{text-mode-syntax-table}.
  7693. @vindex gnus-article-mode-line-format
  7694. @item gnus-article-mode-line-format
  7695. This variable is a format string along the same lines as
  7696. @code{gnus-summary-mode-line-format} (@pxref{Mode Line Formatting}). It
  7697. accepts the same format specifications as that variable, with two
  7698. extensions:
  7699. @table @samp
  7700. @item w
  7701. The @dfn{wash status} of the article. This is a short string with one
  7702. character for each possible article wash operation that may have been
  7703. performed.
  7704. @item m
  7705. The number of @sc{mime} parts in the article.
  7706. @end table
  7707. @vindex gnus-break-pages
  7708. @item gnus-break-pages
  7709. Controls whether @dfn{page breaking} is to take place. If this variable
  7710. is non-@code{nil}, the articles will be divided into pages whenever a
  7711. page delimiter appears in the article. If this variable is @code{nil},
  7712. paging will not be done.
  7713. @item gnus-page-delimiter
  7714. @vindex gnus-page-delimiter
  7715. This is the delimiter mentioned above. By default, it is @samp{^L}
  7716. (formfeed).
  7717. @end table
  7718. @node Composing Messages
  7719. @chapter Composing Messages
  7720. @cindex composing messages
  7721. @cindex messages
  7722. @cindex mail
  7723. @cindex sending mail
  7724. @cindex reply
  7725. @cindex followup
  7726. @cindex post
  7727. @kindex C-c C-c (Post)
  7728. All commands for posting and mailing will put you in a message buffer
  7729. where you can edit the article all you like, before you send the
  7730. article by pressing @kbd{C-c C-c}. @xref{Top, , Top, message, The
  7731. Message Manual}. Where the message will be posted/mailed to depends
  7732. on your setup (@pxref{Posting Server}).
  7733. @menu
  7734. * Mail:: Mailing and replying.
  7735. * Posting Server:: What server should you post via?
  7736. * Mail and Post:: Mailing and posting at the same time.
  7737. * Archived Messages:: Where Gnus stores the messages you've sent.
  7738. * Posting Styles:: An easier way to specify who you are.
  7739. * Drafts:: Postponing messages and rejected messages.
  7740. * Rejected Articles:: What happens if the server doesn't like your article?
  7741. @end menu
  7742. Also see @pxref{Canceling and Superseding} for information on how to
  7743. remove articles you shouldn't have posted.
  7744. @node Mail
  7745. @section Mail
  7746. Variables for customizing outgoing mail:
  7747. @table @code
  7748. @item gnus-uu-digest-headers
  7749. @vindex gnus-uu-digest-headers
  7750. List of regexps to match headers included in digested messages. The
  7751. headers will be included in the sequence they are matched.
  7752. @item gnus-add-to-list
  7753. @vindex gnus-add-to-list
  7754. If non-@code{nil}, add a @code{to-list} group parameter to mail groups
  7755. that have none when you do a @kbd{a}.
  7756. @end table
  7757. @node Posting Server
  7758. @section Posting Server
  7759. When you press those magical @kbd{C-c C-c} keys to ship off your latest
  7760. (extremely intelligent, of course) article, where does it go?
  7761. Thank you for asking. I hate you.
  7762. @vindex gnus-post-method
  7763. It can be quite complicated. Normally, Gnus will use the same native
  7764. server. However. If your native server doesn't allow posting, just
  7765. reading, you probably want to use some other server to post your
  7766. (extremely intelligent and fabulously interesting) articles. You can
  7767. then set the @code{gnus-post-method} to some other method:
  7768. @lisp
  7769. (setq gnus-post-method '(nnspool ""))
  7770. @end lisp
  7771. Now, if you've done this, and then this server rejects your article, or
  7772. this server is down, what do you do then? To override this variable you
  7773. can use a non-zero prefix to the @kbd{C-c C-c} command to force using
  7774. the ``current'' server for posting.
  7775. If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
  7776. Gnus will prompt you for what method to use for posting.
  7777. You can also set @code{gnus-post-method} to a list of select methods.
  7778. If that's the case, Gnus will always prompt you for what method to use
  7779. for posting.
  7780. Finally, if you want to always post using the same select method as
  7781. you're reading from (which might be convenient if you're reading lots of
  7782. groups from different private servers), you can set this variable to
  7783. @code{current}.
  7784. @node Mail and Post
  7785. @section Mail and Post
  7786. Here's a list of variables relevant to both mailing and
  7787. posting:
  7788. @table @code
  7789. @item gnus-mailing-list-groups
  7790. @findex gnus-mailing-list-groups
  7791. @cindex mailing lists
  7792. If your news server offers groups that are really mailing lists
  7793. gatewayed to the @sc{nntp} server, you can read those groups without
  7794. problems, but you can't post/followup to them without some difficulty.
  7795. One solution is to add a @code{to-address} to the group parameters
  7796. (@pxref{Group Parameters}). An easier thing to do is set the
  7797. @code{gnus-mailing-list-groups} to a regexp that matches the groups that
  7798. really are mailing lists. Then, at least, followups to the mailing
  7799. lists will work most of the time. Posting to these groups (@kbd{a}) is
  7800. still a pain, though.
  7801. @end table
  7802. You may want to do spell-checking on messages that you send out. Or, if
  7803. you don't want to spell-check by hand, you could add automatic
  7804. spell-checking via the @code{ispell} package:
  7805. @cindex ispell
  7806. @findex ispell-message
  7807. @lisp
  7808. (add-hook 'message-send-hook 'ispell-message)
  7809. @end lisp
  7810. If you want to change the @code{ispell} dictionary based on what group
  7811. you're in, you could say something like the following:
  7812. @lisp
  7813. (add-hook 'gnus-select-group-hook
  7814. (lambda ()
  7815. (cond
  7816. ((string-match "^de\\." gnus-newsgroup-name)
  7817. (ispell-change-dictionary "deutsch"))
  7818. (t
  7819. (ispell-change-dictionary "english")))))
  7820. @end lisp
  7821. Modify to suit your needs.
  7822. @node Archived Messages
  7823. @section Archived Messages
  7824. @cindex archived messages
  7825. @cindex sent messages
  7826. Gnus provides a few different methods for storing the mail and news you
  7827. send. The default method is to use the @dfn{archive virtual server} to
  7828. store the messages. If you want to disable this completely, the
  7829. @code{gnus-message-archive-group} variable should be @code{nil}, which
  7830. is the default.
  7831. @vindex gnus-message-archive-method
  7832. @code{gnus-message-archive-method} says what virtual server Gnus is to
  7833. use to store sent messages. The default is:
  7834. @lisp
  7835. (nnfolder "archive"
  7836. (nnfolder-directory "~/Mail/archive")
  7837. (nnfolder-active-file "~/Mail/archive/active")
  7838. (nnfolder-get-new-mail nil)
  7839. (nnfolder-inhibit-expiry t))
  7840. @end lisp
  7841. You can, however, use any mail select method (@code{nnml},
  7842. @code{nnmbox}, etc.). @code{nnfolder} is a quite likable select method
  7843. for doing this sort of thing, though. If you don't like the default
  7844. directory chosen, you could say something like:
  7845. @lisp
  7846. (setq gnus-message-archive-method
  7847. '(nnfolder "archive"
  7848. (nnfolder-inhibit-expiry t)
  7849. (nnfolder-active-file "~/News/sent-mail/active")
  7850. (nnfolder-directory "~/News/sent-mail/")))
  7851. @end lisp
  7852. @vindex gnus-message-archive-group
  7853. @cindex Gcc
  7854. Gnus will insert @code{Gcc} headers in all outgoing messages that point
  7855. to one or more group(s) on that server. Which group to use is
  7856. determined by the @code{gnus-message-archive-group} variable.
  7857. This variable can be used to do the following:
  7858. @itemize @bullet
  7859. @item a string
  7860. Messages will be saved in that group.
  7861. Note that you can include a select method in the group name, then the
  7862. message will not be stored in the select method given by
  7863. @code{gnus-message-archive-method}, but in the select method specified
  7864. by the group name, instead. Suppose @code{gnus-message-archive-method}
  7865. has the default value shown above. Then setting
  7866. @code{gnus-message-archive-group} to @code{"foo"} means that outgoing
  7867. messages are stored in @samp{nnfolder+archive:foo}, but if you use the
  7868. value @code{"nnml:foo"}, then outgoing messages will be stored in
  7869. @samp{nnml:foo}.
  7870. @item a list of strings
  7871. Messages will be saved in all those groups.
  7872. @item an alist of regexps, functions and forms
  7873. When a key ``matches'', the result is used.
  7874. @item @code{nil}
  7875. No message archiving will take place. This is the default.
  7876. @end itemize
  7877. Let's illustrate:
  7878. Just saving to a single group called @samp{MisK}:
  7879. @lisp
  7880. (setq gnus-message-archive-group "MisK")
  7881. @end lisp
  7882. Saving to two groups, @samp{MisK} and @samp{safe}:
  7883. @lisp
  7884. (setq gnus-message-archive-group '("MisK" "safe"))
  7885. @end lisp
  7886. Save to different groups based on what group you are in:
  7887. @lisp
  7888. (setq gnus-message-archive-group
  7889. '(("^alt" "sent-to-alt")
  7890. ("mail" "sent-to-mail")
  7891. (".*" "sent-to-misc")))
  7892. @end lisp
  7893. More complex stuff:
  7894. @lisp
  7895. (setq gnus-message-archive-group
  7896. '((if (message-news-p)
  7897. "misc-news"
  7898. "misc-mail")))
  7899. @end lisp
  7900. How about storing all news messages in one file, but storing all mail
  7901. messages in one file per month:
  7902. @lisp
  7903. (setq gnus-message-archive-group
  7904. '((if (message-news-p)
  7905. "misc-news"
  7906. (concat "mail." (format-time-string "%Y-%m")))))
  7907. @end lisp
  7908. (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
  7909. use a different value for @code{gnus-message-archive-group} there.)
  7910. Now, when you send a message off, it will be stored in the appropriate
  7911. group. (If you want to disable storing for just one particular message,
  7912. you can just remove the @code{Gcc} header that has been inserted.) The
  7913. archive group will appear in the group buffer the next time you start
  7914. Gnus, or the next time you press @kbd{F} in the group buffer. You can
  7915. enter it and read the articles in it just like you'd read any other
  7916. group. If the group gets really big and annoying, you can simply rename
  7917. if (using @kbd{G r} in the group buffer) to something
  7918. nice---@samp{misc-mail-september-1995}, or whatever. New messages will
  7919. continue to be stored in the old (now empty) group.
  7920. That's the default method of archiving sent messages. Gnus offers a
  7921. different way for the people who don't like the default method. In that
  7922. case you should set @code{gnus-message-archive-group} to @code{nil};
  7923. this will disable archiving.
  7924. @table @code
  7925. @item gnus-outgoing-message-group
  7926. @vindex gnus-outgoing-message-group
  7927. All outgoing messages will be put in this group. If you want to store
  7928. all your outgoing mail and articles in the group @samp{nnml:archive},
  7929. you set this variable to that value. This variable can also be a list of
  7930. group names.
  7931. If you want to have greater control over what group to put each
  7932. message in, you can set this variable to a function that checks the
  7933. current newsgroup name and then returns a suitable group name (or list
  7934. of names).
  7935. This variable can be used instead of @code{gnus-message-archive-group},
  7936. but the latter is the preferred method.
  7937. @end table
  7938. @node Posting Styles
  7939. @section Posting Styles
  7940. @cindex posting styles
  7941. @cindex styles
  7942. All them variables, they make my head swim.
  7943. So what if you want a different @code{Organization} and signature based
  7944. on what groups you post to? And you post both from your home machine
  7945. and your work machine, and you want different @code{From} lines, and so
  7946. on?
  7947. @vindex gnus-posting-styles
  7948. One way to do stuff like that is to write clever hooks that change the
  7949. variables you need to have changed. That's a bit boring, so somebody
  7950. came up with the bright idea of letting the user specify these things in
  7951. a handy alist. Here's an example of a @code{gnus-posting-styles}
  7952. variable:
  7953. @lisp
  7954. ((".*"
  7955. (signature "Peace and happiness")
  7956. (organization "What me?"))
  7957. ("^comp"
  7958. (signature "Death to everybody"))
  7959. ("comp.emacs.i-love-it"
  7960. (organization "Emacs is it")))
  7961. @end lisp
  7962. As you might surmise from this example, this alist consists of several
  7963. @dfn{styles}. Each style will be applicable if the first element
  7964. ``matches'', in some form or other. The entire alist will be iterated
  7965. over, from the beginning towards the end, and each match will be
  7966. applied, which means that attributes in later styles that match override
  7967. the same attributes in earlier matching styles. So
  7968. @samp{comp.programming.literate} will have the @samp{Death to everybody}
  7969. signature and the @samp{What me?} @code{Organization} header.
  7970. The first element in each style is called the @code{match}. If it's a
  7971. string, then Gnus will try to regexp match it against the group name.
  7972. If it is the symbol @code{header}, then Gnus will look for header that
  7973. match the next element in the match, and compare that to the last header
  7974. in the match. If it's a function symbol, that function will be called
  7975. with no arguments. If it's a variable symbol, then the variable will be
  7976. referenced. If it's a list, then that list will be @code{eval}ed. In
  7977. any case, if this returns a non-@code{nil} value, then the style is said
  7978. to @dfn{match}.
  7979. Each style may contain a arbitrary amount of @dfn{attributes}. Each
  7980. attribute consists of a @code{(@var{name} . @var{value})} pair. The
  7981. attribute name can be one of @code{signature}, @code{signature-file},
  7982. @code{organization}, @code{address}, @code{name} or @code{body}. The
  7983. attribute name can also be a string. In that case, this will be used as
  7984. a header name, and the value will be inserted in the headers of the
  7985. article; if the value is @code{nil}, the header name will be removed.
  7986. If the attribute name is @code{eval}, the form is evaluated, and the
  7987. result is thrown away.
  7988. The attribute value can be a string (used verbatim), a function with
  7989. zero arguments (the return value will be used), a variable (its value
  7990. will be used) or a list (it will be @code{eval}ed and the return value
  7991. will be used). The functions and sexps are called/@code{eval}ed in the
  7992. message buffer that is being set up. The headers of the current article
  7993. are available through the @code{message-reply-headers} variable.
  7994. If you wish to check whether the message you are about to compose is
  7995. meant to be a news article or a mail message, you can check the values
  7996. of the @code{message-news-p} and @code{message-mail-p} functions.
  7997. @findex message-mail-p
  7998. @findex message-news-p
  7999. So here's a new example:
  8000. @lisp
  8001. (setq gnus-posting-styles
  8002. '((".*"
  8003. (signature-file "~/.signature")
  8004. (name "User Name")
  8005. ("X-Home-Page" (getenv "WWW_HOME"))
  8006. (organization "People's Front Against MWM"))
  8007. ("^rec.humor"
  8008. (signature my-funny-signature-randomizer))
  8009. ((equal (system-name) "gnarly")
  8010. (signature my-quote-randomizer))
  8011. ((message-news-p)
  8012. (signature my-news-signature))
  8013. (header "From\\|To" "larsi.*org"
  8014. (Organization "Somewhere, Inc."))
  8015. ((posting-from-work-p)
  8016. (signature-file "~/.work-signature")
  8017. (address "user@@bar.foo")
  8018. (body "You are fired.\n\nSincerely, your boss.")
  8019. (organization "Important Work, Inc"))
  8020. ("nnml:.*"
  8021. (From (save-excursion
  8022. (set-buffer gnus-article-buffer)
  8023. (message-fetch-field "to"))))
  8024. ("^nn.+:"
  8025. (signature-file "~/.mail-signature"))))
  8026. @end lisp
  8027. The @samp{nnml:.*} rule means that you use the @code{To} address as the
  8028. @code{From} address in all your outgoing replies, which might be handy
  8029. if you fill many roles.
  8030. @node Drafts
  8031. @section Drafts
  8032. @cindex drafts
  8033. If you are writing a message (mail or news) and suddenly remember that
  8034. you have a steak in the oven (or some pesto in the food processor, you
  8035. craaazy vegetarians), you'll probably wish there was a method to save
  8036. the message you are writing so that you can continue editing it some
  8037. other day, and send it when you feel its finished.
  8038. Well, don't worry about it. Whenever you start composing a message of
  8039. some sort using the Gnus mail and post commands, the buffer you get will
  8040. automatically associate to an article in a special @dfn{draft} group.
  8041. If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
  8042. article will be saved there. (Auto-save files also go to the draft
  8043. group.)
  8044. @cindex nndraft
  8045. @vindex nndraft-directory
  8046. The draft group is a special group (which is implemented as an
  8047. @code{nndraft} group, if you absolutely have to know) called
  8048. @samp{nndraft:drafts}. The variable @code{nndraft-directory} says where
  8049. @code{nndraft} is to store its files. What makes this group special is
  8050. that you can't tick any articles in it or mark any articles as
  8051. read---all articles in the group are permanently unread.
  8052. If the group doesn't exist, it will be created and you'll be subscribed
  8053. to it. The only way to make it disappear from the Group buffer is to
  8054. unsubscribe it.
  8055. @c @findex gnus-dissociate-buffer-from-draft
  8056. @c @kindex C-c M-d (Mail)
  8057. @c @kindex C-c M-d (Post)
  8058. @c @findex gnus-associate-buffer-with-draft
  8059. @c @kindex C-c C-d (Mail)
  8060. @c @kindex C-c C-d (Post)
  8061. @c If you're writing some super-secret message that you later want to
  8062. @c encode with PGP before sending, you may wish to turn the auto-saving
  8063. @c (and association with the draft group) off. You never know who might be
  8064. @c interested in reading all your extremely valuable and terribly horrible
  8065. @c and interesting secrets. The @kbd{C-c M-d}
  8066. @c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
  8067. @c If you change your mind and want to turn the auto-saving back on again,
  8068. @c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
  8069. @c
  8070. @c @vindex gnus-use-draft
  8071. @c To leave association with the draft group off by default, set
  8072. @c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default.
  8073. @findex gnus-draft-edit-message
  8074. @kindex D e (Draft)
  8075. When you want to continue editing the article, you simply enter the
  8076. draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do
  8077. that. You will be placed in a buffer where you left off.
  8078. Rejected articles will also be put in this draft group (@pxref{Rejected
  8079. Articles}).
  8080. @findex gnus-draft-send-all-messages
  8081. @findex gnus-draft-send-message
  8082. If you have lots of rejected messages you want to post (or mail) without
  8083. doing further editing, you can use the @kbd{D s} command
  8084. (@code{gnus-draft-send-message}). This command understands the
  8085. process/prefix convention (@pxref{Process/Prefix}). The @kbd{D S}
  8086. command (@code{gnus-draft-send-all-messages}) will ship off all messages
  8087. in the buffer.
  8088. If you have some messages that you wish not to send, you can use the
  8089. @kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message
  8090. as unsendable. This is a toggling command.
  8091. @node Rejected Articles
  8092. @section Rejected Articles
  8093. @cindex rejected articles
  8094. Sometimes a news server will reject an article. Perhaps the server
  8095. doesn't like your face. Perhaps it just feels miserable. Perhaps
  8096. @emph{there be demons}. Perhaps you have included too much cited text.
  8097. Perhaps the disk is full. Perhaps the server is down.
  8098. These situations are, of course, totally beyond the control of Gnus.
  8099. (Gnus, of course, loves the way you look, always feels great, has angels
  8100. fluttering around inside of it, doesn't care about how much cited text
  8101. you include, never runs full and never goes down.) So Gnus saves these
  8102. articles until some later time when the server feels better.
  8103. The rejected articles will automatically be put in a special draft group
  8104. (@pxref{Drafts}). When the server comes back up again, you'd then
  8105. typically enter that group and send all the articles off.
  8106. @node Select Methods
  8107. @chapter Select Methods
  8108. @cindex foreign groups
  8109. @cindex select methods
  8110. A @dfn{foreign group} is a group not read by the usual (or
  8111. default) means. It could be, for instance, a group from a different
  8112. @sc{nntp} server, it could be a virtual group, or it could be your own
  8113. personal mail group.
  8114. A foreign group (or any group, really) is specified by a @dfn{name} and
  8115. a @dfn{select method}. To take the latter first, a select method is a
  8116. list where the first element says what back end to use (e.g. @code{nntp},
  8117. @code{nnspool}, @code{nnml}) and the second element is the @dfn{server
  8118. name}. There may be additional elements in the select method, where the
  8119. value may have special meaning for the back end in question.
  8120. One could say that a select method defines a @dfn{virtual server}---so
  8121. we do just that (@pxref{The Server Buffer}).
  8122. The @dfn{name} of the group is the name the back end will recognize the
  8123. group as.
  8124. For instance, the group @samp{soc.motss} on the @sc{nntp} server
  8125. @samp{some.where.edu} will have the name @samp{soc.motss} and select
  8126. method @code{(nntp "some.where.edu")}. Gnus will call this group
  8127. @samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
  8128. back end just knows this group as @samp{soc.motss}.
  8129. The different methods all have their peculiarities, of course.
  8130. @menu
  8131. * The Server Buffer:: Making and editing virtual servers.
  8132. * Getting News:: Reading USENET news with Gnus.
  8133. * Getting Mail:: Reading your personal mail with Gnus.
  8134. * Browsing the Web:: Getting messages from a plethora of Web sources.
  8135. * Other Sources:: Reading directories, files, SOUP packets.
  8136. * Combined Groups:: Combining groups into one group.
  8137. * Gnus Unplugged:: Reading news and mail offline.
  8138. @end menu
  8139. @node The Server Buffer
  8140. @section The Server Buffer
  8141. Traditionally, a @dfn{server} is a machine or a piece of software that
  8142. one connects to, and then requests information from. Gnus does not
  8143. connect directly to any real servers, but does all transactions through
  8144. one back end or other. But that's just putting one layer more between
  8145. the actual media and Gnus, so we might just as well say that each
  8146. back end represents a virtual server.
  8147. For instance, the @code{nntp} back end may be used to connect to several
  8148. different actual @sc{nntp} servers, or, perhaps, to many different ports
  8149. on the same actual @sc{nntp} server. You tell Gnus which back end to
  8150. use, and what parameters to set by specifying a @dfn{select method}.
  8151. These select method specifications can sometimes become quite
  8152. complicated---say, for instance, that you want to read from the
  8153. @sc{nntp} server @samp{news.funet.fi} on port number 13, which
  8154. hangs if queried for @sc{nov} headers and has a buggy select. Ahem.
  8155. Anyway, if you had to specify that for each group that used this
  8156. server, that would be too much work, so Gnus offers a way of naming
  8157. select methods, which is what you do in the server buffer.
  8158. To enter the server buffer, use the @kbd{^}
  8159. (@code{gnus-group-enter-server-mode}) command in the group buffer.
  8160. @menu
  8161. * Server Buffer Format:: You can customize the look of this buffer.
  8162. * Server Commands:: Commands to manipulate servers.
  8163. * Example Methods:: Examples server specifications.
  8164. * Creating a Virtual Server:: An example session.
  8165. * Server Variables:: Which variables to set.
  8166. * Servers and Methods:: You can use server names as select methods.
  8167. * Unavailable Servers:: Some servers you try to contact may be down.
  8168. @end menu
  8169. @vindex gnus-server-mode-hook
  8170. @code{gnus-server-mode-hook} is run when creating the server buffer.
  8171. @node Server Buffer Format
  8172. @subsection Server Buffer Format
  8173. @cindex server buffer format
  8174. @vindex gnus-server-line-format
  8175. You can change the look of the server buffer lines by changing the
  8176. @code{gnus-server-line-format} variable. This is a @code{format}-like
  8177. variable, with some simple extensions:
  8178. @table @samp
  8179. @item h
  8180. How the news is fetched---the back end name.
  8181. @item n
  8182. The name of this server.
  8183. @item w
  8184. Where the news is to be fetched from---the address.
  8185. @item s
  8186. The opened/closed/denied status of the server.
  8187. @end table
  8188. @vindex gnus-server-mode-line-format
  8189. The mode line can also be customized by using the
  8190. @code{gnus-server-mode-line-format} variable (@pxref{Mode Line
  8191. Formatting}). The following specs are understood:
  8192. @table @samp
  8193. @item S
  8194. Server name.
  8195. @item M
  8196. Server method.
  8197. @end table
  8198. Also @pxref{Formatting Variables}.
  8199. @node Server Commands
  8200. @subsection Server Commands
  8201. @cindex server commands
  8202. @table @kbd
  8203. @item a
  8204. @kindex a (Server)
  8205. @findex gnus-server-add-server
  8206. Add a new server (@code{gnus-server-add-server}).
  8207. @item e
  8208. @kindex e (Server)
  8209. @findex gnus-server-edit-server
  8210. Edit a server (@code{gnus-server-edit-server}).
  8211. @item @key{SPC}
  8212. @kindex @key{SPC} (Server)
  8213. @findex gnus-server-read-server
  8214. Browse the current server (@code{gnus-server-read-server}).
  8215. @item q
  8216. @kindex q (Server)
  8217. @findex gnus-server-exit
  8218. Return to the group buffer (@code{gnus-server-exit}).
  8219. @item k
  8220. @kindex k (Server)
  8221. @findex gnus-server-kill-server
  8222. Kill the current server (@code{gnus-server-kill-server}).
  8223. @item y
  8224. @kindex y (Server)
  8225. @findex gnus-server-yank-server
  8226. Yank the previously killed server (@code{gnus-server-yank-server}).
  8227. @item c
  8228. @kindex c (Server)
  8229. @findex gnus-server-copy-server
  8230. Copy the current server (@code{gnus-server-copy-server}).
  8231. @item l
  8232. @kindex l (Server)
  8233. @findex gnus-server-list-servers
  8234. List all servers (@code{gnus-server-list-servers}).
  8235. @item s
  8236. @kindex s (Server)
  8237. @findex gnus-server-scan-server
  8238. Request that the server scan its sources for new articles
  8239. (@code{gnus-server-scan-server}). This is mainly sensible with mail
  8240. servers.
  8241. @item g
  8242. @kindex g (Server)
  8243. @findex gnus-server-regenerate-server
  8244. Request that the server regenerate all its data structures
  8245. (@code{gnus-server-regenerate-server}). This can be useful if you have
  8246. a mail back end that has gotten out of sync.
  8247. @end table
  8248. @node Example Methods
  8249. @subsection Example Methods
  8250. Most select methods are pretty simple and self-explanatory:
  8251. @lisp
  8252. (nntp "news.funet.fi")
  8253. @end lisp
  8254. Reading directly from the spool is even simpler:
  8255. @lisp
  8256. (nnspool "")
  8257. @end lisp
  8258. As you can see, the first element in a select method is the name of the
  8259. back end, and the second is the @dfn{address}, or @dfn{name}, if you
  8260. will.
  8261. After these two elements, there may be an arbitrary number of
  8262. @code{(@var{variable} @var{form})} pairs.
  8263. To go back to the first example---imagine that you want to read from
  8264. port 15 on that machine. This is what the select method should
  8265. look like then:
  8266. @lisp
  8267. (nntp "news.funet.fi" (nntp-port-number 15))
  8268. @end lisp
  8269. You should read the documentation to each back end to find out what
  8270. variables are relevant, but here's an @code{nnmh} example:
  8271. @code{nnmh} is a mail back end that reads a spool-like structure. Say
  8272. you have two structures that you wish to access: One is your private
  8273. mail spool, and the other is a public one. Here's the possible spec for
  8274. your private mail:
  8275. @lisp
  8276. (nnmh "private" (nnmh-directory "~/private/mail/"))
  8277. @end lisp
  8278. (This server is then called @samp{private}, but you may have guessed
  8279. that.)
  8280. Here's the method for a public spool:
  8281. @lisp
  8282. (nnmh "public"
  8283. (nnmh-directory "/usr/information/spool/")
  8284. (nnmh-get-new-mail nil))
  8285. @end lisp
  8286. @cindex proxy
  8287. @cindex firewall
  8288. If you are behind a firewall and only have access to the @sc{nntp}
  8289. server from the firewall machine, you can instruct Gnus to @code{rlogin}
  8290. on the firewall machine and telnet from there to the @sc{nntp} server.
  8291. Doing this can be rather fiddly, but your virtual server definition
  8292. should probably look something like this:
  8293. @lisp
  8294. (nntp "firewall"
  8295. (nntp-address "the.firewall.machine")
  8296. (nntp-open-connection-function nntp-open-rlogin)
  8297. (nntp-end-of-line "\n")
  8298. (nntp-rlogin-parameters
  8299. ("telnet" "the.real.nntp.host" "nntp")))
  8300. @end lisp
  8301. If you want to use the wonderful @code{ssh} program to provide a
  8302. compressed connection over the modem line, you could create a virtual
  8303. server that would look something like this:
  8304. @lisp
  8305. (nntp "news"
  8306. (nntp-address "copper.uio.no")
  8307. (nntp-rlogin-program "ssh")
  8308. (nntp-open-connection-function nntp-open-rlogin)
  8309. (nntp-end-of-line "\n")
  8310. (nntp-rlogin-parameters
  8311. ("telnet" "news.uio.no" "nntp")))
  8312. @end lisp
  8313. This means that you have to have set up @code{ssh-agent} correctly to
  8314. provide automatic authorization, of course. And to get a compressed
  8315. connection, you have to have the @samp{Compression} option in the
  8316. @code{ssh} @file{config} file.
  8317. @node Creating a Virtual Server
  8318. @subsection Creating a Virtual Server
  8319. If you're saving lots of articles in the cache by using persistent
  8320. articles, you may want to create a virtual server to read the cache.
  8321. First you need to add a new server. The @kbd{a} command does that. It
  8322. would probably be best to use @code{nnspool} to read the cache. You
  8323. could also use @code{nnml} or @code{nnmh}, though.
  8324. Type @kbd{a nnspool @key{RET} cache @key{RET}}.
  8325. You should now have a brand new @code{nnspool} virtual server called
  8326. @samp{cache}. You now need to edit it to have the right definitions.
  8327. Type @kbd{e} to edit the server. You'll be entered into a buffer that
  8328. will contain the following:
  8329. @lisp
  8330. (nnspool "cache")
  8331. @end lisp
  8332. Change that to:
  8333. @lisp
  8334. (nnspool "cache"
  8335. (nnspool-spool-directory "~/News/cache/")
  8336. (nnspool-nov-directory "~/News/cache/")
  8337. (nnspool-active-file "~/News/cache/active"))
  8338. @end lisp
  8339. Type @kbd{C-c C-c} to return to the server buffer. If you now press
  8340. @key{RET} over this virtual server, you should be entered into a browse
  8341. buffer, and you should be able to enter any of the groups displayed.
  8342. @node Server Variables
  8343. @subsection Server Variables
  8344. One sticky point when defining variables (both on back ends and in Emacs
  8345. in general) is that some variables are typically initialized from other
  8346. variables when the definition of the variables is being loaded. If you
  8347. change the "base" variable after the variables have been loaded, you
  8348. won't change the "derived" variables.
  8349. This typically affects directory and file variables. For instance,
  8350. @code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}
  8351. directory variables are initialized from that variable, so
  8352. @code{nnml-active-file} will be @file{~/Mail/active}. If you define a
  8353. new virtual @code{nnml} server, it will @emph{not} suffice to set just
  8354. @code{nnml-directory}---you have to explicitly set all the file
  8355. variables to be what you want them to be. For a complete list of
  8356. variables for each back end, see each back end's section later in this
  8357. manual, but here's an example @code{nnml} definition:
  8358. @lisp
  8359. (nnml "public"
  8360. (nnml-directory "~/my-mail/")
  8361. (nnml-active-file "~/my-mail/active")
  8362. (nnml-newsgroups-file "~/my-mail/newsgroups"))
  8363. @end lisp
  8364. @node Servers and Methods
  8365. @subsection Servers and Methods
  8366. Wherever you would normally use a select method
  8367. (e.g. @code{gnus-secondary-select-method}, in the group select method,
  8368. when browsing a foreign server) you can use a virtual server name
  8369. instead. This could potentially save lots of typing. And it's nice all
  8370. over.
  8371. @node Unavailable Servers
  8372. @subsection Unavailable Servers
  8373. If a server seems to be unreachable, Gnus will mark that server as
  8374. @code{denied}. That means that any subsequent attempt to make contact
  8375. with that server will just be ignored. ``It can't be opened,'' Gnus
  8376. will tell you, without making the least effort to see whether that is
  8377. actually the case or not.
  8378. That might seem quite naughty, but it does make sense most of the time.
  8379. Let's say you have 10 groups subscribed to on server
  8380. @samp{nephelococcygia.com}. This server is located somewhere quite far
  8381. away from you and the machine is quite slow, so it takes 1 minute just
  8382. to find out that it refuses connection to you today. If Gnus were to
  8383. attempt to do that 10 times, you'd be quite annoyed, so Gnus won't
  8384. attempt to do that. Once it has gotten a single ``connection refused'',
  8385. it will regard that server as ``down''.
  8386. So, what happens if the machine was only feeling unwell temporarily?
  8387. How do you test to see whether the machine has come up again?
  8388. You jump to the server buffer (@pxref{The Server Buffer}) and poke it
  8389. with the following commands:
  8390. @table @kbd
  8391. @item O
  8392. @kindex O (Server)
  8393. @findex gnus-server-open-server
  8394. Try to establish connection to the server on the current line
  8395. (@code{gnus-server-open-server}).
  8396. @item C
  8397. @kindex C (Server)
  8398. @findex gnus-server-close-server
  8399. Close the connection (if any) to the server
  8400. (@code{gnus-server-close-server}).
  8401. @item D
  8402. @kindex D (Server)
  8403. @findex gnus-server-deny-server
  8404. Mark the current server as unreachable
  8405. (@code{gnus-server-deny-server}).
  8406. @item M-o
  8407. @kindex M-o (Server)
  8408. @findex gnus-server-open-all-servers
  8409. Open the connections to all servers in the buffer
  8410. (@code{gnus-server-open-all-servers}).
  8411. @item M-c
  8412. @kindex M-c (Server)
  8413. @findex gnus-server-close-all-servers
  8414. Close the connections to all servers in the buffer
  8415. (@code{gnus-server-close-all-servers}).
  8416. @item R
  8417. @kindex R (Server)
  8418. @findex gnus-server-remove-denials
  8419. Remove all marks to whether Gnus was denied connection from any servers
  8420. (@code{gnus-server-remove-denials}).
  8421. @end table
  8422. @node Getting News
  8423. @section Getting News
  8424. @cindex reading news
  8425. @cindex news back ends
  8426. A newsreader is normally used for reading news. Gnus currently provides
  8427. only two methods of getting news---it can read from an @sc{nntp} server,
  8428. or it can read from a local spool.
  8429. @menu
  8430. * NNTP:: Reading news from an @sc{nntp} server.
  8431. * News Spool:: Reading news from the local spool.
  8432. @end menu
  8433. @node NNTP
  8434. @subsection @sc{nntp}
  8435. @cindex nntp
  8436. Subscribing to a foreign group from an @sc{nntp} server is rather easy.
  8437. You just specify @code{nntp} as method and the address of the @sc{nntp}
  8438. server as the, uhm, address.
  8439. If the @sc{nntp} server is located at a non-standard port, setting the
  8440. third element of the select method to this port number should allow you
  8441. to connect to the right port. You'll have to edit the group info for
  8442. that (@pxref{Foreign Groups}).
  8443. The name of the foreign group can be the same as a native group. In
  8444. fact, you can subscribe to the same group from as many different servers
  8445. you feel like. There will be no name collisions.
  8446. The following variables can be used to create a virtual @code{nntp}
  8447. server:
  8448. @table @code
  8449. @item nntp-server-opened-hook
  8450. @vindex nntp-server-opened-hook
  8451. @cindex @sc{mode reader}
  8452. @cindex authinfo
  8453. @cindex authentification
  8454. @cindex nntp authentification
  8455. @findex nntp-send-authinfo
  8456. @findex nntp-send-mode-reader
  8457. is run after a connection has been made. It can be used to send
  8458. commands to the @sc{nntp} server after it has been contacted. By
  8459. default it sends the command @code{MODE READER} to the server with the
  8460. @code{nntp-send-mode-reader} function. This function should always be
  8461. present in this hook.
  8462. @item nntp-authinfo-function
  8463. @vindex nntp-authinfo-function
  8464. @findex nntp-send-authinfo
  8465. @vindex nntp-authinfo-file
  8466. This function will be used to send @samp{AUTHINFO} to the @sc{nntp}
  8467. server. The default function is @code{nntp-send-authinfo}, which looks
  8468. through your @file{~/.authinfo} (or whatever you've set the
  8469. @code{nntp-authinfo-file} variable to) for applicable entries. If none
  8470. are found, it will prompt you for a login name and a password. The
  8471. format of the @file{~/.authinfo} file is (almost) the same as the
  8472. @code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}
  8473. manual page, but here are the salient facts:
  8474. @enumerate
  8475. @item
  8476. The file contains one or more line, each of which define one server.
  8477. @item
  8478. Each line may contain an arbitrary number of token/value pairs.
  8479. The valid tokens include @samp{machine}, @samp{login}, @samp{password},
  8480. @samp{default}. In addition Gnus introduces two new tokens, not present
  8481. in the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and
  8482. @samp{force}. (This is the only way the @file{.authinfo} file format
  8483. deviates from the @file{.netrc} file format.) @samp{port} is used to
  8484. indicate what port on the server the credentials apply to and
  8485. @samp{force} is explained below.
  8486. @end enumerate
  8487. Here's an example file:
  8488. @example
  8489. machine news.uio.no login larsi password geheimnis
  8490. machine nntp.ifi.uio.no login larsi force yes
  8491. @end example
  8492. The token/value pairs may appear in any order; @samp{machine} doesn't
  8493. have to be first, for instance.
  8494. In this example, both login name and password have been supplied for the
  8495. former server, while the latter has only the login name listed, and the
  8496. user will be prompted for the password. The latter also has the
  8497. @samp{force} tag, which means that the authinfo will be sent to the
  8498. @var{nntp} server upon connection; the default (i.e., when there is not
  8499. @samp{force} tag) is to not send authinfo to the @var{nntp} server
  8500. until the @var{nntp} server asks for it.
  8501. You can also add @samp{default} lines that will apply to all servers
  8502. that don't have matching @samp{machine} lines.
  8503. @example
  8504. default force yes
  8505. @end example
  8506. This will force sending @samp{AUTHINFO} commands to all servers not
  8507. previously mentioned.
  8508. Remember to not leave the @file{~/.authinfo} file world-readable.
  8509. @item nntp-server-action-alist
  8510. @vindex nntp-server-action-alist
  8511. This is a list of regexps to match on server types and actions to be
  8512. taken when matches are made. For instance, if you want Gnus to beep
  8513. every time you connect to innd, you could say something like:
  8514. @lisp
  8515. (setq nntp-server-action-alist
  8516. '(("innd" (ding))))
  8517. @end lisp
  8518. You probably don't want to do that, though.
  8519. The default value is
  8520. @lisp
  8521. '(("nntpd 1\\.5\\.11t"
  8522. (remove-hook 'nntp-server-opened-hook
  8523. 'nntp-send-mode-reader)))
  8524. @end lisp
  8525. This ensures that Gnus doesn't send the @code{MODE READER} command to
  8526. nntpd 1.5.11t, since that command chokes that server, I've been told.
  8527. @item nntp-maximum-request
  8528. @vindex nntp-maximum-request
  8529. If the @sc{nntp} server doesn't support @sc{nov} headers, this back end
  8530. will collect headers by sending a series of @code{head} commands. To
  8531. speed things up, the back end sends lots of these commands without
  8532. waiting for reply, and then reads all the replies. This is controlled
  8533. by the @code{nntp-maximum-request} variable, and is 400 by default. If
  8534. your network is buggy, you should set this to 1.
  8535. @item nntp-connection-timeout
  8536. @vindex nntp-connection-timeout
  8537. If you have lots of foreign @code{nntp} groups that you connect to
  8538. regularly, you're sure to have problems with @sc{nntp} servers not
  8539. responding properly, or being too loaded to reply within reasonable
  8540. time. This is can lead to awkward problems, which can be helped
  8541. somewhat by setting @code{nntp-connection-timeout}. This is an integer
  8542. that says how many seconds the @code{nntp} back end should wait for a
  8543. connection before giving up. If it is @code{nil}, which is the default,
  8544. no timeouts are done.
  8545. @c @item nntp-command-timeout
  8546. @c @vindex nntp-command-timeout
  8547. @c @cindex PPP connections
  8548. @c @cindex dynamic IP addresses
  8549. @c If you're running Gnus on a machine that has a dynamically assigned
  8550. @c address, Gnus may become confused. If the address of your machine
  8551. @c changes after connecting to the @sc{nntp} server, Gnus will simply sit
  8552. @c waiting forever for replies from the server. To help with this
  8553. @c unfortunate problem, you can set this command to a number. Gnus will
  8554. @c then, if it sits waiting for a reply from the server longer than that
  8555. @c number of seconds, shut down the connection, start a new one, and resend
  8556. @c the command. This should hopefully be transparent to the user. A
  8557. @c likely number is 30 seconds.
  8558. @c
  8559. @c @item nntp-retry-on-break
  8560. @c @vindex nntp-retry-on-break
  8561. @c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus
  8562. @c hangs. This will have much the same effect as the command timeout
  8563. @c described above.
  8564. @item nntp-server-hook
  8565. @vindex nntp-server-hook
  8566. This hook is run as the last step when connecting to an @sc{nntp}
  8567. server.
  8568. @findex nntp-open-rlogin
  8569. @findex nntp-open-telnet
  8570. @findex nntp-open-network-stream
  8571. @item nntp-open-connection-function
  8572. @vindex nntp-open-connection-function
  8573. This function is used to connect to the remote system. Four pre-made
  8574. functions are supplied:
  8575. @table @code
  8576. @item nntp-open-network-stream
  8577. This is the default, and simply connects to some port or other on the
  8578. remote system.
  8579. @item nntp-open-rlogin
  8580. Does an @samp{rlogin} on the
  8581. remote system, and then does a @samp{telnet} to the @sc{nntp} server
  8582. available there.
  8583. @code{nntp-open-rlogin}-related variables:
  8584. @table @code
  8585. @item nntp-rlogin-program
  8586. @vindex nntp-rlogin-program
  8587. Program used to log in on remote machines. The default is @samp{rsh},
  8588. but @samp{ssh} is a popular alternative.
  8589. @item nntp-rlogin-parameters
  8590. @vindex nntp-rlogin-parameters
  8591. This list will be used as the parameter list given to @code{rsh}.
  8592. @item nntp-rlogin-user-name
  8593. @vindex nntp-rlogin-user-name
  8594. User name on the remote system.
  8595. @end table
  8596. @item nntp-open-telnet
  8597. Does a @samp{telnet} to the remote system and then another @samp{telnet}
  8598. to get to the @sc{nntp} server.
  8599. @code{nntp-open-telnet}-related variables:
  8600. @table @code
  8601. @item nntp-telnet-command
  8602. @vindex nntp-telnet-command
  8603. Command used to start @code{telnet}.
  8604. @item nntp-telnet-switches
  8605. @vindex nntp-telnet-switches
  8606. List of strings to be used as the switches to the @code{telnet} command.
  8607. @item nntp-telnet-user-name
  8608. @vindex nntp-telnet-user-name
  8609. User name for log in on the remote system.
  8610. @item nntp-telnet-passwd
  8611. @vindex nntp-telnet-passwd
  8612. Password to use when logging in.
  8613. @item nntp-telnet-parameters
  8614. @vindex nntp-telnet-parameters
  8615. A list of strings executed as a command after logging in
  8616. via @code{telnet}.
  8617. @item nntp-telnet-shell-prompt
  8618. @vindex nntp-telnet-shell-prompt
  8619. Regexp matching the shell prompt on the remote machine. The default is
  8620. @samp{bash\\|\$ *\r?$\\|> *\r?}.
  8621. @item nntp-open-telnet-envuser
  8622. @vindex nntp-open-telnet-envuser
  8623. If non-@code{nil}, the @code{telnet} session (client and server both)
  8624. will support the @code{ENVIRON} option and not prompt for login name.
  8625. This works for Solaris @code{telnet}, for instance.
  8626. @end table
  8627. @findex nntp-open-ssl-stream
  8628. @item nntp-open-ssl-stream
  8629. Opens a connection to a server over a @dfn{secure} channel. To use this
  8630. you must have SSLay installed
  8631. (@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL}, and you also need
  8632. @file{ssl.el} (from the W3 distribution, for instance). You then
  8633. define a server as follows:
  8634. @lisp
  8635. ;; Type `C-c C-c' after you've finished editing.
  8636. ;;
  8637. ;; "snews" is port 563 and is predefined
  8638. ;; in our /etc/services
  8639. ;;
  8640. (nntp "snews.bar.com"
  8641. (nntp-open-connection-function
  8642. nntp-open-ssl-stream)
  8643. (nntp-port-number "snews")
  8644. (nntp-address "snews.bar.com"))
  8645. @end lisp
  8646. @end table
  8647. @item nntp-end-of-line
  8648. @vindex nntp-end-of-line
  8649. String to use as end-of-line marker when talking to the @sc{nntp}
  8650. server. This is @samp{\r\n} by default, but should be @samp{\n} when
  8651. using @code{rlogin} to talk to the server.
  8652. @item nntp-rlogin-user-name
  8653. @vindex nntp-rlogin-user-name
  8654. User name on the remote system when using the @code{rlogin} connect
  8655. function.
  8656. @item nntp-address
  8657. @vindex nntp-address
  8658. The address of the remote system running the @sc{nntp} server.
  8659. @item nntp-port-number
  8660. @vindex nntp-port-number
  8661. Port number to connect to when using the @code{nntp-open-network-stream}
  8662. connect function.
  8663. @item nntp-buggy-select
  8664. @vindex nntp-buggy-select
  8665. Set this to non-@code{nil} if your select routine is buggy.
  8666. @item nntp-nov-is-evil
  8667. @vindex nntp-nov-is-evil
  8668. If the @sc{nntp} server does not support @sc{nov}, you could set this
  8669. variable to @code{t}, but @code{nntp} usually checks automatically whether @sc{nov}
  8670. can be used.
  8671. @item nntp-xover-commands
  8672. @vindex nntp-xover-commands
  8673. @cindex nov
  8674. @cindex XOVER
  8675. List of strings used as commands to fetch @sc{nov} lines from a
  8676. server. The default value of this variable is @code{("XOVER"
  8677. "XOVERVIEW")}.
  8678. @item nntp-nov-gap
  8679. @vindex nntp-nov-gap
  8680. @code{nntp} normally sends just one big request for @sc{nov} lines to
  8681. the server. The server responds with one huge list of lines. However,
  8682. if you have read articles 2-5000 in the group, and only want to read
  8683. article 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov}
  8684. lines that you will not need. This variable says how
  8685. big a gap between two consecutive articles is allowed to be before the
  8686. @code{XOVER} request is split into several request. Note that if your
  8687. network is fast, setting this variable to a really small number means
  8688. that fetching will probably be slower. If this variable is @code{nil},
  8689. @code{nntp} will never split requests. The default is 5.
  8690. @item nntp-prepare-server-hook
  8691. @vindex nntp-prepare-server-hook
  8692. A hook run before attempting to connect to an @sc{nntp} server.
  8693. @item nntp-warn-about-losing-connection
  8694. @vindex nntp-warn-about-losing-connection
  8695. If this variable is non-@code{nil}, some noise will be made when a
  8696. server closes connection.
  8697. @item nntp-record-commands
  8698. @vindex nntp-record-commands
  8699. If non-@code{nil}, @code{nntp} will log all commands it sends to the
  8700. @sc{nntp} server (along with a timestamp) in the @samp{*nntp-log*}
  8701. buffer. This is useful if you are debugging a Gnus/@sc{nntp} connection
  8702. that doesn't seem to work.
  8703. @end table
  8704. @node News Spool
  8705. @subsection News Spool
  8706. @cindex nnspool
  8707. @cindex news spool
  8708. Subscribing to a foreign group from the local spool is extremely easy,
  8709. and might be useful, for instance, to speed up reading groups that
  8710. contain very big articles---@samp{alt.binaries.pictures.furniture}, for
  8711. instance.
  8712. Anyway, you just specify @code{nnspool} as the method and @code{""} (or
  8713. anything else) as the address.
  8714. If you have access to a local spool, you should probably use that as the
  8715. native select method (@pxref{Finding the News}). It is normally faster
  8716. than using an @code{nntp} select method, but might not be. It depends.
  8717. You just have to try to find out what's best at your site.
  8718. @table @code
  8719. @item nnspool-inews-program
  8720. @vindex nnspool-inews-program
  8721. Program used to post an article.
  8722. @item nnspool-inews-switches
  8723. @vindex nnspool-inews-switches
  8724. Parameters given to the inews program when posting an article.
  8725. @item nnspool-spool-directory
  8726. @vindex nnspool-spool-directory
  8727. Where @code{nnspool} looks for the articles. This is normally
  8728. @file{/usr/spool/news/}.
  8729. @item nnspool-nov-directory
  8730. @vindex nnspool-nov-directory
  8731. Where @code{nnspool} will look for @sc{nov} files. This is normally
  8732. @file{/usr/spool/news/over.view/}.
  8733. @item nnspool-lib-dir
  8734. @vindex nnspool-lib-dir
  8735. Where the news lib dir is (@file{/usr/lib/news/} by default).
  8736. @item nnspool-active-file
  8737. @vindex nnspool-active-file
  8738. The path to the active file.
  8739. @item nnspool-newsgroups-file
  8740. @vindex nnspool-newsgroups-file
  8741. The path to the group descriptions file.
  8742. @item nnspool-history-file
  8743. @vindex nnspool-history-file
  8744. The path to the news history file.
  8745. @item nnspool-active-times-file
  8746. @vindex nnspool-active-times-file
  8747. The path to the active date file.
  8748. @item nnspool-nov-is-evil
  8749. @vindex nnspool-nov-is-evil
  8750. If non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} files
  8751. that it finds.
  8752. @item nnspool-sift-nov-with-sed
  8753. @vindex nnspool-sift-nov-with-sed
  8754. @cindex sed
  8755. If non-@code{nil}, which is the default, use @code{sed} to get the
  8756. relevant portion from the overview file. If nil, @code{nnspool} will
  8757. load the entire file into a buffer and process it there.
  8758. @end table
  8759. @node Getting Mail
  8760. @section Getting Mail
  8761. @cindex reading mail
  8762. @cindex mail
  8763. Reading mail with a newsreader---isn't that just plain WeIrD? But of
  8764. course.
  8765. @menu
  8766. * Mail in a Newsreader:: Important introductory notes.
  8767. * Getting Started Reading Mail:: A simple cookbook example.
  8768. * Splitting Mail:: How to create mail groups.
  8769. * Mail Sources:: How to tell Gnus where to get mail from.
  8770. * Mail Back End Variables:: Variables for customizing mail handling.
  8771. * Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
  8772. * Group Mail Splitting:: Use group customize to drive mail splitting.
  8773. * Incorporating Old Mail:: What about the old mail you have?
  8774. * Expiring Mail:: Getting rid of unwanted mail.
  8775. * Washing Mail:: Removing gruft from the mail you get.
  8776. * Duplicates:: Dealing with duplicated mail.
  8777. * Not Reading Mail:: Using mail back ends for reading other files.
  8778. * Choosing a Mail Back End:: Gnus can read a variety of mail formats.
  8779. @end menu
  8780. @node Mail in a Newsreader
  8781. @subsection Mail in a Newsreader
  8782. If you are used to traditional mail readers, but have decided to switch
  8783. to reading mail with Gnus, you may find yourself experiencing something
  8784. of a culture shock.
  8785. Gnus does not behave like traditional mail readers. If you want to make
  8786. it behave that way, you can, but it's an uphill battle.
  8787. Gnus, by default, handles all its groups using the same approach. This
  8788. approach is very newsreaderly---you enter a group, see the new/unread
  8789. messages, and when you read the messages, they get marked as read, and
  8790. you don't see them any more. (Unless you explicitly ask for them.)
  8791. In particular, you do not do anything explicitly to delete messages.
  8792. Does this mean that all the messages that have been marked as read are
  8793. deleted? How awful!
  8794. But, no, it means that old messages are @dfn{expired} according to some
  8795. scheme or other. For news messages, the expire process is controlled by
  8796. the news administrator; for mail, the expire process is controlled by
  8797. you. The expire process for mail is covered in depth in @pxref{Expiring
  8798. Mail}.
  8799. What many Gnus users find, after using it a while for both news and
  8800. mail, is that the transport mechanism has very little to do with how
  8801. they want to treat a message.
  8802. Many people subscribe to several mailing lists. These are transported
  8803. via SMTP, and are therefore mail. But we might go for weeks without
  8804. answering, or even reading these messages very carefully. We may not
  8805. need to save them because if we should need to read one again, they are
  8806. archived somewhere else.
  8807. Some people have local news groups which have only a handful of readers.
  8808. These are transported via @sc{nntp}, and are therefore news. But we may need
  8809. to read and answer a large fraction of the messages very carefully in
  8810. order to do our work. And there may not be an archive, so we may need
  8811. to save the interesting messages the same way we would personal mail.
  8812. The important distinction turns out to be not the transport mechanism,
  8813. but other factors such as how interested we are in the subject matter,
  8814. or how easy it is to retrieve the message if we need to read it again.
  8815. Gnus provides many options for sorting mail into ``groups'' which behave
  8816. like newsgroups, and for treating each group (whether mail or news)
  8817. differently.
  8818. Some users never get comfortable using the Gnus (ahem) paradigm and wish
  8819. that Gnus should grow up and be a male, er, mail reader. It is possible
  8820. to whip Gnus into a more mailreaderly being, but, as said before, it's
  8821. not easy. People who prefer proper mail readers should try @sc{vm}
  8822. instead, which is an excellent, and proper, mail reader.
  8823. I don't mean to scare anybody off, but I want to make it clear that you
  8824. may be required to learn a new way of thinking about messages. After
  8825. you've been subjected to The Gnus Way, you will come to love it. I can
  8826. guarantee it. (At least the guy who sold me the Emacs Subliminal
  8827. Brain-Washing Functions that I've put into Gnus did guarantee it. You
  8828. Will Be Assimilated. You Love Gnus. You Love The Gnus Mail Way.
  8829. You Do.)
  8830. @node Getting Started Reading Mail
  8831. @subsection Getting Started Reading Mail
  8832. It's quite easy to use Gnus to read your new mail. You just plonk the
  8833. mail back end of your choice into @code{gnus-secondary-select-methods},
  8834. and things will happen automatically.
  8835. For instance, if you want to use @code{nnml} (which is a "one file per
  8836. mail" back end), you could put the following in your @file{.gnus} file:
  8837. @lisp
  8838. (setq gnus-secondary-select-methods
  8839. '((nnml "private")))
  8840. @end lisp
  8841. Now, the next time you start Gnus, this back end will be queried for new
  8842. articles, and it will move all the messages in your spool file to its
  8843. directory, which is @code{~/Mail/} by default. The new group that will
  8844. be created (@samp{mail.misc}) will be subscribed, and you can read it
  8845. like any other group.
  8846. You will probably want to split the mail into several groups, though:
  8847. @lisp
  8848. (setq nnmail-split-methods
  8849. '(("junk" "^From:.*Lars Ingebrigtsen")
  8850. ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
  8851. ("other" "")))
  8852. @end lisp
  8853. This will result in three new @code{nnml} mail groups being created:
  8854. @samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}. All the
  8855. mail that doesn't fit into the first two groups will be placed in the
  8856. last group.
  8857. This should be sufficient for reading mail with Gnus. You might want to
  8858. give the other sections in this part of the manual a perusal, though.
  8859. Especially @pxref{Choosing a Mail Back End} and @pxref{Expiring Mail}.
  8860. @node Splitting Mail
  8861. @subsection Splitting Mail
  8862. @cindex splitting mail
  8863. @cindex mail splitting
  8864. @vindex nnmail-split-methods
  8865. The @code{nnmail-split-methods} variable says how the incoming mail is
  8866. to be split into groups.
  8867. @lisp
  8868. (setq nnmail-split-methods
  8869. '(("mail.junk" "^From:.*Lars Ingebrigtsen")
  8870. ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
  8871. ("mail.other" "")))
  8872. @end lisp
  8873. This variable is a list of lists, where the first element of each of
  8874. these lists is the name of the mail group (they do not have to be called
  8875. something beginning with @samp{mail}, by the way), and the second
  8876. element is a regular expression used on the header of each mail to
  8877. determine if it belongs in this mail group. The first string may
  8878. contain @samp{\\1} forms, like the ones used by @code{replace-match} to
  8879. insert sub-expressions from the matched text. For instance:
  8880. @lisp
  8881. ("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
  8882. @end lisp
  8883. The second element can also be a function. In that case, it will be
  8884. called narrowed to the headers with the first element of the rule as the
  8885. argument. It should return a non-@code{nil} value if it thinks that the
  8886. mail belongs in that group.
  8887. The last of these groups should always be a general one, and the regular
  8888. expression should @emph{always} be @samp{} so that it matches any mails
  8889. that haven't been matched by any of the other regexps. (These rules are
  8890. processed from the beginning of the alist toward the end. The first
  8891. rule to make a match will "win", unless you have crossposting enabled.
  8892. In that case, all matching rules will "win".)
  8893. If you like to tinker with this yourself, you can set this variable to a
  8894. function of your choice. This function will be called without any
  8895. arguments in a buffer narrowed to the headers of an incoming mail
  8896. message. The function should return a list of group names that it
  8897. thinks should carry this mail message.
  8898. Note that the mail back ends are free to maul the poor, innocent,
  8899. incoming headers all they want to. They all add @code{Lines} headers;
  8900. some add @code{X-Gnus-Group} headers; most rename the Unix mbox
  8901. @samp{From } line to something else.
  8902. @vindex nnmail-crosspost
  8903. The mail back ends all support cross-posting. If several regexps match,
  8904. the mail will be ``cross-posted'' to all those groups.
  8905. @code{nnmail-crosspost} says whether to use this mechanism or not. Note
  8906. that no articles are crossposted to the general (@samp{}) group.
  8907. @vindex nnmail-crosspost-link-function
  8908. @cindex crosspost
  8909. @cindex links
  8910. @code{nnmh} and @code{nnml} makes crossposts by creating hard links to
  8911. the crossposted articles. However, not all file systems support hard
  8912. links. If that's the case for you, set
  8913. @code{nnmail-crosspost-link-function} to @code{copy-file}. (This
  8914. variable is @code{add-name-to-file} by default.)
  8915. @kindex M-x nnmail-split-history
  8916. @kindex nnmail-split-history
  8917. If you wish to see where the previous mail split put the messages, you
  8918. can use the @kbd{M-x nnmail-split-history} command. If you wish to see
  8919. where re-spooling messages would put the messages, you can use
  8920. @code{gnus-summary-respool-trace} and related commands (@pxref{Mail
  8921. Group Commands}).
  8922. Gnus gives you all the opportunity you could possibly want for shooting
  8923. yourself in the foot. Let's say you create a group that will contain
  8924. all the mail you get from your boss. And then you accidentally
  8925. unsubscribe from the group. Gnus will still put all the mail from your
  8926. boss in the unsubscribed group, and so, when your boss mails you ``Have
  8927. that report ready by Monday or you're fired!'', you'll never see it and,
  8928. come Tuesday, you'll still believe that you're gainfully employed while
  8929. you really should be out collecting empty bottles to save up for next
  8930. month's rent money.
  8931. @node Mail Sources
  8932. @subsection Mail Sources
  8933. Mail can be gotten from many different sources---the mail spool, from a
  8934. POP mail server, from a procmail directory, or from a maildir, for
  8935. instance.
  8936. @menu
  8937. * Mail Source Specifiers:: How to specify what a mail source is.
  8938. * Mail Source Customization:: Some variables that influence things.
  8939. * Fetching Mail:: Using the mail source specifiers.
  8940. @end menu
  8941. @node Mail Source Specifiers
  8942. @subsubsection Mail Source Specifiers
  8943. @cindex POP
  8944. @cindex mail server
  8945. @cindex procmail
  8946. @cindex mail spool
  8947. @cindex mail source
  8948. You tell Gnus how to fetch mail by setting @code{mail-sources}
  8949. (@pxref{Fetching Mail}) to a @dfn{mail source specifier}.
  8950. Here's an example:
  8951. @lisp
  8952. (pop :server "pop3.mailserver.com" :user "myname")
  8953. @end lisp
  8954. As can be observed, a mail source specifier is a list where the first
  8955. element is a @dfn{mail source type}, followed by an arbitrary number of
  8956. @dfn{keywords}. Keywords that are not explicitly specified are given
  8957. default values.
  8958. The following mail source types are available:
  8959. @table @code
  8960. @item file
  8961. Get mail from a single file; typically from the mail spool.
  8962. Keywords:
  8963. @table @code
  8964. @item :path
  8965. The path of the file. Defaults to the value of the @code{MAIL}
  8966. environment variable or @file{/usr/mail/spool/user-name}.
  8967. @end table
  8968. An example file mail source:
  8969. @lisp
  8970. (file :path "/usr/spool/mail/user-name")
  8971. @end lisp
  8972. Or using the default path:
  8973. @lisp
  8974. (file)
  8975. @end lisp
  8976. If the mail spool file is not located on the local machine, it's best to
  8977. use POP or @sc{imap} or the like to fetch the mail. You can not use ange-ftp
  8978. file names here---it has no way to lock the mail spool while moving the
  8979. mail.
  8980. If it's impossible to set up a proper server, you can use ssh instead.
  8981. @lisp
  8982. (setq mail-sources
  8983. '((file :prescript "ssh host bin/getmail >%t")))
  8984. @end lisp
  8985. The @samp{getmail} script would look something like the following:
  8986. @example
  8987. #!/bin/sh
  8988. # getmail - move mail from spool to stdout
  8989. # flu@@iki.fi
  8990. MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail
  8991. TMP=$HOME/Mail/tmp
  8992. rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP
  8993. @end example
  8994. Alter this script to fit find the @samp{movemail} you want to use.
  8995. @item directory
  8996. Get mail from several files in a directory. This is typically used when
  8997. you have procmail split the incoming mail into several files. Setting
  8998. @code{nnmail-scan-directory-mail-source-once} to non-nil force Gnus to
  8999. scan the mail source only once.
  9000. Keywords:
  9001. @table @code
  9002. @item :path
  9003. The path of the directory where the files are. There is no default
  9004. value.
  9005. @item :suffix
  9006. Only files ending with this suffix are used. The default is
  9007. @samp{.spool}.
  9008. @item :predicate
  9009. Only files that have this predicate return non-@code{nil} are returned.
  9010. The default is @code{identity}. This is used as an additional
  9011. filter---only files that have the right suffix @emph{and} satisfy this
  9012. predicate are considered.
  9013. @item :prescript
  9014. @itemx :postscript
  9015. Script run before/after fetching mail.
  9016. @end table
  9017. An example directory mail source:
  9018. @lisp
  9019. (directory :path "/home/user-name/procmail-dir/"
  9020. :suffix ".prcml")
  9021. @end lisp
  9022. @item pop
  9023. Get mail from a POP server.
  9024. Keywords:
  9025. @table @code
  9026. @item :server
  9027. The name of the POP server. The default is taken from the
  9028. @code{MAILHOST} environment variable.
  9029. @item :port
  9030. The port number of the POP server. This can be a number (e.g.@:
  9031. @samp{:port 110}) or a string (e.g.@: @samp{:port "pop3"}). If it is a
  9032. string, it should be a service name as listed in @file{/etc/services} on
  9033. Unix systems. The default is @samp{"pop3"}. On some systems you might
  9034. need to specify it as @samp{"pop-3"} instead.
  9035. @item :user
  9036. The user name to give to the POP server. The default is the login
  9037. name.
  9038. @item :password
  9039. The password to give to the POP server. If not specified, the user is
  9040. prompted.
  9041. @item :program
  9042. The program to use to fetch mail from the POP server. This should be
  9043. a @code{format}-like string. Here's an example:
  9044. @example
  9045. fetchmail %u@@%s -P %p %t
  9046. @end example
  9047. The valid format specifier characters are:
  9048. @table @samp
  9049. @item t
  9050. The name of the file the mail is to be moved to. This must always be
  9051. included in this string.
  9052. @item s
  9053. The name of the server.
  9054. @item P
  9055. The port number of the server.
  9056. @item u
  9057. The user name to use.
  9058. @item p
  9059. The password to use.
  9060. @end table
  9061. The values used for these specs are taken from the values you give the
  9062. corresponding keywords.
  9063. @item :prescript
  9064. A script to be run before fetching the mail. The syntax is the same as
  9065. the @code{:program} keyword. This can also be a function to be run.
  9066. @item :postscript
  9067. A script to be run after fetching the mail. The syntax is the same as
  9068. the @code{:program} keyword. This can also be a function to be run.
  9069. @item :function
  9070. The function to use to fetch mail from the POP server. The function is
  9071. called with one parameter---the name of the file where the mail should
  9072. be moved to.
  9073. @item :authentication
  9074. This can be either the symbol @code{password} or the symbol @code{apop}
  9075. and says what authentication scheme to use. The default is
  9076. @code{password}.
  9077. @end table
  9078. If the @code{:program} and @code{:function} keywords aren't specified,
  9079. @code{pop3-movemail} will be used.
  9080. Here are some examples. Fetch from the default POP server, using the
  9081. default user name, and default fetcher:
  9082. @lisp
  9083. (pop)
  9084. @end lisp
  9085. Fetch from a named server with a named user and password:
  9086. @lisp
  9087. (pop :server "my.pop.server"
  9088. :user "user-name" :password "secret")
  9089. @end lisp
  9090. Use @samp{movemail} to move the mail:
  9091. @lisp
  9092. (pop :program "movemail po:%u %t %p")
  9093. @end lisp
  9094. @item maildir
  9095. Get mail from a maildir. This is a type of mailbox that is supported by
  9096. at least qmail and postfix, where each file in a special directory
  9097. contains exactly one mail.
  9098. Keywords:
  9099. @table @code
  9100. @item :path
  9101. The path of the directory where the mails are stored. The default is
  9102. taken from the @code{MAILDIR} environment variable or
  9103. @samp{~/Maildir/}.
  9104. @item :subdirs
  9105. The subdirectories of the Maildir. The default is
  9106. @samp{("new" "cur")}.
  9107. @c If you sometimes look at your mail through a pop3 daemon before fetching
  9108. @c them with Gnus, you may also have to fetch your mails from the
  9109. @c @code{cur} directory inside the maildir, like in the first example
  9110. @c below.
  9111. You can also get mails from remote hosts (because maildirs don't suffer
  9112. from locking problems).
  9113. @end table
  9114. Two example maildir mail sources:
  9115. @lisp
  9116. (maildir :path "/home/user-name/Maildir/"
  9117. :subdirs ("cur" "new"))
  9118. @end lisp
  9119. @lisp
  9120. (maildir :path "/user@@remotehost.org:~/Maildir/"
  9121. :subdirs ("new"))
  9122. @end lisp
  9123. @item imap
  9124. Get mail from a @sc{imap} server. If you don't want to use @sc{imap}
  9125. as intended, as a network mail reading protocol (ie with nnimap), for
  9126. some reason or other, Gnus let you treat it similar to a POP server
  9127. and fetches articles from a given @sc{imap} mailbox. @xref{IMAP}, for
  9128. more information.
  9129. Keywords:
  9130. @table @code
  9131. @item :server
  9132. The name of the @sc{imap} server. The default is taken from the
  9133. @code{MAILHOST} environment variable.
  9134. @item :port
  9135. The port number of the @sc{imap} server. The default is @samp{143}, or
  9136. @samp{993} for SSL connections.
  9137. @item :user
  9138. The user name to give to the @sc{imap} server. The default is the login
  9139. name.
  9140. @item :password
  9141. The password to give to the @sc{imap} server. If not specified, the user is
  9142. prompted.
  9143. @item :stream
  9144. What stream to use for connecting to the server, this is one of the
  9145. symbols in @code{imap-stream-alist}. Right now, this means
  9146. @samp{kerberos4}, @samp{ssl} or the default @samp{network}.
  9147. @item :authentication
  9148. Which authenticator to use for authenticating to the server, this is one
  9149. of the symbols in @code{imap-authenticator-alist}. Right now, this
  9150. means @samp{kerberos4}, @samp{cram-md5}, @samp{anonymous} or the default
  9151. @samp{login}.
  9152. @item :program
  9153. When using the `shell' :stream, the contents of this variable is
  9154. mapped into the `imap-shell-program' variable. This should be a
  9155. @code{format}-like string (or list of strings). Here's an example:
  9156. @example
  9157. ssh %s imapd
  9158. @end example
  9159. The valid format specifier characters are:
  9160. @table @samp
  9161. @item s
  9162. The name of the server.
  9163. @item l
  9164. User name from `imap-default-user'.
  9165. @item p
  9166. The port number of the server.
  9167. @end table
  9168. The values used for these specs are taken from the values you give the
  9169. corresponding keywords.
  9170. @item :mailbox
  9171. The name of the mailbox to get mail from. The default is @samp{INBOX}
  9172. which normally is the mailbox which receive incoming mail.
  9173. @item :predicate
  9174. The predicate used to find articles to fetch. The default, @samp{UNSEEN
  9175. UNDELETED}, is probably the best choice for most people, but if you
  9176. sometimes peek in your mailbox with a @sc{imap} client and mark some
  9177. articles as read (or; SEEN) you might want to set this to @samp{nil}.
  9178. Then all articles in the mailbox is fetched, no matter what. For a
  9179. complete list of predicates, see RFC 2060 §6.4.4.
  9180. @item :fetchflag
  9181. How to flag fetched articles on the server, the default @samp{\Deleted}
  9182. will mark them as deleted, an alternative would be @samp{\Seen} which
  9183. would simply mark them as read. These are the two most likely choices,
  9184. but more flags are defined in RFC 2060 §2.3.2.
  9185. @item :dontexpunge
  9186. If non-nil, don't remove all articles marked as deleted in the mailbox
  9187. after finishing the fetch.
  9188. @end table
  9189. An example @sc{imap} mail source:
  9190. @lisp
  9191. (imap :server "mail.mycorp.com"
  9192. :stream kerberos4
  9193. :fetchflag "\\Seen")
  9194. @end lisp
  9195. @item webmail
  9196. Get mail from a webmail server, such as www.hotmail.com,
  9197. webmail.netscape.com, www.netaddress.com, www.my-deja.com.
  9198. NOTE: Now mail.yahoo.com provides POP3 service, so @sc{pop} mail source
  9199. is suggested.
  9200. NOTE: Webmail largely depends cookies. A "one-line-cookie" patch is
  9201. required for url "4.0pre.46".
  9202. WARNING: Mails may lost. NO WARRANTY.
  9203. Keywords:
  9204. @table @code
  9205. @item :subtype
  9206. The type of the webmail server. The default is @code{hotmail}. The
  9207. alternatives are @code{netscape}, @code{netaddress}, @code{my-deja}.
  9208. @item :user
  9209. The user name to give to the webmail server. The default is the login
  9210. name.
  9211. @item :password
  9212. The password to give to the webmail server. If not specified, the user is
  9213. prompted.
  9214. @item :dontexpunge
  9215. If non-nil, only fetch unread articles and don't move them to trash
  9216. folder after finishing the fetch.
  9217. @end table
  9218. An example webmail source:
  9219. @lisp
  9220. (webmail :subtype 'hotmail
  9221. :user "user-name"
  9222. :password "secret")
  9223. @end lisp
  9224. @end table
  9225. @table @dfn
  9226. @item Common Keywords
  9227. Common keywords can be used in any type of mail source.
  9228. Keywords:
  9229. @table @code
  9230. @item :plugged
  9231. If non-nil, fetch the mail even when Gnus is unplugged. If you use
  9232. directory source to get mail, you can specify it as in this example:
  9233. @lisp
  9234. (setq mail-sources
  9235. '((directory :path "/home/pavel/.Spool/"
  9236. :suffix ""
  9237. :plugged t)))
  9238. @end lisp
  9239. Gnus will then fetch your mail even when you are unplugged. This is
  9240. useful when you use local mail and news.
  9241. @end table
  9242. @end table
  9243. @subsubsection Function Interface
  9244. Some of the above keywords specify a Lisp function to be executed.
  9245. For each keyword @code{:foo}, the Lisp variable @code{foo} is bound to
  9246. the value of the keyword while the function is executing. For example,
  9247. consider the following mail-source setting:
  9248. @lisp
  9249. (setq mail-sources '((pop :user "jrl"
  9250. :server "pophost" :function fetchfunc)))
  9251. @end lisp
  9252. While the function @code{fetchfunc} is executing, the symbol @code{user}
  9253. is bound to @code{"jrl"}, and the symbol @code{server} is bound to
  9254. @code{"pophost"}. The symbols @code{port}, @code{password},
  9255. @code{program}, @code{prescript}, @code{postscript}, @code{function},
  9256. and @code{authentication} are also bound (to their default values).
  9257. See above for a list of keywords for each type of mail source.
  9258. @node Mail Source Customization
  9259. @subsubsection Mail Source Customization
  9260. The following is a list of variables that influence how the mail is
  9261. fetched. You would normally not need to set or change any of these
  9262. variables.
  9263. @table @code
  9264. @item mail-source-crash-box
  9265. @vindex mail-source-crash-box
  9266. File where mail will be stored while processing it. The default is
  9267. @file{~/.emacs-mail-crash-box}.
  9268. @item mail-source-delete-incoming
  9269. @vindex mail-source-delete-incoming
  9270. If non-@code{nil}, delete incoming files after handling them.
  9271. @item mail-source-directory
  9272. @vindex mail-source-directory
  9273. Directory where files (if any) will be stored. The default is
  9274. @file{~/Mail/}. At present, the only thing this is used for is to say
  9275. where the incoming files will be stored if the previous variable is
  9276. @code{nil}.
  9277. @item mail-source-incoming-file-prefix
  9278. @vindex mail-source-incoming-file-prefix
  9279. Prefix for file name for storing incoming mail. The default is
  9280. @file{Incoming}, in which case files will end up with names like
  9281. @file{Incoming30630D_} or @file{Incoming298602ZD}. This is really only
  9282. relevant if @code{mail-source-delete-incoming} is @code{nil}.
  9283. @item mail-source-default-file-modes
  9284. @vindex mail-source-default-file-modes
  9285. All new mail files will get this file mode. The default is 384.
  9286. @end table
  9287. @node Fetching Mail
  9288. @subsubsection Fetching Mail
  9289. @vindex mail-sources
  9290. @vindex nnmail-spool-file
  9291. The way to actually tell Gnus where to get new mail from is to set
  9292. @code{mail-sources} to a list of mail source specifiers
  9293. (@pxref{Mail Source Specifiers}).
  9294. If this variable (and the obsolescent @code{nnmail-spool-file}) is
  9295. @code{nil}, the mail back ends will never attempt to fetch mail by
  9296. themselves.
  9297. If you want to fetch mail both from your local spool as well as a POP
  9298. mail server, you'd say something like:
  9299. @lisp
  9300. (setq mail-sources
  9301. '((file)
  9302. (pop :server "pop3.mail.server"
  9303. :password "secret")))
  9304. @end lisp
  9305. Or, if you don't want to use any of the keyword defaults:
  9306. @lisp
  9307. (setq mail-sources
  9308. '((file :path "/var/spool/mail/user-name")
  9309. (pop :server "pop3.mail.server"
  9310. :user "user-name"
  9311. :port "pop3"
  9312. :password "secret")))
  9313. @end lisp
  9314. When you use a mail back end, Gnus will slurp all your mail from your
  9315. inbox and plonk it down in your home directory. Gnus doesn't move any
  9316. mail if you're not using a mail back end---you have to do a lot of magic
  9317. invocations first. At the time when you have finished drawing the
  9318. pentagram, lightened the candles, and sacrificed the goat, you really
  9319. shouldn't be too surprised when Gnus moves your mail.
  9320. @node Mail Back End Variables
  9321. @subsection Mail Back End Variables
  9322. These variables are (for the most part) pertinent to all the various
  9323. mail back ends.
  9324. @table @code
  9325. @vindex nnmail-read-incoming-hook
  9326. @item nnmail-read-incoming-hook
  9327. The mail back ends all call this hook after reading new mail. You can
  9328. use this hook to notify any mail watch programs, if you want to.
  9329. @vindex nnmail-split-hook
  9330. @item nnmail-split-hook
  9331. @findex article-decode-encoded-words
  9332. @findex RFC 1522 decoding
  9333. @findex RFC 2047 decoding
  9334. Hook run in the buffer where the mail headers of each message is kept
  9335. just before the splitting based on these headers is done. The hook is
  9336. free to modify the buffer contents in any way it sees fit---the buffer
  9337. is discarded after the splitting has been done, and no changes performed
  9338. in the buffer will show up in any files.
  9339. @code{gnus-article-decode-encoded-words} is one likely function to add
  9340. to this hook.
  9341. @vindex nnmail-pre-get-new-mail-hook
  9342. @vindex nnmail-post-get-new-mail-hook
  9343. @item nnmail-pre-get-new-mail-hook
  9344. @itemx nnmail-post-get-new-mail-hook
  9345. These are two useful hooks executed when treating new incoming
  9346. mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
  9347. starting to handle the new mail) and
  9348. @code{nnmail-post-get-new-mail-hook} (is called when the mail handling
  9349. is done). Here's and example of using these two hooks to change the
  9350. default file modes the new mail files get:
  9351. @lisp
  9352. (add-hook 'gnus-pre-get-new-mail-hook
  9353. (lambda () (set-default-file-modes 511)))
  9354. (add-hook 'gnus-post-get-new-mail-hook
  9355. (lambda () (set-default-file-modes 551)))
  9356. @end lisp
  9357. @item nnmail-use-long-file-names
  9358. @vindex nnmail-use-long-file-names
  9359. If non-@code{nil}, the mail back ends will use long file and directory
  9360. names. Groups like @samp{mail.misc} will end up in directories
  9361. (assuming use of @code{nnml} back end) or files (assuming use of
  9362. @code{nnfolder} back end) like @file{mail.misc}. If it is @code{nil},
  9363. the same group will end up in @file{mail/misc}.
  9364. @item nnmail-delete-file-function
  9365. @vindex nnmail-delete-file-function
  9366. @findex delete-file
  9367. Function called to delete files. It is @code{delete-file} by default.
  9368. @item nnmail-cache-accepted-message-ids
  9369. @vindex nnmail-cache-accepted-message-ids
  9370. If non-@code{nil}, put the @code{Message-ID}s of articles imported into
  9371. the back end (via @code{Gcc}, for instance) into the mail duplication
  9372. discovery cache. The default is @code{nil}.
  9373. @end table
  9374. @node Fancy Mail Splitting
  9375. @subsection Fancy Mail Splitting
  9376. @cindex mail splitting
  9377. @cindex fancy mail splitting
  9378. @vindex nnmail-split-fancy
  9379. @findex nnmail-split-fancy
  9380. If the rather simple, standard method for specifying how to split mail
  9381. doesn't allow you to do what you want, you can set
  9382. @code{nnmail-split-methods} to @code{nnmail-split-fancy}. Then you can
  9383. play with the @code{nnmail-split-fancy} variable.
  9384. Let's look at an example value of this variable first:
  9385. @lisp
  9386. ;; Messages from the mailer daemon are not crossposted to any of
  9387. ;; the ordinary groups. Warnings are put in a separate group
  9388. ;; from real errors.
  9389. (| ("from" mail (| ("subject" "warn.*" "mail.warning")
  9390. "mail.misc"))
  9391. ;; Non-error messages are crossposted to all relevant
  9392. ;; groups, but we don't crosspost between the group for the
  9393. ;; (ding) list and the group for other (ding) related mail.
  9394. (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
  9395. ("subject" "ding" "ding.misc"))
  9396. ;; Other mailing lists...
  9397. (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
  9398. (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
  9399. ;; Both lists below have the same suffix, so prevent
  9400. ;; cross-posting to mkpkg.list of messages posted only to
  9401. ;; the bugs- list, but allow cross-posting when the
  9402. ;; message was really cross-posted.
  9403. (any "bugs-mypackage@@somewhere" "mypkg.bugs")
  9404. (any "mypackage@@somewhere\" - "bugs-mypackage" "mypkg.list")
  9405. ;; People...
  9406. (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen"))
  9407. ;; Unmatched mail goes to the catch all group.
  9408. "misc.misc")
  9409. @end lisp
  9410. This variable has the format of a @dfn{split}. A split is a (possibly)
  9411. recursive structure where each split may contain other splits. Here are
  9412. the five possible split syntaxes:
  9413. @enumerate
  9414. @item
  9415. @samp{group}: If the split is a string, that will be taken as a group
  9416. name. Normal regexp match expansion will be done. See below for
  9417. examples.
  9418. @item
  9419. @code{(@var{field} @var{value} @code{[-} @var{restrict}
  9420. @code{[@dots{}]}@code{]} @var{split})}: If the split is a list, the
  9421. first element of which is a string, then store the message as
  9422. specified by @var{split}, if header @var{field} (a regexp) contains
  9423. @var{value} (also a regexp). If @var{restrict} (yet another regexp)
  9424. matches some string after @var{field} and before the end of the
  9425. matched @var{value}, the @var{split} is ignored. If none of the
  9426. @var{restrict} clauses match, @var{split} is processed.
  9427. @item
  9428. @code{(| @var{split}@dots{})}: If the split is a list, and the first
  9429. element is @code{|} (vertical bar), then process each @var{split} until
  9430. one of them matches. A @var{split} is said to match if it will cause
  9431. the mail message to be stored in one or more groups.
  9432. @item
  9433. @code{(& @var{split}@dots{})}: If the split is a list, and the first
  9434. element is @code{&}, then process all @var{split}s in the list.
  9435. @item
  9436. @code{junk}: If the split is the symbol @code{junk}, then don't save
  9437. this message. Use with extreme caution.
  9438. @item
  9439. @code{(: @var{function} @var{arg1} @var{arg2} @dots{})}: If the split is
  9440. a list, and the first element is @code{:}, then the second element will
  9441. be called as a function with @var{args} given as arguments. The
  9442. function should return a @var{split}.
  9443. For instance, the following function could be used to split based on the
  9444. body of the messages:
  9445. @lisp
  9446. (defun split-on-body ()
  9447. (save-excursion
  9448. (set-buffer " *nnmail incoming*")
  9449. (goto-char (point-min))
  9450. (when (re-search-forward "Some.*string" nil t)
  9451. "string.group")))
  9452. @end lisp
  9453. @item
  9454. @code{(! @var{func} @var{split})}: If the split is a list, and the first
  9455. element is @code{!}, then SPLIT will be processed, and FUNC will be
  9456. called as a function with the result of SPLIT as argument. FUNC should
  9457. return a split.
  9458. @item
  9459. @code{nil}: If the split is @code{nil}, it is ignored.
  9460. @end enumerate
  9461. In these splits, @var{field} must match a complete field name.
  9462. @var{value} must match a complete word according to the fundamental mode
  9463. syntax table. You can use @code{.*} in the regexps to match partial
  9464. field names or words. In other words, all @var{value}'s are wrapped in
  9465. @samp{\<} and @samp{\>} pairs.
  9466. @vindex nnmail-split-abbrev-alist
  9467. @var{field} and @var{value} can also be lisp symbols, in that case they
  9468. are expanded as specified by the variable
  9469. @code{nnmail-split-abbrev-alist}. This is an alist of cons cells, where
  9470. the @code{car} of a cell contains the key, and the @code{cdr} contains the associated
  9471. value.
  9472. @vindex nnmail-split-fancy-syntax-table
  9473. @code{nnmail-split-fancy-syntax-table} is the syntax table in effect
  9474. when all this splitting is performed.
  9475. If you want to have Gnus create groups dynamically based on some
  9476. information in the headers (i.e., do @code{replace-match}-like
  9477. substitutions in the group names), you can say things like:
  9478. @example
  9479. (any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1")
  9480. @end example
  9481. In this example, messages sent to @samp{debian-foo@@lists.debian.org}
  9482. will be filed in @samp{mail.debian.foo}.
  9483. If the string contains the element @samp{\&}, then the previously
  9484. matched string will be substituted. Similarly, the elements @samp{\\1}
  9485. up to @samp{\\9} will be substituted with the text matched by the
  9486. groupings 1 through 9.
  9487. @findex nnmail-split-fancy-with-parent
  9488. @code{nnmail-split-fancy-with-parent} is a function which allows you to
  9489. split followups into the same groups their parents are in. Sometimes
  9490. you can't make splitting rules for all your mail. For example, your
  9491. boss might send you personal mail regarding different projects you are
  9492. working on, and as you can't tell your boss to put a distinguishing
  9493. string into the subject line, you have to resort to manually moving the
  9494. messages into the right group. With this function, you only have to do
  9495. it once per thread.
  9496. To use this feature, you have to set @code{nnmail-treat-duplicates} to a
  9497. non-nil value. And then you can include
  9498. @code{nnmail-split-fancy-with-parent} using the colon feature, like so:
  9499. @lisp
  9500. (setq nnmail-split-fancy
  9501. '(| (: nnmail-split-fancy-with-parent)
  9502. ;; other splits go here
  9503. ))
  9504. @end lisp
  9505. This feature works as follows: when @code{nnmail-treat-duplicates} is
  9506. non-nil, Gnus records the message id of every message it sees in the
  9507. file specified by the variable @code{nnmail-message-id-cache-file},
  9508. together with the group it is in (the group is omitted for non-mail
  9509. messages). When mail splitting is invoked, the function
  9510. @code{nnmail-split-fancy-with-parent} then looks at the References (and
  9511. In-Reply-To) header of each message to split and searches the file
  9512. specified by @code{nnmail-message-id-cache-file} for the message ids.
  9513. When it has found a parent, it returns the corresponding group name. It
  9514. is recommended that you set @code{nnmail-message-id-cache-length} to a
  9515. somewhat higher number than the default so that the message ids are
  9516. still in the cache. (A value of 5000 appears to create a file some 300
  9517. kBytes in size.)
  9518. @vindex nnmail-cache-accepted-message-ids
  9519. When @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnus
  9520. also records the message ids of moved articles, so that the followup
  9521. messages goes into the new group.
  9522. @node Group Mail Splitting
  9523. @subsection Group Mail Splitting
  9524. @cindex mail splitting
  9525. @cindex group mail splitting
  9526. @findex gnus-group-split
  9527. If you subscribe to dozens of mailing lists but you don't want to
  9528. maintain mail splitting rules manually, group mail splitting is for you.
  9529. You just have to set @var{to-list} and/or @var{to-address} in group
  9530. parameters or group customization and set @code{nnmail-split-methods} to
  9531. @code{gnus-group-split}. This splitting function will scan all groups
  9532. for those parameters and split mail accordingly, i.e., messages posted
  9533. from or to the addresses specified in the parameters @var{to-list} or
  9534. @var{to-address} of a mail group will be stored in that group.
  9535. Sometimes, mailing lists have multiple addresses, and you may want mail
  9536. splitting to recognize them all: just set the @var{extra-aliases} group
  9537. parameter to the list of additional addresses and it's done. If you'd
  9538. rather use a regular expression, set @var{split-regexp}.
  9539. All these parameters in a group will be used to create an
  9540. @code{nnmail-split-fancy} split, in which the @var{field} is @samp{any},
  9541. the @var{value} is a single regular expression that matches
  9542. @var{to-list}, @var{to-address}, all of @var{extra-aliases} and all
  9543. matches of @var{split-regexp}, and the @var{split} is the name of the
  9544. group. @var{restrict}s are also supported: just set the
  9545. @var{split-exclude} parameter to a list of regular expressions.
  9546. If you can't get the right split to be generated using all these
  9547. parameters, or you just need something fancier, you can set the
  9548. parameter @var{split-spec} to an @code{nnmail-split-fancy} split. In
  9549. this case, all other aforementioned parameters will be ignored by
  9550. @code{gnus-group-split}. In particular, @var{split-spec} may be set to
  9551. @code{nil}, in which case the group will be ignored by
  9552. @code{gnus-group-split}.
  9553. @vindex gnus-group-split-default-catch-all-group
  9554. @code{gnus-group-split} will do cross-posting on all groups that match,
  9555. by defining a single @code{&} fancy split containing one split for each
  9556. group. If a message doesn't match any split, it will be stored in the
  9557. group named in @code{gnus-group-split-default-catch-all-group}, unless
  9558. some group has @var{split-spec} set to @code{catch-all}, in which case
  9559. that group is used as the catch-all group. Even though this variable is
  9560. often used just to name a group, it may also be set to an arbitrarily
  9561. complex fancy split (after all, a group name is a fancy split), and this
  9562. may be useful to split mail that doesn't go to any mailing list to
  9563. personal mail folders. Note that this fancy split is added as the last
  9564. element of a @code{|} split list that also contains a @code{&} split
  9565. with the rules extracted from group parameters.
  9566. It's time for an example. Assume the following group parameters have
  9567. been defined:
  9568. @example
  9569. nnml:mail.bar:
  9570. ((to-address . "bar@@femail.com")
  9571. (split-regexp . ".*@@femail\\.com"))
  9572. nnml:mail.foo:
  9573. ((to-list . "foo@@nowhere.gov")
  9574. (extra-aliases "foo@@localhost" "foo-redist@@home")
  9575. (split-exclude "bugs-foo" "rambling-foo")
  9576. (admin-address . "foo-request@@nowhere.gov"))
  9577. nnml:mail.others:
  9578. ((split-spec . catch-all))
  9579. @end example
  9580. Setting @code{nnmail-split-methods} to @code{gnus-group-split} will
  9581. behave as if @code{nnmail-split-fancy} had been selected and variable
  9582. @code{nnmail-split-fancy} had been set as follows:
  9583. @lisp
  9584. (| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar")
  9585. (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)"
  9586. - "bugs-foo" - "rambling-foo" "mail.foo"))
  9587. "mail.others")
  9588. @end lisp
  9589. @findex gnus-group-split-fancy
  9590. If you'd rather not use group splitting for all your mail groups, you
  9591. may use it for only some of them, by using @code{nnmail-split-fancy}
  9592. splits like this:
  9593. @lisp
  9594. (: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL)
  9595. @end lisp
  9596. @var{groups} may be a regular expression or a list of group names whose
  9597. parameters will be scanned to generate the output split.
  9598. @var{no-crosspost} can be used to disable cross-posting; in this case, a
  9599. single @code{|} split will be output. @var{catch-all} is the fallback
  9600. fancy split, used like @var{gnus-group-split-default-catch-all-group}.
  9601. If @var{catch-all} is @code{nil}, or if @var{split-regexp} matches the
  9602. empty string in any selected group, no catch-all split will be issued.
  9603. Otherwise, if some group has @var{split-spec} set to @code{catch-all},
  9604. this group will override the value of the @var{catch-all} argument.
  9605. @findex gnus-group-split-setup
  9606. Unfortunately, scanning all groups and their parameters can be quite
  9607. slow, especially considering that it has to be done for every message.
  9608. But don't despair! The function @code{gnus-group-split-setup} can be
  9609. used to enable @code{gnus-group-split} in a much more efficient way. It
  9610. sets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets
  9611. @code{nnmail-split-fancy} to the split produced by
  9612. @code{gnus-group-split-fancy}. Thus, the group parameters are only
  9613. scanned once, no matter how many messages are split.
  9614. @findex gnus-group-split-update
  9615. However, if you change group parameters, you have to update
  9616. @code{nnmail-split-fancy} manually. You can do it by running
  9617. @code{gnus-group-split-update}. If you'd rather have it updated
  9618. automatically, just tell @code{gnus-group-split-setup} to do it for
  9619. you. For example, add to your @file{.gnus}:
  9620. @lisp
  9621. (gnus-group-split-setup AUTO-UPDATE CATCH-ALL)
  9622. @end lisp
  9623. If @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update}
  9624. will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't ever
  9625. have to worry about updating @code{nnmail-split-fancy} again. If you
  9626. don't omit @var{catch-all} (it's optional, equivalent to @code{nil}),
  9627. @code{gnus-group-split-default-catch-all-group} will be set to its
  9628. value.
  9629. @vindex gnus-group-split-updated-hook
  9630. Because you may want to change @code{nnmail-split-fancy} after it is set
  9631. by @code{gnus-group-split-update}, this function will run
  9632. @code{gnus-group-split-updated-hook} just before finishing.
  9633. @node Incorporating Old Mail
  9634. @subsection Incorporating Old Mail
  9635. Most people have lots of old mail stored in various file formats. If
  9636. you have set up Gnus to read mail using one of the spiffy Gnus mail
  9637. back ends, you'll probably wish to have that old mail incorporated into
  9638. your mail groups.
  9639. Doing so can be quite easy.
  9640. To take an example: You're reading mail using @code{nnml}
  9641. (@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
  9642. satisfactory value (@pxref{Splitting Mail}). You have an old Unix mbox
  9643. file filled with important, but old, mail. You want to move it into
  9644. your @code{nnml} groups.
  9645. Here's how:
  9646. @enumerate
  9647. @item
  9648. Go to the group buffer.
  9649. @item
  9650. Type @kbd{G f} and give the path to the mbox file when prompted to create an
  9651. @code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
  9652. @item
  9653. Type @key{SPC} to enter the newly created group.
  9654. @item
  9655. Type @kbd{M P b} to process-mark all articles in this group's buffer
  9656. (@pxref{Setting Process Marks}).
  9657. @item
  9658. Type @kbd{B r} to respool all the process-marked articles, and answer
  9659. @samp{nnml} when prompted (@pxref{Mail Group Commands}).
  9660. @end enumerate
  9661. All the mail messages in the mbox file will now also be spread out over
  9662. all your @code{nnml} groups. Try entering them and check whether things
  9663. have gone without a glitch. If things look ok, you may consider
  9664. deleting the mbox file, but I wouldn't do that unless I was absolutely
  9665. sure that all the mail has ended up where it should be.
  9666. Respooling is also a handy thing to do if you're switching from one mail
  9667. back end to another. Just respool all the mail in the old mail groups
  9668. using the new mail back end.
  9669. @node Expiring Mail
  9670. @subsection Expiring Mail
  9671. @cindex article expiry
  9672. Traditional mail readers have a tendency to remove mail articles when
  9673. you mark them as read, in some way. Gnus takes a fundamentally
  9674. different approach to mail reading.
  9675. Gnus basically considers mail just to be news that has been received in
  9676. a rather peculiar manner. It does not think that it has the power to
  9677. actually change the mail, or delete any mail messages. If you enter a
  9678. mail group, and mark articles as ``read'', or kill them in some other
  9679. fashion, the mail articles will still exist on the system. I repeat:
  9680. Gnus will not delete your old, read mail. Unless you ask it to, of
  9681. course.
  9682. To make Gnus get rid of your unwanted mail, you have to mark the
  9683. articles as @dfn{expirable}. This does not mean that the articles will
  9684. disappear right away, however. In general, a mail article will be
  9685. deleted from your system if, 1) it is marked as expirable, AND 2) it is
  9686. more than one week old. If you do not mark an article as expirable, it
  9687. will remain on your system until hell freezes over. This bears
  9688. repeating one more time, with some spurious capitalizations: IF you do
  9689. NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
  9690. @vindex gnus-auto-expirable-newsgroups
  9691. You do not have to mark articles as expirable by hand. Groups that
  9692. match the regular expression @code{gnus-auto-expirable-newsgroups} will
  9693. have all articles that you read marked as expirable automatically. All
  9694. articles marked as expirable have an @samp{E} in the first
  9695. column in the summary buffer.
  9696. By default, if you have auto expiry switched on, Gnus will mark all the
  9697. articles you read as expirable, no matter if they were read or unread
  9698. before. To avoid having articles marked as read marked as expirable
  9699. automatically, you can put something like the following in your
  9700. @file{.gnus} file:
  9701. @vindex gnus-mark-article-hook
  9702. @lisp
  9703. (remove-hook 'gnus-mark-article-hook
  9704. 'gnus-summary-mark-read-and-unread-as-read)
  9705. (add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)
  9706. @end lisp
  9707. Note that making a group auto-expirable doesn't mean that all read
  9708. articles are expired---only the articles marked as expirable
  9709. will be expired. Also note that using the @kbd{d} command won't make
  9710. groups expirable---only semi-automatic marking of articles as read will
  9711. mark the articles as expirable in auto-expirable groups.
  9712. Let's say you subscribe to a couple of mailing lists, and you want the
  9713. articles you have read to disappear after a while:
  9714. @lisp
  9715. (setq gnus-auto-expirable-newsgroups
  9716. "mail.nonsense-list\\|mail.nice-list")
  9717. @end lisp
  9718. Another way to have auto-expiry happen is to have the element
  9719. @code{auto-expire} in the group parameters of the group.
  9720. If you use adaptive scoring (@pxref{Adaptive Scoring}) and
  9721. auto-expiring, you'll have problems. Auto-expiring and adaptive scoring
  9722. don't really mix very well.
  9723. @vindex nnmail-expiry-wait
  9724. The @code{nnmail-expiry-wait} variable supplies the default time an
  9725. expirable article has to live. Gnus starts counting days from when the
  9726. message @emph{arrived}, not from when it was sent. The default is seven
  9727. days.
  9728. Gnus also supplies a function that lets you fine-tune how long articles
  9729. are to live, based on what group they are in. Let's say you want to
  9730. have one month expiry period in the @samp{mail.private} group, a one day
  9731. expiry period in the @samp{mail.junk} group, and a six day expiry period
  9732. everywhere else:
  9733. @vindex nnmail-expiry-wait-function
  9734. @lisp
  9735. (setq nnmail-expiry-wait-function
  9736. (lambda (group)
  9737. (cond ((string= group "mail.private")
  9738. 31)
  9739. ((string= group "mail.junk")
  9740. 1)
  9741. ((string= group "important")
  9742. 'never)
  9743. (t
  9744. 6))))
  9745. @end lisp
  9746. The group names this function is fed are ``unadorned'' group
  9747. names---no @samp{nnml:} prefixes and the like.
  9748. The @code{nnmail-expiry-wait} variable and
  9749. @code{nnmail-expiry-wait-function} function can either be a number (not
  9750. necessarily an integer) or one of the symbols @code{immediate} or
  9751. @code{never}.
  9752. You can also use the @code{expiry-wait} group parameter to selectively
  9753. change the expiry period (@pxref{Group Parameters}).
  9754. @vindex nnmail-expiry-target
  9755. The normal action taken when expiring articles is to delete them.
  9756. However, in some circumstances it might make more sense to move them to
  9757. other groups instead of deleting them. The variable @code{nnmail-expiry-target}
  9758. (and the @code{expiry-target} group parameter) controls this. The
  9759. variable supplies a default value for all groups, which can be
  9760. overridden for specific groups by the group parameter.
  9761. default value is @code{delete}, but this can also be a string (which
  9762. should be the name of the group the message should be moved to), or a
  9763. function (which will be called in a buffer narrowed to the message in
  9764. question, and with the name of the group being moved from as its
  9765. parameter) which should return a target -- either a group name or
  9766. @code{delete}.
  9767. Here's an example for specifying a group name:
  9768. @lisp
  9769. (setq nnmail-expiry-target "nnml:expired")
  9770. @end lisp
  9771. @vindex nnmail-keep-last-article
  9772. If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
  9773. expire the final article in a mail newsgroup. This is to make life
  9774. easier for procmail users.
  9775. @vindex gnus-total-expirable-newsgroups
  9776. By the way: That line up there, about Gnus never expiring non-expirable
  9777. articles, is a lie. If you put @code{total-expire} in the group
  9778. parameters, articles will not be marked as expirable, but all read
  9779. articles will be put through the expiry process. Use with extreme
  9780. caution. Even more dangerous is the
  9781. @code{gnus-total-expirable-newsgroups} variable. All groups that match
  9782. this regexp will have all read articles put through the expiry process,
  9783. which means that @emph{all} old mail articles in the groups in question
  9784. will be deleted after a while. Use with extreme caution, and don't come
  9785. crying to me when you discover that the regexp you used matched the
  9786. wrong group and all your important mail has disappeared. Be a
  9787. @emph{man}! Or a @emph{woman}! Whatever you feel more comfortable
  9788. with! So there!
  9789. Most people make most of their mail groups total-expirable, though.
  9790. @vindex gnus-inhibit-user-auto-expire
  9791. If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking
  9792. commands will not mark an article as expirable, even if the group has
  9793. auto-expire turned on.
  9794. @node Washing Mail
  9795. @subsection Washing Mail
  9796. @cindex mail washing
  9797. @cindex list server brain damage
  9798. @cindex incoming mail treatment
  9799. Mailers and list servers are notorious for doing all sorts of really,
  9800. really stupid things with mail. ``Hey, RFC 822 doesn't explicitly
  9801. prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
  9802. end of all lines passing through our server, so let's do that!!!!1!''
  9803. Yes, but RFC 822 wasn't designed to be read by morons. Things that were
  9804. considered to be self-evident were not discussed. So. Here we are.
  9805. Case in point: The German version of Microsoft Exchange adds @samp{AW:
  9806. } to the subjects of replies instead of @samp{Re: }. I could pretend to
  9807. be shocked and dismayed by this, but I haven't got the energy. It is to
  9808. laugh.
  9809. Gnus provides a plethora of functions for washing articles while
  9810. displaying them, but it might be nicer to do the filtering before
  9811. storing the mail to disc. For that purpose, we have three hooks and
  9812. various functions that can be put in these hooks.
  9813. @table @code
  9814. @item nnmail-prepare-incoming-hook
  9815. @vindex nnmail-prepare-incoming-hook
  9816. This hook is called before doing anything with the mail and is meant for
  9817. grand, sweeping gestures. It is called in a buffer that contains all
  9818. the new, incoming mail. Functions to be used include:
  9819. @table @code
  9820. @item nnheader-ms-strip-cr
  9821. @findex nnheader-ms-strip-cr
  9822. Remove trailing carriage returns from each line. This is default on
  9823. Emacs running on MS machines.
  9824. @end table
  9825. @item nnmail-prepare-incoming-header-hook
  9826. @vindex nnmail-prepare-incoming-header-hook
  9827. This hook is called narrowed to each header. It can be used when
  9828. cleaning up the headers. Functions that can be used include:
  9829. @table @code
  9830. @item nnmail-remove-leading-whitespace
  9831. @findex nnmail-remove-leading-whitespace
  9832. Clear leading white space that ``helpful'' listservs have added to the
  9833. headers to make them look nice. Aaah.
  9834. @item nnmail-remove-list-identifiers
  9835. @findex nnmail-remove-list-identifiers
  9836. Some list servers add an identifier---for example, @samp{(idm)}---to the
  9837. beginning of all @code{Subject} headers. I'm sure that's nice for
  9838. people who use stone age mail readers. This function will remove
  9839. strings that match the @code{nnmail-list-identifiers} regexp, which can
  9840. also be a list of regexp. @code{nnmail-list-identifiers} may not contain
  9841. @code{\\(..\\)}.
  9842. For instance, if you want to remove the @samp{(idm)} and the
  9843. @samp{nagnagnag} identifiers:
  9844. @lisp
  9845. (setq nnmail-list-identifiers
  9846. '("(idm)" "nagnagnag"))
  9847. @end lisp
  9848. This can also be done non-destructively with
  9849. @code{gnus-list-identifiers}, @xref{Article Hiding}.
  9850. @item nnmail-remove-tabs
  9851. @findex nnmail-remove-tabs
  9852. Translate all tab characters into space characters.
  9853. @item nnmail-fix-eudora-headers
  9854. @findex nnmail-fix-eudora-headers
  9855. @cindex Eudora
  9856. Eudora produces broken @code{References} headers, but OK
  9857. @code{In-Reply-To} headers. This function will get rid of the
  9858. @code{References} headers.
  9859. @end table
  9860. @item nnmail-prepare-incoming-message-hook
  9861. @vindex nnmail-prepare-incoming-message-hook
  9862. This hook is called narrowed to each message. Functions to be used
  9863. include:
  9864. @table @code
  9865. @item article-de-quoted-unreadable
  9866. @findex article-de-quoted-unreadable
  9867. Decode Quoted Readable encoding.
  9868. @end table
  9869. @end table
  9870. @node Duplicates
  9871. @subsection Duplicates
  9872. @vindex nnmail-treat-duplicates
  9873. @vindex nnmail-message-id-cache-length
  9874. @vindex nnmail-message-id-cache-file
  9875. @cindex duplicate mails
  9876. If you are a member of a couple of mailing lists, you will sometimes
  9877. receive two copies of the same mail. This can be quite annoying, so
  9878. @code{nnmail} checks for and treats any duplicates it might find. To do
  9879. this, it keeps a cache of old @code{Message-ID}s---
  9880. @code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
  9881. default. The approximate maximum number of @code{Message-ID}s stored
  9882. there is controlled by the @code{nnmail-message-id-cache-length}
  9883. variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be
  9884. stored.) If all this sounds scary to you, you can set
  9885. @code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
  9886. default), and @code{nnmail} won't delete duplicate mails. Instead it
  9887. will insert a warning into the head of the mail saying that it thinks
  9888. that this is a duplicate of a different message.
  9889. This variable can also be a function. If that's the case, the function
  9890. will be called from a buffer narrowed to the message in question with
  9891. the @code{Message-ID} as a parameter. The function must return either
  9892. @code{nil}, @code{warn}, or @code{delete}.
  9893. You can turn this feature off completely by setting the variable to
  9894. @code{nil}.
  9895. If you want all the duplicate mails to be put into a special
  9896. @dfn{duplicates} group, you could do that using the normal mail split
  9897. methods:
  9898. @lisp
  9899. (setq nnmail-split-fancy
  9900. '(| ;; Messages duplicates go to a separate group.
  9901. ("gnus-warning" "duplication of message" "duplicate")
  9902. ;; Message from daemons, postmaster, and the like to another.
  9903. (any mail "mail.misc")
  9904. ;; Other rules.
  9905. [ ... ] ))
  9906. @end lisp
  9907. Or something like:
  9908. @lisp
  9909. (setq nnmail-split-methods
  9910. '(("duplicates" "^Gnus-Warning:")
  9911. ;; Other rules.
  9912. [...]))
  9913. @end lisp
  9914. Here's a neat feature: If you know that the recipient reads her mail
  9915. with Gnus, and that she has @code{nnmail-treat-duplicates} set to
  9916. @code{delete}, you can send her as many insults as you like, just by
  9917. using a @code{Message-ID} of a mail that you know that she's already
  9918. received. Think of all the fun! She'll never see any of it! Whee!
  9919. @node Not Reading Mail
  9920. @subsection Not Reading Mail
  9921. If you start using any of the mail back ends, they have the annoying
  9922. habit of assuming that you want to read mail with them. This might not
  9923. be unreasonable, but it might not be what you want.
  9924. If you set @code{mail-sources} and @code{nnmail-spool-file} to
  9925. @code{nil}, none of the back ends will ever attempt to read incoming
  9926. mail, which should help.
  9927. @vindex nnbabyl-get-new-mail
  9928. @vindex nnmbox-get-new-mail
  9929. @vindex nnml-get-new-mail
  9930. @vindex nnmh-get-new-mail
  9931. @vindex nnfolder-get-new-mail
  9932. This might be too much, if, for instance, you are reading mail quite
  9933. happily with @code{nnml} and just want to peek at some old @sc{rmail}
  9934. file you have stashed away with @code{nnbabyl}. All back ends have
  9935. variables called back-end-@code{get-new-mail}. If you want to disable
  9936. the @code{nnbabyl} mail reading, you edit the virtual server for the
  9937. group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
  9938. All the mail back ends will call @code{nn}*@code{-prepare-save-mail-hook}
  9939. narrowed to the article to be saved before saving it when reading
  9940. incoming mail.
  9941. @node Choosing a Mail Back End
  9942. @subsection Choosing a Mail Back End
  9943. Gnus will read the mail spool when you activate a mail group. The mail
  9944. file is first copied to your home directory. What happens after that
  9945. depends on what format you want to store your mail in.
  9946. There are five different mail back ends in the standard Gnus, and more
  9947. back ends are available separately. The mail back end most people use
  9948. (because it is the fastest and most flexible) is @code{nnml}
  9949. (@pxref{Mail Spool}).
  9950. @menu
  9951. * Unix Mail Box:: Using the (quite) standard Un*x mbox.
  9952. * Rmail Babyl:: Emacs programs use the rmail babyl format.
  9953. * Mail Spool:: Store your mail in a private spool?
  9954. * MH Spool:: An mhspool-like back end.
  9955. * Mail Folders:: Having one file for each group.
  9956. * Comparing Mail Back Ends:: An in-depth looks at pros and cons.
  9957. @end menu
  9958. @node Unix Mail Box
  9959. @subsubsection Unix Mail Box
  9960. @cindex nnmbox
  9961. @cindex unix mail box
  9962. @vindex nnmbox-active-file
  9963. @vindex nnmbox-mbox-file
  9964. The @dfn{nnmbox} back end will use the standard Un*x mbox file to store
  9965. mail. @code{nnmbox} will add extra headers to each mail article to say
  9966. which group it belongs in.
  9967. Virtual server settings:
  9968. @table @code
  9969. @item nnmbox-mbox-file
  9970. @vindex nnmbox-mbox-file
  9971. The name of the mail box in the user's home directory.
  9972. @item nnmbox-active-file
  9973. @vindex nnmbox-active-file
  9974. The name of the active file for the mail box.
  9975. @item nnmbox-get-new-mail
  9976. @vindex nnmbox-get-new-mail
  9977. If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
  9978. into groups.
  9979. @end table
  9980. @node Rmail Babyl
  9981. @subsubsection Rmail Babyl
  9982. @cindex nnbabyl
  9983. @cindex rmail mbox
  9984. @vindex nnbabyl-active-file
  9985. @vindex nnbabyl-mbox-file
  9986. The @dfn{nnbabyl} back end will use a babyl mail box (aka. @dfn{rmail
  9987. mbox}) to store mail. @code{nnbabyl} will add extra headers to each
  9988. mail article to say which group it belongs in.
  9989. Virtual server settings:
  9990. @table @code
  9991. @item nnbabyl-mbox-file
  9992. @vindex nnbabyl-mbox-file
  9993. The name of the rmail mbox file.
  9994. @item nnbabyl-active-file
  9995. @vindex nnbabyl-active-file
  9996. The name of the active file for the rmail box.
  9997. @item nnbabyl-get-new-mail
  9998. @vindex nnbabyl-get-new-mail
  9999. If non-@code{nil}, @code{nnbabyl} will read incoming mail.
  10000. @end table
  10001. @node Mail Spool
  10002. @subsubsection Mail Spool
  10003. @cindex nnml
  10004. @cindex mail @sc{nov} spool
  10005. The @dfn{nnml} spool mail format isn't compatible with any other known
  10006. format. It should be used with some caution.
  10007. @vindex nnml-directory
  10008. If you use this back end, Gnus will split all incoming mail into files,
  10009. one file for each mail, and put the articles into the corresponding
  10010. directories under the directory specified by the @code{nnml-directory}
  10011. variable. The default value is @file{~/Mail/}.
  10012. You do not have to create any directories beforehand; Gnus will take
  10013. care of all that.
  10014. If you have a strict limit as to how many files you are allowed to store
  10015. in your account, you should not use this back end. As each mail gets its
  10016. own file, you might very well occupy thousands of inodes within a few
  10017. weeks. If this is no problem for you, and it isn't a problem for you
  10018. having your friendly systems administrator walking around, madly,
  10019. shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
  10020. know that this is probably the fastest format to use. You do not have
  10021. to trudge through a big mbox file just to read your new mail.
  10022. @code{nnml} is probably the slowest back end when it comes to article
  10023. splitting. It has to create lots of files, and it also generates
  10024. @sc{nov} databases for the incoming mails. This makes it the fastest
  10025. back end when it comes to reading mail.
  10026. Virtual server settings:
  10027. @table @code
  10028. @item nnml-directory
  10029. @vindex nnml-directory
  10030. All @code{nnml} directories will be placed under this directory.
  10031. @item nnml-active-file
  10032. @vindex nnml-active-file
  10033. The active file for the @code{nnml} server.
  10034. @item nnml-newsgroups-file
  10035. @vindex nnml-newsgroups-file
  10036. The @code{nnml} group descriptions file. @xref{Newsgroups File
  10037. Format}.
  10038. @item nnml-get-new-mail
  10039. @vindex nnml-get-new-mail
  10040. If non-@code{nil}, @code{nnml} will read incoming mail.
  10041. @item nnml-nov-is-evil
  10042. @vindex nnml-nov-is-evil
  10043. If non-@code{nil}, this back end will ignore any @sc{nov} files.
  10044. @item nnml-nov-file-name
  10045. @vindex nnml-nov-file-name
  10046. The name of the @sc{nov} files. The default is @file{.overview}.
  10047. @item nnml-prepare-save-mail-hook
  10048. @vindex nnml-prepare-save-mail-hook
  10049. Hook run narrowed to an article before saving.
  10050. @end table
  10051. @findex nnml-generate-nov-databases
  10052. If your @code{nnml} groups and @sc{nov} files get totally out of whack,
  10053. you can do a complete update by typing @kbd{M-x
  10054. nnml-generate-nov-databases}. This command will trawl through the
  10055. entire @code{nnml} hierarchy, looking at each and every article, so it
  10056. might take a while to complete. A better interface to this
  10057. functionality can be found in the server buffer (@pxref{Server
  10058. Commands}).
  10059. @node MH Spool
  10060. @subsubsection MH Spool
  10061. @cindex nnmh
  10062. @cindex mh-e mail spool
  10063. @code{nnmh} is just like @code{nnml}, except that is doesn't generate
  10064. @sc{nov} databases and it doesn't keep an active file. This makes
  10065. @code{nnmh} a @emph{much} slower back end than @code{nnml}, but it also
  10066. makes it easier to write procmail scripts for.
  10067. Virtual server settings:
  10068. @table @code
  10069. @item nnmh-directory
  10070. @vindex nnmh-directory
  10071. All @code{nnmh} directories will be located under this directory.
  10072. @item nnmh-get-new-mail
  10073. @vindex nnmh-get-new-mail
  10074. If non-@code{nil}, @code{nnmh} will read incoming mail.
  10075. @item nnmh-be-safe
  10076. @vindex nnmh-be-safe
  10077. If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
  10078. sure that the articles in the folder are actually what Gnus thinks they
  10079. are. It will check date stamps and stat everything in sight, so
  10080. setting this to @code{t} will mean a serious slow-down. If you never
  10081. use anything but Gnus to read the @code{nnmh} articles, you do not have
  10082. to set this variable to @code{t}.
  10083. @end table
  10084. @node Mail Folders
  10085. @subsubsection Mail Folders
  10086. @cindex nnfolder
  10087. @cindex mbox folders
  10088. @cindex mail folders
  10089. @code{nnfolder} is a back end for storing each mail group in a separate
  10090. file. Each file is in the standard Un*x mbox format. @code{nnfolder}
  10091. will add extra headers to keep track of article numbers and arrival
  10092. dates.
  10093. Virtual server settings:
  10094. @table @code
  10095. @item nnfolder-directory
  10096. @vindex nnfolder-directory
  10097. All the @code{nnfolder} mail boxes will be stored under this directory.
  10098. @item nnfolder-active-file
  10099. @vindex nnfolder-active-file
  10100. The name of the active file.
  10101. @item nnfolder-newsgroups-file
  10102. @vindex nnfolder-newsgroups-file
  10103. The name of the group descriptions file. @xref{Newsgroups File Format}.
  10104. @item nnfolder-get-new-mail
  10105. @vindex nnfolder-get-new-mail
  10106. If non-@code{nil}, @code{nnfolder} will read incoming mail.
  10107. @item nnfolder-save-buffer-hook
  10108. @vindex nnfolder-save-buffer-hook
  10109. @cindex backup files
  10110. Hook run before saving the folders. Note that Emacs does the normal
  10111. backup renaming of files even with the @code{nnfolder} buffers. If you
  10112. wish to switch this off, you could say something like the following in
  10113. your @file{.emacs} file:
  10114. @lisp
  10115. (defun turn-off-backup ()
  10116. (set (make-local-variable 'backup-inhibited) t))
  10117. (add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)
  10118. @end lisp
  10119. @item nnfolder-delete-mail-hook
  10120. @vindex nnfolder-delete-mail-hook
  10121. Hook run in a buffer narrowed to the message that is to be deleted.
  10122. This function can be used to copy the message to somewhere else, or to
  10123. extract some information from it before removing it.
  10124. @end table
  10125. @findex nnfolder-generate-active-file
  10126. @kindex M-x nnfolder-generate-active-file
  10127. If you have lots of @code{nnfolder}-like files you'd like to read with
  10128. @code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
  10129. command to make @code{nnfolder} aware of all likely files in
  10130. @code{nnfolder-directory}. This only works if you use long file names,
  10131. though.
  10132. @node Comparing Mail Back Ends
  10133. @subsubsection Comparing Mail Back Ends
  10134. First, just for terminology, the @dfn{back end} is the common word for a
  10135. low-level access method---a transport, if you will, by which something
  10136. is acquired. The sense is that one's mail has to come from somewhere,
  10137. and so selection of a suitable back end is required in order to get that
  10138. mail within spitting distance of Gnus.
  10139. The same concept exists for Usenet itself: Though access to articles is
  10140. typically done by @sc{nntp} these days, once upon a midnight dreary, everyone
  10141. in the world got at Usenet by running a reader on the machine where the
  10142. articles lay (the machine which today we call an @sc{nntp} server), and
  10143. access was by the reader stepping into the articles' directory spool
  10144. area directly. One can still select between either the @code{nntp} or
  10145. @code{nnspool} back ends, to select between these methods, if one happens
  10146. actually to live on the server (or can see its spool directly, anyway,
  10147. via NFS).
  10148. The goal in selecting a mail back end is to pick one which
  10149. simultaneously represents a suitable way of dealing with the original
  10150. format plus leaving mail in a form that is convenient to use in the
  10151. future. Here are some high and low points on each:
  10152. @table @code
  10153. @item nnmbox
  10154. UNIX systems have historically had a single, very common, and well-
  10155. defined format. All messages arrive in a single @dfn{spool file}, and
  10156. they are delineated by a line whose regular expression matches
  10157. @samp{^From_}. (My notational use of @samp{_} is to indicate a space,
  10158. to make it clear in this instance that this is not the RFC-specified
  10159. @samp{From:} header.) Because Emacs and therefore Gnus emanate
  10160. historically from the Unix environment, it is simplest if one does not
  10161. mess a great deal with the original mailbox format, so if one chooses
  10162. this back end, Gnus' primary activity in getting mail from the real spool
  10163. area to Gnus' preferred directory is simply to copy it, with no
  10164. (appreciable) format change in the process. It is the ``dumbest'' way
  10165. to move mail into availability in the Gnus environment. This makes it
  10166. fast to move into place, but slow to parse, when Gnus has to look at
  10167. what's where.
  10168. @item nnbabyl
  10169. Once upon a time, there was the DEC-10 and DEC-20, running operating
  10170. systems called TOPS and related things, and the usual (only?) mail
  10171. reading environment was a thing called Babyl. I don't know what format
  10172. was used for mail landing on the system, but Babyl had its own internal
  10173. format to which mail was converted, primarily involving creating a
  10174. spool-file-like entity with a scheme for inserting Babyl-specific
  10175. headers and status bits above the top of each message in the file.
  10176. RMAIL was Emacs' first mail reader, it was written by Richard Stallman,
  10177. and Stallman came out of that TOPS/Babyl environment, so he wrote RMAIL
  10178. to understand the mail files folks already had in existence. Gnus (and
  10179. VM, for that matter) continue to support this format because it's
  10180. perceived as having some good qualities in those mailer-specific
  10181. headers/status bits stuff. RMAIL itself still exists as well, of
  10182. course, and is still maintained by Stallman.
  10183. Both of the above forms leave your mail in a single file on your
  10184. filesystem, and they must parse that entire file each time you take a
  10185. look at your mail.
  10186. @item nnml
  10187. @code{nnml} is the back end which smells the most as though you were
  10188. actually operating with an @code{nnspool}-accessed Usenet system. (In
  10189. fact, I believe @code{nnml} actually derived from @code{nnspool} code,
  10190. lo these years ago.) One's mail is taken from the original spool file,
  10191. and is then cut up into individual message files, 1:1. It maintains a
  10192. Usenet-style active file (analogous to what one finds in an INN- or
  10193. CNews-based news system in (for instance) @file{/var/lib/news/active},
  10194. or what is returned via the @samp{NNTP LIST} verb) and also creates
  10195. @dfn{overview} files for efficient group entry, as has been defined for
  10196. @sc{nntp} servers for some years now. It is slower in mail-splitting,
  10197. due to the creation of lots of files, updates to the @code{nnml} active
  10198. file, and additions to overview files on a per-message basis, but it is
  10199. extremely fast on access because of what amounts to the indexing support
  10200. provided by the active file and overviews.
  10201. @code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the
  10202. resource which defines available places in the filesystem to put new
  10203. files. Sysadmins take a dim view of heavy inode occupation within
  10204. tight, shared filesystems. But if you live on a personal machine where
  10205. the filesystem is your own and space is not at a premium, @code{nnml}
  10206. wins big.
  10207. It is also problematic using this back end if you are living in a
  10208. FAT16-based Windows world, since much space will be wasted on all these
  10209. tiny files.
  10210. @item nnmh
  10211. The Rand MH mail-reading system has been around UNIX systems for a very
  10212. long time; it operates by splitting one's spool file of messages into
  10213. individual files, but with little or no indexing support -- @code{nnmh}
  10214. is considered to be semantically equivalent to ``@code{nnml} without
  10215. active file or overviews''. This is arguably the worst choice, because
  10216. one gets the slowness of individual file creation married to the
  10217. slowness of access parsing when learning what's new in one's groups.
  10218. @item nnfolder
  10219. Basically the effect of @code{nnfolder} is @code{nnmbox} (the first
  10220. method described above) on a per-group basis. That is, @code{nnmbox}
  10221. itself puts *all* one's mail in one file; @code{nnfolder} provides a
  10222. little bit of optimization to this so that each of one's mail groups has
  10223. a Unix mail box file. It's faster than @code{nnmbox} because each group
  10224. can be parsed separately, and still provides the simple Unix mail box
  10225. format requiring minimal effort in moving the mail around. In addition,
  10226. it maintains an ``active'' file making it much faster for Gnus to figure
  10227. out how many messages there are in each separate group.
  10228. If you have groups that are expected to have a massive amount of
  10229. messages, @code{nnfolder} is not the best choice, but if you receive
  10230. only a moderate amount of mail, @code{nnfolder} is probably the most
  10231. friendly mail back end all over.
  10232. @end table
  10233. @node Browsing the Web
  10234. @section Browsing the Web
  10235. @cindex web
  10236. @cindex browsing the web
  10237. @cindex www
  10238. @cindex http
  10239. Web-based discussion forums are getting more and more popular. On many
  10240. subjects, the web-based forums have become the most important forums,
  10241. eclipsing the importance of mailing lists and news groups. The reason
  10242. is easy to understand---they are friendly to new users; you just point
  10243. and click, and there's the discussion. With mailing lists, you have to
  10244. go through a cumbersome subscription procedure, and most people don't
  10245. even know what a news group is.
  10246. The problem with this scenario is that web browsers are not very good at
  10247. being newsreaders. They do not keep track of what articles you've read;
  10248. they do not allow you to score on subjects you're interested in; they do
  10249. not allow off-line browsing; they require you to click around and drive
  10250. you mad in the end.
  10251. So---if web browsers suck at reading discussion forums, why not use Gnus
  10252. to do it instead?
  10253. Gnus has been getting a bit of a collection of back ends for providing
  10254. interfaces to these sources.
  10255. @menu
  10256. * Web Searches:: Creating groups from articles that match a string.
  10257. * Slashdot:: Reading the Slashdot comments.
  10258. * Ultimate:: The Ultimate Bulletin Board systems.
  10259. * Web Archive:: Reading mailing list archived on web.
  10260. * Customizing w3:: Doing stuff to Emacs/w3 from Gnus.
  10261. @end menu
  10262. All the web sources require Emacs/w3 and the url library to work.
  10263. The main caveat with all these web sources is that they probably won't
  10264. work for a very long time. Gleaning information from the @sc{html} data
  10265. is guesswork at best, and when the layout is altered, the Gnus back end
  10266. will fail. If you have reasonably new versions of these back ends,
  10267. though, you should be ok.
  10268. One thing all these Web methods have in common is that the Web sources
  10269. are often down, unavailable or just plain too slow to be fun. In those
  10270. cases, it makes a lot of sense to let the Gnus Agent (@pxref{Gnus
  10271. Unplugged}) handle downloading articles, and then you can read them at
  10272. leisure from your local disk. No more World Wide Wait for you.
  10273. @node Web Searches
  10274. @subsection Web Searches
  10275. @cindex nnweb
  10276. @cindex DejaNews
  10277. @cindex Alta Vista
  10278. @cindex InReference
  10279. @cindex Usenet searches
  10280. @cindex searching the Usenet
  10281. It's, like, too neat to search the Usenet for articles that match a
  10282. string, but it, like, totally @emph{sucks}, like, totally, to use one of
  10283. those, like, Web browsers, and you, like, have to, rilly, like, look at
  10284. the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
  10285. searches without having to use a browser.
  10286. The @code{nnweb} back end allows an easy interface to the mighty search
  10287. engine. You create an @code{nnweb} group, enter a search pattern, and
  10288. then enter the group and read the articles like you would any normal
  10289. group. The @kbd{G w} command in the group buffer (@pxref{Foreign
  10290. Groups}) will do this in an easy-to-use fashion.
  10291. @code{nnweb} groups don't really lend themselves to being solid
  10292. groups---they have a very fleeting idea of article numbers. In fact,
  10293. each time you enter an @code{nnweb} group (not even changing the search
  10294. pattern), you are likely to get the articles ordered in a different
  10295. manner. Not even using duplicate suppression (@pxref{Duplicate
  10296. Suppression}) will help, since @code{nnweb} doesn't even know the
  10297. @code{Message-ID} of the articles before reading them using some search
  10298. engines (DejaNews, for instance). The only possible way to keep track
  10299. of which articles you've read is by scoring on the @code{Date}
  10300. header---mark all articles posted before the last date you read the
  10301. group as read.
  10302. If the search engine changes its output substantially, @code{nnweb}
  10303. won't be able to parse it and will fail. One could hardly fault the Web
  10304. providers if they were to do this---their @emph{raison d'être} is to
  10305. make money off of advertisements, not to provide services to the
  10306. community. Since @code{nnweb} washes the ads off all the articles, one
  10307. might think that the providers might be somewhat miffed. We'll see.
  10308. You must have the @code{url} and @code{w3} package installed to be able
  10309. to use @code{nnweb}.
  10310. Virtual server variables:
  10311. @table @code
  10312. @item nnweb-type
  10313. @vindex nnweb-type
  10314. What search engine type is being used. The currently supported types
  10315. are @code{dejanews}, @code{dejanewsold}, @code{altavista} and
  10316. @code{reference}.
  10317. @item nnweb-search
  10318. @vindex nnweb-search
  10319. The search string to feed to the search engine.
  10320. @item nnweb-max-hits
  10321. @vindex nnweb-max-hits
  10322. Advisory maximum number of hits per search to display. The default is
  10323. 100.
  10324. @item nnweb-type-definition
  10325. @vindex nnweb-type-definition
  10326. Type-to-definition alist. This alist says what @code{nnweb} should do
  10327. with the various search engine types. The following elements must be
  10328. present:
  10329. @table @code
  10330. @item article
  10331. Function to decode the article and provide something that Gnus
  10332. understands.
  10333. @item map
  10334. Function to create an article number to message header and URL alist.
  10335. @item search
  10336. Function to send the search string to the search engine.
  10337. @item address
  10338. The address the aforementioned function should send the search string
  10339. to.
  10340. @item id
  10341. Format string URL to fetch an article by @code{Message-ID}.
  10342. @end table
  10343. @end table
  10344. @node Slashdot
  10345. @subsection Slashdot
  10346. @cindex Slashdot
  10347. @cindex nnslashdot
  10348. Slashdot (@uref{http://slashdot.org/}) is a popular news site, with
  10349. lively discussion following the news articles. @code{nnslashdot} will
  10350. let you read this forum in a convenient manner.
  10351. The easiest way to read this source is to put something like the
  10352. following in your @file{.gnus.el} file:
  10353. @lisp
  10354. (setq gnus-secondary-select-methods
  10355. '((nnslashdot "")))
  10356. @end lisp
  10357. This will make Gnus query the @code{nnslashdot} back end for new comments
  10358. and groups. The @kbd{F} command will subscribe each new news article as
  10359. a new Gnus group, and you can read the comments by entering these
  10360. groups. (Note that the default subscription method is to subscribe new
  10361. groups as zombies. Other methods are available (@pxref{Subscription
  10362. Methods}).
  10363. If you want to remove an old @code{nnslashdot} group, the @kbd{G @key{DEL}}
  10364. command is the most handy tool (@pxref{Foreign Groups}).
  10365. When following up to @code{nnslashdot} comments (or posting new
  10366. comments), some light @sc{html}izations will be performed. In
  10367. particular, text quoted with @samp{> } will be quoted with
  10368. @code{blockquote} instead, and signatures will have @code{br} added to
  10369. the end of each line. Other than that, you can just write @sc{html}
  10370. directly into the message buffer. Note that Slashdot filters out some
  10371. @sc{html} forms.
  10372. The following variables can be altered to change its behavior:
  10373. @table @code
  10374. @item nnslashdot-threaded
  10375. Whether @code{nnslashdot} should display threaded groups or not. The
  10376. default is @code{t}. To be able to display threads, @code{nnslashdot}
  10377. has to retrieve absolutely all comments in a group upon entry. If a
  10378. threaded display is not required, @code{nnslashdot} will only retrieve
  10379. the comments that are actually wanted by the user. Threading is nicer,
  10380. but much, much slower than untreaded.
  10381. @item nnslashdot-login-name
  10382. @vindex nnslashdot-login-name
  10383. The login name to use when posting.
  10384. @item nnslashdot-password
  10385. @vindex nnslashdot-password
  10386. The password to use when posting.
  10387. @item nnslashdot-directory
  10388. @vindex nnslashdot-directory
  10389. Where @code{nnslashdot} will store its files. The default is
  10390. @samp{~/News/slashdot/}.
  10391. @item nnslashdot-active-url
  10392. @vindex nnslashdot-active-url
  10393. The @sc{url} format string that will be used to fetch the information on
  10394. news articles and comments. Default:
  10395. @samp{http://slashdot.org/search.pl?section=&min=%d}.
  10396. @item nnslashdot-comments-url
  10397. @vindex nnslashdot-comments-url
  10398. The @sc{url} format string that will be used to fetch comments. The
  10399. default is
  10400. @samp{http://slashdot.org/comments.pl?sid=%s&threshold=%d&commentsort=%d&mode=flat&startat=%d}.
  10401. @item nnslashdot-article-url
  10402. @vindex nnslashdot-article-url
  10403. The @sc{url} format string that will be used to fetch the news article. The
  10404. default is
  10405. @samp{http://slashdot.org/article.pl?sid=%s&mode=nocomment}.
  10406. @item nnslashdot-threshold
  10407. @vindex nnslashdot-threshold
  10408. The score threshold. The default is -1.
  10409. @item nnslashdot-group-number
  10410. @vindex nnslashdot-group-number
  10411. The number of old groups, in addition to the ten latest, to keep
  10412. updated. The default is 0.
  10413. @end table
  10414. @node Ultimate
  10415. @subsection Ultimate
  10416. @cindex nnultimate
  10417. @cindex Ultimate Bulletin Board
  10418. The Ultimate Bulletin Board (@uref{http://www.ultimatebb.com/}) is
  10419. probably the most popular Web bulletin board system used. It has a
  10420. quite regular and nice interface, and it's possible to get the
  10421. information Gnus needs to keep groups updated.
  10422. The easiest way to get started with @code{nnultimate} is to say
  10423. something like the following in the group buffer: @kbd{B nnultimate @key{RET}
  10424. http://www.tcj.com/messboard/ubbcgi/ @key{RET}}. (Substitute the @sc{url}
  10425. (not including @samp{Ultimate.cgi} or the like at the end) for a forum
  10426. you're interested in; there's quite a list of them on the Ultimate web
  10427. site.) Then subscribe to the groups you're interested in from the
  10428. server buffer, and read them from the group buffer.
  10429. The following @code{nnultimate} variables can be altered:
  10430. @table @code
  10431. @item nnultimate-directory
  10432. @vindex nnultimate-directory
  10433. The directory where @code{nnultimate} stores its files. The default is
  10434. @samp{~/News/ultimate/}.
  10435. @end table
  10436. @node Web Archive
  10437. @subsection Web Archive
  10438. @cindex nnwarchive
  10439. @cindex Web Archive
  10440. Some mailing lists only have archives on Web servers, such as
  10441. @uref{http://www.egroups.com/} and
  10442. @uref{http://www.mail-archive.com/}. It has a quite regular and nice
  10443. interface, and it's possible to get the information Gnus needs to keep
  10444. groups updated.
  10445. The easiest way to get started with @code{nnwarchive} is to say
  10446. something like the following in the group buffer: @kbd{M-x
  10447. gnus-group-make-warchive-group @key{RET} an_egroup @key{RET} egroups @key{RET}
  10448. www.egroups.com @key{RET} your@@email.address @key{RET}}. (Substitute the
  10449. @sc{an_egroup} with the mailing list you subscribed, the
  10450. @sc{your@@email.address} with your email address.), or to browse the
  10451. back end by @kbd{B nnwarchive @key{RET} mail-archive @key{RET}}.
  10452. The following @code{nnwarchive} variables can be altered:
  10453. @table @code
  10454. @item nnwarchive-directory
  10455. @vindex nnwarchive-directory
  10456. The directory where @code{nnwarchive} stores its files. The default is
  10457. @samp{~/News/warchive/}.
  10458. @item nnwarchive-login
  10459. @vindex nnwarchive-login
  10460. The account name on the web server.
  10461. @item nnwarchive-passwd
  10462. @vindex nnwarchive-passwd
  10463. The password for your account on the web server.
  10464. @end table
  10465. @node Customizing w3
  10466. @subsection Customizing w3
  10467. @cindex w3
  10468. @cindex html
  10469. @cindex url
  10470. @cindex Netscape
  10471. Gnus uses the url library to fetch web pages and Emacs/w3 to display web
  10472. pages. Emacs/w3 is documented in its own manual, but there are some
  10473. things that may be more relevant for Gnus users.
  10474. For instance, a common question is how to make Emacs/w3 follow links
  10475. using the @code{browse-url} functions (which will call some external web
  10476. browser like Netscape). Here's one way:
  10477. @lisp
  10478. (eval-after-load "w3"
  10479. '(progn
  10480. (fset 'w3-fetch-orig (symbol-function 'w3-fetch))
  10481. (defun w3-fetch (&optional url target)
  10482. (interactive (list (w3-read-url-with-default)))
  10483. (if (eq major-mode 'gnus-article-mode)
  10484. (browse-url url)
  10485. (w3-fetch-orig url target)))))
  10486. @end lisp
  10487. Put that in your @file{.emacs} file, and hitting links in w3-rendered
  10488. @sc{html} in the Gnus article buffers will use @code{browse-url} to
  10489. follow the link.
  10490. @node Other Sources
  10491. @section Other Sources
  10492. Gnus can do more than just read news or mail. The methods described
  10493. below allow Gnus to view directories and files as if they were
  10494. newsgroups.
  10495. @menu
  10496. * Directory Groups:: You can read a directory as if it was a newsgroup.
  10497. * Anything Groups:: Dired? Who needs dired?
  10498. * Document Groups:: Single files can be the basis of a group.
  10499. * SOUP:: Reading @sc{soup} packets ``offline''.
  10500. * Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
  10501. * IMAP:: Using Gnus as a @sc{imap} client.
  10502. @end menu
  10503. @node Directory Groups
  10504. @subsection Directory Groups
  10505. @cindex nndir
  10506. @cindex directory groups
  10507. If you have a directory that has lots of articles in separate files in
  10508. it, you might treat it as a newsgroup. The files have to have numerical
  10509. names, of course.
  10510. This might be an opportune moment to mention @code{ange-ftp} (and its
  10511. successor @code{efs}), that most wonderful of all wonderful Emacs
  10512. packages. When I wrote @code{nndir}, I didn't think much about it---a
  10513. back end to read directories. Big deal.
  10514. @code{ange-ftp} changes that picture dramatically. For instance, if you
  10515. enter the @code{ange-ftp} file name
  10516. @file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,
  10517. @code{ange-ftp} or @code{efs} will actually allow you to read this
  10518. directory over at @samp{sina} as a newsgroup. Distributed news ahoy!
  10519. @code{nndir} will use @sc{nov} files if they are present.
  10520. @code{nndir} is a ``read-only'' back end---you can't delete or expire
  10521. articles with this method. You can use @code{nnmh} or @code{nnml} for
  10522. whatever you use @code{nndir} for, so you could switch to any of those
  10523. methods if you feel the need to have a non-read-only @code{nndir}.
  10524. @node Anything Groups
  10525. @subsection Anything Groups
  10526. @cindex nneething
  10527. From the @code{nndir} back end (which reads a single spool-like
  10528. directory), it's just a hop and a skip to @code{nneething}, which
  10529. pretends that any arbitrary directory is a newsgroup. Strange, but
  10530. true.
  10531. When @code{nneething} is presented with a directory, it will scan this
  10532. directory and assign article numbers to each file. When you enter such
  10533. a group, @code{nneething} must create ``headers'' that Gnus can use.
  10534. After all, Gnus is a newsreader, in case you're forgetting.
  10535. @code{nneething} does this in a two-step process. First, it snoops each
  10536. file in question. If the file looks like an article (i.e., the first
  10537. few lines look like headers), it will use this as the head. If this is
  10538. just some arbitrary file without a head (e.g. a C source file),
  10539. @code{nneething} will cobble up a header out of thin air. It will use
  10540. file ownership, name and date and do whatever it can with these
  10541. elements.
  10542. All this should happen automatically for you, and you will be presented
  10543. with something that looks very much like a newsgroup. Totally like a
  10544. newsgroup, to be precise. If you select an article, it will be displayed
  10545. in the article buffer, just as usual.
  10546. If you select a line that represents a directory, Gnus will pop you into
  10547. a new summary buffer for this @code{nneething} group. And so on. You can
  10548. traverse the entire disk this way, if you feel like, but remember that
  10549. Gnus is not dired, really, and does not intend to be, either.
  10550. There are two overall modes to this action---ephemeral or solid. When
  10551. doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
  10552. will not store information on what files you have read, and what files
  10553. are new, and so on. If you create a solid @code{nneething} group the
  10554. normal way with @kbd{G m}, Gnus will store a mapping table between
  10555. article numbers and file names, and you can treat this group like any
  10556. other groups. When you activate a solid @code{nneething} group, you will
  10557. be told how many unread articles it contains, etc., etc.
  10558. Some variables:
  10559. @table @code
  10560. @item nneething-map-file-directory
  10561. @vindex nneething-map-file-directory
  10562. All the mapping files for solid @code{nneething} groups will be stored
  10563. in this directory, which defaults to @file{~/.nneething/}.
  10564. @item nneething-exclude-files
  10565. @vindex nneething-exclude-files
  10566. All files that match this regexp will be ignored. Nice to use to exclude
  10567. auto-save files and the like, which is what it does by default.
  10568. @item nneething-include-files
  10569. @vindex nneething-include-files
  10570. Regexp saying what files to include in the group. If this variable is
  10571. non-@code{nil}, only files matching this regexp will be included.
  10572. @item nneething-map-file
  10573. @vindex nneething-map-file
  10574. Name of the map files.
  10575. @end table
  10576. @node Document Groups
  10577. @subsection Document Groups
  10578. @cindex nndoc
  10579. @cindex documentation group
  10580. @cindex help group
  10581. @code{nndoc} is a cute little thing that will let you read a single file
  10582. as a newsgroup. Several files types are supported:
  10583. @table @code
  10584. @cindex babyl
  10585. @cindex rmail mbox
  10586. @item babyl
  10587. The babyl (rmail) mail box.
  10588. @cindex mbox
  10589. @cindex Unix mbox
  10590. @item mbox
  10591. The standard Unix mbox file.
  10592. @cindex MMDF mail box
  10593. @item mmdf
  10594. The MMDF mail box format.
  10595. @item news
  10596. Several news articles appended into a file.
  10597. @item rnews
  10598. @cindex rnews batch files
  10599. The rnews batch transport format.
  10600. @cindex forwarded messages
  10601. @item forward
  10602. Forwarded articles.
  10603. @item nsmail
  10604. Netscape mail boxes.
  10605. @item mime-parts
  10606. MIME multipart messages.
  10607. @item standard-digest
  10608. The standard (RFC 1153) digest format.
  10609. @item slack-digest
  10610. Non-standard digest format---matches most things, but does it badly.
  10611. @end table
  10612. You can also use the special ``file type'' @code{guess}, which means
  10613. that @code{nndoc} will try to guess what file type it is looking at.
  10614. @code{digest} means that @code{nndoc} should guess what digest type the
  10615. file is.
  10616. @code{nndoc} will not try to change the file or insert any extra headers into
  10617. it---it will simply, like, let you use the file as the basis for a
  10618. group. And that's it.
  10619. If you have some old archived articles that you want to insert into your
  10620. new & spiffy Gnus mail back end, @code{nndoc} can probably help you with
  10621. that. Say you have an old @file{RMAIL} file with mail that you now want
  10622. to split into your new @code{nnml} groups. You look at that file using
  10623. @code{nndoc} (using the @kbd{G f} command in the group buffer
  10624. (@pxref{Foreign Groups})), set the process mark on all the articles in
  10625. the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
  10626. using @code{nnml}. If all goes well, all the mail in the @file{RMAIL}
  10627. file is now also stored in lots of @code{nnml} directories, and you can
  10628. delete that pesky @file{RMAIL} file. If you have the guts!
  10629. Virtual server variables:
  10630. @table @code
  10631. @item nndoc-article-type
  10632. @vindex nndoc-article-type
  10633. This should be one of @code{mbox}, @code{babyl}, @code{digest},
  10634. @code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
  10635. @code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
  10636. @code{slack-digest}, @code{clari-briefs}, @code{nsmail} or @code{guess}.
  10637. @item nndoc-post-type
  10638. @vindex nndoc-post-type
  10639. This variable says whether Gnus is to consider the group a news group or
  10640. a mail group. There are two valid values: @code{mail} (the default)
  10641. and @code{news}.
  10642. @end table
  10643. @menu
  10644. * Document Server Internals:: How to add your own document types.
  10645. @end menu
  10646. @node Document Server Internals
  10647. @subsubsection Document Server Internals
  10648. Adding new document types to be recognized by @code{nndoc} isn't
  10649. difficult. You just have to whip up a definition of what the document
  10650. looks like, write a predicate function to recognize that document type,
  10651. and then hook into @code{nndoc}.
  10652. First, here's an example document type definition:
  10653. @example
  10654. (mmdf
  10655. (article-begin . "^\^A\^A\^A\^A\n")
  10656. (body-end . "^\^A\^A\^A\^A\n"))
  10657. @end example
  10658. The definition is simply a unique @dfn{name} followed by a series of
  10659. regexp pseudo-variable settings. Below are the possible
  10660. variables---don't be daunted by the number of variables; most document
  10661. types can be defined with very few settings:
  10662. @table @code
  10663. @item first-article
  10664. If present, @code{nndoc} will skip past all text until it finds
  10665. something that match this regexp. All text before this will be
  10666. totally ignored.
  10667. @item article-begin
  10668. This setting has to be present in all document type definitions. It
  10669. says what the beginning of each article looks like.
  10670. @item head-begin-function
  10671. If present, this should be a function that moves point to the head of
  10672. the article.
  10673. @item nndoc-head-begin
  10674. If present, this should be a regexp that matches the head of the
  10675. article.
  10676. @item nndoc-head-end
  10677. This should match the end of the head of the article. It defaults to
  10678. @samp{^$}---the empty line.
  10679. @item body-begin-function
  10680. If present, this function should move point to the beginning of the body
  10681. of the article.
  10682. @item body-begin
  10683. This should match the beginning of the body of the article. It defaults
  10684. to @samp{^\n}.
  10685. @item body-end-function
  10686. If present, this function should move point to the end of the body of
  10687. the article.
  10688. @item body-end
  10689. If present, this should match the end of the body of the article.
  10690. @item file-end
  10691. If present, this should match the end of the file. All text after this
  10692. regexp will be totally ignored.
  10693. @end table
  10694. So, using these variables @code{nndoc} is able to dissect a document
  10695. file into a series of articles, each with a head and a body. However, a
  10696. few more variables are needed since not all document types are all that
  10697. news-like---variables needed to transform the head or the body into
  10698. something that's palatable for Gnus:
  10699. @table @code
  10700. @item prepare-body-function
  10701. If present, this function will be called when requesting an article. It
  10702. will be called with point at the start of the body, and is useful if the
  10703. document has encoded some parts of its contents.
  10704. @item article-transform-function
  10705. If present, this function is called when requesting an article. It's
  10706. meant to be used for more wide-ranging transformation of both head and
  10707. body of the article.
  10708. @item generate-head-function
  10709. If present, this function is called to generate a head that Gnus can
  10710. understand. It is called with the article number as a parameter, and is
  10711. expected to generate a nice head for the article in question. It is
  10712. called when requesting the headers of all articles.
  10713. @end table
  10714. Let's look at the most complicated example I can come up with---standard
  10715. digests:
  10716. @example
  10717. (standard-digest
  10718. (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
  10719. (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
  10720. (prepare-body-function . nndoc-unquote-dashes)
  10721. (body-end-function . nndoc-digest-body-end)
  10722. (head-end . "^ ?$")
  10723. (body-begin . "^ ?\n")
  10724. (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
  10725. (subtype digest guess))
  10726. @end example
  10727. We see that all text before a 70-width line of dashes is ignored; all
  10728. text after a line that starts with that @samp{^End of} is also ignored;
  10729. each article begins with a 30-width line of dashes; the line separating
  10730. the head from the body may contain a single space; and that the body is
  10731. run through @code{nndoc-unquote-dashes} before being delivered.
  10732. To hook your own document definition into @code{nndoc}, use the
  10733. @code{nndoc-add-type} function. It takes two parameters---the first is
  10734. the definition itself and the second (optional) parameter says where in
  10735. the document type definition alist to put this definition. The alist is
  10736. traversed sequentially, and @code{nndoc-TYPE-type-p} is called for a given type @code{TYPE}. So @code{nndoc-mmdf-type-p} is called to see whether a document
  10737. is of @code{mmdf} type, and so on. These type predicates should return
  10738. @code{nil} if the document is not of the correct type; @code{t} if it is
  10739. of the correct type; and a number if the document might be of the
  10740. correct type. A high number means high probability; a low number means
  10741. low probability with @samp{0} being the lowest valid number.
  10742. @node SOUP
  10743. @subsection SOUP
  10744. @cindex SOUP
  10745. @cindex offline
  10746. In the PC world people often talk about ``offline'' newsreaders. These
  10747. are thingies that are combined reader/news transport monstrosities.
  10748. With built-in modem programs. Yecchh!
  10749. Of course, us Unix Weenie types of human beans use things like
  10750. @code{uucp} and, like, @code{nntpd} and set up proper news and mail
  10751. transport things like Ghod intended. And then we just use normal
  10752. newsreaders.
  10753. However, it can sometimes be convenient to do something that's a bit
  10754. easier on the brain if you have a very slow modem, and you're not really
  10755. that interested in doing things properly.
  10756. A file format called @sc{soup} has been developed for transporting news
  10757. and mail from servers to home machines and back again. It can be a bit
  10758. fiddly.
  10759. First some terminology:
  10760. @table @dfn
  10761. @item server
  10762. This is the machine that is connected to the outside world and where you
  10763. get news and/or mail from.
  10764. @item home machine
  10765. This is the machine that you want to do the actual reading and responding
  10766. on. It is typically not connected to the rest of the world in any way.
  10767. @item packet
  10768. Something that contains messages and/or commands. There are two kinds
  10769. of packets:
  10770. @table @dfn
  10771. @item message packets
  10772. These are packets made at the server, and typically contain lots of
  10773. messages for you to read. These are called @file{SoupoutX.tgz} by
  10774. default, where @var{x} is a number.
  10775. @item response packets
  10776. These are packets made at the home machine, and typically contains
  10777. replies that you've written. These are called @file{SoupinX.tgz} by
  10778. default, where @var{x} is a number.
  10779. @end table
  10780. @end table
  10781. @enumerate
  10782. @item
  10783. You log in on the server and create a @sc{soup} packet. You can either
  10784. use a dedicated @sc{soup} thingie (like the @code{awk} program), or you
  10785. can use Gnus to create the packet with its @sc{soup} commands (@kbd{O
  10786. s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).
  10787. @item
  10788. You transfer the packet home. Rail, boat, car or modem will do fine.
  10789. @item
  10790. You put the packet in your home directory.
  10791. @item
  10792. You fire up Gnus on your home machine using the @code{nnsoup} back end as
  10793. the native or secondary server.
  10794. @item
  10795. You read articles and mail and answer and followup to the things you
  10796. want (@pxref{SOUP Replies}).
  10797. @item
  10798. You do the @kbd{G s r} command to pack these replies into a @sc{soup}
  10799. packet.
  10800. @item
  10801. You transfer this packet to the server.
  10802. @item
  10803. You use Gnus to mail this packet out with the @kbd{G s s} command.
  10804. @item
  10805. You then repeat until you die.
  10806. @end enumerate
  10807. So you basically have a bipartite system---you use @code{nnsoup} for
  10808. reading and Gnus for packing/sending these @sc{soup} packets.
  10809. @menu
  10810. * SOUP Commands:: Commands for creating and sending @sc{soup} packets
  10811. * SOUP Groups:: A back end for reading @sc{soup} packets.
  10812. * SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.
  10813. @end menu
  10814. @node SOUP Commands
  10815. @subsubsection SOUP Commands
  10816. These are commands for creating and manipulating @sc{soup} packets.
  10817. @table @kbd
  10818. @item G s b
  10819. @kindex G s b @r{(Group)}
  10820. @findex gnus-group-brew-soup
  10821. Pack all unread articles in the current group
  10822. (@code{gnus-group-brew-soup}). This command understands the
  10823. process/prefix convention.
  10824. @item G s w
  10825. @kindex G s w @r{(Group)}
  10826. @findex gnus-soup-save-areas
  10827. Save all @sc{soup} data files (@code{gnus-soup-save-areas}).
  10828. @item G s s
  10829. @kindex G s s @r{(Group)}
  10830. @findex gnus-soup-send-replies
  10831. Send all replies from the replies packet
  10832. (@code{gnus-soup-send-replies}).
  10833. @item G s p
  10834. @kindex G s p @r{(Group)}
  10835. @findex gnus-soup-pack-packet
  10836. Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}).
  10837. @item G s r
  10838. @kindex G s r @r{(Group)}
  10839. @findex nnsoup-pack-replies
  10840. Pack all replies into a replies packet (@code{nnsoup-pack-replies}).
  10841. @item O s
  10842. @kindex O s @r{(Summary)}
  10843. @findex gnus-soup-add-article
  10844. This summary-mode command adds the current article to a @sc{soup} packet
  10845. (@code{gnus-soup-add-article}). It understands the process/prefix
  10846. convention (@pxref{Process/Prefix}).
  10847. @end table
  10848. There are a few variables to customize where Gnus will put all these
  10849. thingies:
  10850. @table @code
  10851. @item gnus-soup-directory
  10852. @vindex gnus-soup-directory
  10853. Directory where Gnus will save intermediate files while composing
  10854. @sc{soup} packets. The default is @file{~/SoupBrew/}.
  10855. @item gnus-soup-replies-directory
  10856. @vindex gnus-soup-replies-directory
  10857. This is what Gnus will use as a temporary directory while sending our
  10858. reply packets. @file{~/SoupBrew/SoupReplies/} is the default.
  10859. @item gnus-soup-prefix-file
  10860. @vindex gnus-soup-prefix-file
  10861. Name of the file where Gnus stores the last used prefix. The default is
  10862. @samp{gnus-prefix}.
  10863. @item gnus-soup-packer
  10864. @vindex gnus-soup-packer
  10865. A format string command for packing a @sc{soup} packet. The default is
  10866. @samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}.
  10867. @item gnus-soup-unpacker
  10868. @vindex gnus-soup-unpacker
  10869. Format string command for unpacking a @sc{soup} packet. The default is
  10870. @samp{gunzip -c %s | tar xvf -}.
  10871. @item gnus-soup-packet-directory
  10872. @vindex gnus-soup-packet-directory
  10873. Where Gnus will look for reply packets. The default is @file{~/}.
  10874. @item gnus-soup-packet-regexp
  10875. @vindex gnus-soup-packet-regexp
  10876. Regular expression matching @sc{soup} reply packets in
  10877. @code{gnus-soup-packet-directory}.
  10878. @end table
  10879. @node SOUP Groups
  10880. @subsubsection @sc{soup} Groups
  10881. @cindex nnsoup
  10882. @code{nnsoup} is the back end for reading @sc{soup} packets. It will
  10883. read incoming packets, unpack them, and put them in a directory where
  10884. you can read them at leisure.
  10885. These are the variables you can use to customize its behavior:
  10886. @table @code
  10887. @item nnsoup-tmp-directory
  10888. @vindex nnsoup-tmp-directory
  10889. When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
  10890. directory. (@file{/tmp/} by default.)
  10891. @item nnsoup-directory
  10892. @vindex nnsoup-directory
  10893. @code{nnsoup} then moves each message and index file to this directory.
  10894. The default is @file{~/SOUP/}.
  10895. @item nnsoup-replies-directory
  10896. @vindex nnsoup-replies-directory
  10897. All replies will be stored in this directory before being packed into a
  10898. reply packet. The default is @file{~/SOUP/replies/"}.
  10899. @item nnsoup-replies-format-type
  10900. @vindex nnsoup-replies-format-type
  10901. The @sc{soup} format of the replies packets. The default is @samp{?n}
  10902. (rnews), and I don't think you should touch that variable. I probably
  10903. shouldn't even have documented it. Drats! Too late!
  10904. @item nnsoup-replies-index-type
  10905. @vindex nnsoup-replies-index-type
  10906. The index type of the replies packet. The default is @samp{?n}, which
  10907. means ``none''. Don't fiddle with this one either!
  10908. @item nnsoup-active-file
  10909. @vindex nnsoup-active-file
  10910. Where @code{nnsoup} stores lots of information. This is not an ``active
  10911. file'' in the @code{nntp} sense; it's an Emacs Lisp file. If you lose
  10912. this file or mess it up in any way, you're dead. The default is
  10913. @file{~/SOUP/active}.
  10914. @item nnsoup-packer
  10915. @vindex nnsoup-packer
  10916. Format string command for packing a reply @sc{soup} packet. The default
  10917. is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}.
  10918. @item nnsoup-unpacker
  10919. @vindex nnsoup-unpacker
  10920. Format string command for unpacking incoming @sc{soup} packets. The
  10921. default is @samp{gunzip -c %s | tar xvf -}.
  10922. @item nnsoup-packet-directory
  10923. @vindex nnsoup-packet-directory
  10924. Where @code{nnsoup} will look for incoming packets. The default is
  10925. @file{~/}.
  10926. @item nnsoup-packet-regexp
  10927. @vindex nnsoup-packet-regexp
  10928. Regular expression matching incoming @sc{soup} packets. The default is
  10929. @samp{Soupout}.
  10930. @item nnsoup-always-save
  10931. @vindex nnsoup-always-save
  10932. If non-@code{nil}, save the replies buffer after each posted message.
  10933. @end table
  10934. @node SOUP Replies
  10935. @subsubsection SOUP Replies
  10936. Just using @code{nnsoup} won't mean that your postings and mailings end
  10937. up in @sc{soup} reply packets automagically. You have to work a bit
  10938. more for that to happen.
  10939. @findex nnsoup-set-variables
  10940. The @code{nnsoup-set-variables} command will set the appropriate
  10941. variables to ensure that all your followups and replies end up in the
  10942. @sc{soup} system.
  10943. In specific, this is what it does:
  10944. @lisp
  10945. (setq message-send-news-function 'nnsoup-request-post)
  10946. (setq message-send-mail-function 'nnsoup-request-mail)
  10947. @end lisp
  10948. And that's it, really. If you only want news to go into the @sc{soup}
  10949. system you just use the first line. If you only want mail to be
  10950. @sc{soup}ed you use the second.
  10951. @node Mail-To-News Gateways
  10952. @subsection Mail-To-News Gateways
  10953. @cindex mail-to-news gateways
  10954. @cindex gateways
  10955. If your local @code{nntp} server doesn't allow posting, for some reason
  10956. or other, you can post using one of the numerous mail-to-news gateways.
  10957. The @code{nngateway} back end provides the interface.
  10958. Note that you can't read anything from this back end---it can only be
  10959. used to post with.
  10960. Server variables:
  10961. @table @code
  10962. @item nngateway-address
  10963. @vindex nngateway-address
  10964. This is the address of the mail-to-news gateway.
  10965. @item nngateway-header-transformation
  10966. @vindex nngateway-header-transformation
  10967. News headers often have to be transformed in some odd way or other
  10968. for the mail-to-news gateway to accept it. This variable says what
  10969. transformation should be called, and defaults to
  10970. @code{nngateway-simple-header-transformation}. The function is called
  10971. narrowed to the headers to be transformed and with one parameter---the
  10972. gateway address.
  10973. This default function just inserts a new @code{To} header based on the
  10974. @code{Newsgroups} header and the gateway address.
  10975. For instance, an article with this @code{Newsgroups} header:
  10976. @example
  10977. Newsgroups: alt.religion.emacs
  10978. @end example
  10979. will get this @code{From} header inserted:
  10980. @example
  10981. To: alt-religion-emacs@@GATEWAY
  10982. @end example
  10983. The following pre-defined functions exist:
  10984. @findex nngateway-simple-header-transformation
  10985. @table @code
  10986. @item nngateway-simple-header-transformation
  10987. Creates a @code{To} header that looks like
  10988. @var{newsgroup}@@@code{nngateway-address}.
  10989. @findex nngateway-mail2news-header-transformation
  10990. @item nngateway-mail2news-header-transformation
  10991. Creates a @code{To} header that looks like
  10992. @code{nngateway-address}.
  10993. Here's an example:
  10994. @lisp
  10995. (setq gnus-post-method
  10996. '(nngateway
  10997. "mail2news@@replay.com"
  10998. (nngateway-header-transformation
  10999. nngateway-mail2news-header-transformation)))
  11000. @end lisp
  11001. @end table
  11002. @end table
  11003. So, to use this, simply say something like:
  11004. @lisp
  11005. (setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
  11006. @end lisp
  11007. @node IMAP
  11008. @subsection @sc{imap}
  11009. @cindex nnimap
  11010. @cindex @sc{imap}
  11011. @sc{imap} is a network protocol for reading mail (or news, or@dots{}),
  11012. think of it as a modernized @sc{nntp}. Connecting to a @sc{imap}
  11013. server is much similar to connecting to a news server, you just
  11014. specify the network address of the server.
  11015. @sc{imap} has two properties. First, @sc{imap} can do everything that
  11016. POP can, it can hence be viewed as POP++. Secondly, @sc{imap} is a
  11017. mail storage protocol, similar to @sc{nntp} being a news storage
  11018. protocol. (@sc{imap} offers more features than @sc{nntp} because news
  11019. is more or less read-only whereas mail is read-write.)
  11020. If you want to use @sc{imap} as POP++, use an imap entry in
  11021. mail-sources. With this, Gnus will fetch mails from the @sc{imap}
  11022. server and store them on the local disk. This is not the usage
  11023. described in this section. @xref{Mail Sources}.
  11024. If you want to use @sc{imap} as a mail storage protocol, use an nnimap
  11025. entry in gnus-secondary-select-methods. With this, Gnus will
  11026. manipulate mails stored on the @sc{imap} server. This is the kind of
  11027. usage explained in this section.
  11028. A server configuration in @code{~/.gnus} with a few @sc{imap} servers
  11029. might look something like this:
  11030. @lisp
  11031. (setq gnus-secondary-select-methods
  11032. '((nnimap "simpleserver") ; no special configuration
  11033. ; perhaps a ssh port forwarded server:
  11034. (nnimap "dolk"
  11035. (nnimap-address "localhost")
  11036. (nnimap-server-port 1430))
  11037. ; a UW server running on localhost
  11038. (nnimap "barbar"
  11039. (nnimap-server-port 143)
  11040. (nnimap-address "localhost")
  11041. (nnimap-list-pattern ("INBOX" "mail/*")))
  11042. ; anonymous public cyrus server:
  11043. (nnimap "cyrus.andrew.cmu.edu"
  11044. (nnimap-authenticator anonymous)
  11045. (nnimap-list-pattern "archive.*")
  11046. (nnimap-stream network))
  11047. ; a ssl server on a non-standard port:
  11048. (nnimap "vic20"
  11049. (nnimap-address "vic20.somewhere.com")
  11050. (nnimap-server-port 9930)
  11051. (nnimap-stream ssl))))
  11052. @end lisp
  11053. The following variables can be used to create a virtual @code{nnimap}
  11054. server:
  11055. @table @code
  11056. @item nnimap-address
  11057. @vindex nnimap-address
  11058. The address of the remote @sc{imap} server. Defaults to the virtual
  11059. server name if not specified.
  11060. @item nnimap-server-port
  11061. @vindex nnimap-server-port
  11062. Port on server to contact. Defaults to port 143, or 993 for SSL.
  11063. Note that this should be a integer, example server specification:
  11064. @lisp
  11065. (nnimap "mail.server.com"
  11066. (nnimap-server-port 4711))
  11067. @end lisp
  11068. @item nnimap-list-pattern
  11069. @vindex nnimap-list-pattern
  11070. String or list of strings of mailboxes to limit available groups to.
  11071. This is used when the server has very many mailboxes and you're only
  11072. interested in a few -- some servers export your home directory via
  11073. @sc{imap}, you'll probably want to limit the mailboxes to those in
  11074. @file{~/Mail/*} then.
  11075. The string can also be a cons of REFERENCE and the string as above, what
  11076. REFERENCE is used for is server specific, but on the University of
  11077. Washington server it's a directory that will be concatenated with the
  11078. mailbox.
  11079. Example server specification:
  11080. @lisp
  11081. (nnimap "mail.server.com"
  11082. (nnimap-list-pattern ("INBOX" "Mail/*" "alt.sex.*"
  11083. ("~friend/Mail/" . "list/*"))))
  11084. @end lisp
  11085. @item nnimap-stream
  11086. @vindex nnimap-stream
  11087. The type of stream used to connect to your server. By default, nnimap
  11088. will detect and automatically use all of the below, with the exception
  11089. of SSL. (SSL is being replaced by STARTTLS, which can be automatically
  11090. detected, but it's not widely deployed yet).
  11091. Example server specification:
  11092. @lisp
  11093. (nnimap "mail.server.com"
  11094. (nnimap-stream ssl))
  11095. @end lisp
  11096. Please note that the value of @code{nnimap-stream} is a symbol!
  11097. @itemize @bullet
  11098. @item
  11099. @dfn{gssapi:} Connect with GSSAPI (usually Kerberos 5). Requires the
  11100. @command{imtest} program.
  11101. @item
  11102. @dfn{kerberos4:} Connect with Kerberos 4. Requires the
  11103. @command{imtest} program.
  11104. @item
  11105. @dfn{starttls:} Connect via the STARTTLS extension (similar to
  11106. SSL)@. Requires the library @file{starttls.el} and program
  11107. @command{starttls}.
  11108. @item
  11109. @dfn{ssl:} Connect through SSL@. Requires OpenSSL (the
  11110. program @command{openssl}) or SSLeay (@command{s_client}).
  11111. @item
  11112. @dfn{shell:} Use a shell command to start an @sc{imap} connection.
  11113. @item
  11114. @dfn{network:} Plain, TCP/IP network connection.
  11115. @end itemize
  11116. @vindex imap-kerberos4-program
  11117. The @command{imtest} program is shipped with Cyrus IMAPD@. Nnimap supports
  11118. both @command{imtest} version 1.5.x and version 1.6.x. The variable
  11119. @code{imap-kerberos4-program} contains parameters to pass to the
  11120. @command{imtest} program.
  11121. @vindex imap-ssl-program
  11122. For SSL connections, the OpenSSL program is available from
  11123. @uref{http://www.openssl.org/}. OpenSSL was formerly known as SSLeay,
  11124. and nnimap supports it too. However, the most recent versions of
  11125. SSLeay, 0.9.x, are known to have serious bugs making it
  11126. useless. Earlier versions, especially 0.8.x, of SSLeay are known to
  11127. work. The variable @code{imap-ssl-program} contains parameters to pass
  11128. to OpenSSL/SSLeay.
  11129. @vindex imap-shell-program
  11130. @vindex imap-shell-host
  11131. For @sc{imap} connections using the @code{shell} stream, the variable
  11132. @code{imap-shell-program} specifies what program to call.
  11133. @item nnimap-authenticator
  11134. @vindex nnimap-authenticator
  11135. The authenticator used to connect to the server. By default, nnimap
  11136. will use the most secure authenticator your server supports.
  11137. Example server specification:
  11138. @lisp
  11139. (nnimap "mail.server.com"
  11140. (nnimap-authenticator anonymous))
  11141. @end lisp
  11142. Please note that the value of @code{nnimap-authenticator} is a symbol!
  11143. @itemize @bullet
  11144. @item
  11145. @dfn{gssapi:} GSSAPI (usually Kerberos 5) authentication. Requires the
  11146. external program @command{imtest}.
  11147. @item
  11148. @dfn{kerberos4:} Kerberos authentication. Requires the external program
  11149. @command{imtest}.
  11150. @item
  11151. @dfn{digest-md5:} Encrypted username/password via DIGEST-MD5@. Requires
  11152. external library @command{digest-md5.el}.
  11153. @item
  11154. @dfn{cram-md5:} Encrypted username/password via CRAM-MD5.
  11155. @item
  11156. @dfn{login:} Plain-text username/password via LOGIN.
  11157. @item
  11158. @dfn{anonymous:} Login as `anonymous', supplying your email address as
  11159. password.
  11160. @end itemize
  11161. @item nnimap-expunge-on-close
  11162. @cindex Expunging
  11163. @vindex nnimap-expunge-on-close
  11164. Unlike Parmenides, the @sc{imap} designers decided that things that
  11165. don't exist actually do exist. More specifically, @sc{imap} has
  11166. the concept of marking articles @code{Deleted} which doesn't actually
  11167. delete them, and this (marking them @code{Deleted}, that is) is what
  11168. nnimap does when you delete a article in Gnus (with @kbd{G @key{DEL}} or
  11169. similar).
  11170. Since the articles aren't really removed when we mark them with the
  11171. @code{Deleted} flag we'll need a way to actually delete them. Feel like
  11172. running in circles yet?
  11173. Traditionally, nnimap has removed all articles marked as @code{Deleted}
  11174. when closing a mailbox but this is now configurable by this server
  11175. variable.
  11176. The possible options are:
  11177. @table @code
  11178. @item always
  11179. The default behavior, delete all articles marked as "Deleted" when
  11180. closing a mailbox.
  11181. @item never
  11182. Never actually delete articles. Currently there is no way of showing
  11183. the articles marked for deletion in nnimap, but other @sc{imap} clients
  11184. may allow you to do this. If you ever want to run the EXPUNGE command
  11185. manually, @xref{Expunging mailboxes}.
  11186. @item ask
  11187. When closing mailboxes, nnimap will ask if you wish to expunge deleted
  11188. articles or not.
  11189. @end table
  11190. @item nnimap-authinfo-file
  11191. @vindex nnimap-authinfo-file
  11192. A file containing credentials used to log in on servers. The format
  11193. is (almost) the same as the @code{ftp} @file{~/.netrc} file. See
  11194. `nntp-authinfo-file' for exact syntax.
  11195. A file containing credentials used to log in on servers. The format is
  11196. (almost) the same as the @code{ftp} @file{~/.netrc} file. See the
  11197. variable @code{nntp-authinfo-file} for exact syntax; also see
  11198. @xref{NNTP}.
  11199. @end table
  11200. @menu
  11201. * Splitting in IMAP:: Splitting mail with nnimap.
  11202. * Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.
  11203. * Expunging mailboxes:: Equivalent of a "compress mailbox" button.
  11204. @end menu
  11205. @node Splitting in IMAP
  11206. @subsubsection Splitting in @sc{imap}
  11207. @cindex splitting imap mail
  11208. Splitting is something Gnus users have loved and used for years, and now
  11209. the rest of the world is catching up. Yeah, dream on; not many
  11210. @sc{imap} servers have server side splitting and those that have splitting
  11211. seem to use some non-standard protocol. This means that @sc{imap}
  11212. support for Gnus has to do its own splitting.
  11213. And it does.
  11214. Here are the variables of interest:
  11215. @table @code
  11216. @item nnimap-split-crosspost
  11217. @cindex splitting, crosspost
  11218. @cindex crosspost
  11219. @vindex nnimap-split-crosspost
  11220. If non-nil, do crossposting if several split methods match the mail. If
  11221. nil, the first match in @code{nnimap-split-rule} found will be used.
  11222. Nnmail equivalent: @code{nnmail-crosspost}.
  11223. @item nnimap-split-inbox
  11224. @cindex splitting, inbox
  11225. @cindex inbox
  11226. @vindex nnimap-split-inbox
  11227. A string or a list of strings that gives the name(s) of @sc{imap}
  11228. mailboxes to split from. Defaults to @code{nil}, which means that
  11229. splitting is disabled!
  11230. @lisp
  11231. (setq nnimap-split-inbox
  11232. '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap"))
  11233. @end lisp
  11234. No nnmail equivalent.
  11235. @item nnimap-split-rule
  11236. @cindex Splitting, rules
  11237. @vindex nnimap-split-rule
  11238. New mail found in @code{nnimap-split-inbox} will be split according to
  11239. this variable.
  11240. This variable contains a list of lists, where the first element in the
  11241. sublist gives the name of the @sc{imap} mailbox to move articles
  11242. matching the regexp in the second element in the sublist. Got that?
  11243. Neither did I, we need examples.
  11244. @lisp
  11245. (setq nnimap-split-rule
  11246. '(("INBOX.nnimap"
  11247. "^Sender: owner-nnimap@@vic20.globalcom.se")
  11248. ("INBOX.junk" "^Subject:.*MAKE MONEY")
  11249. ("INBOX.private" "")))
  11250. @end lisp
  11251. This will put all articles from the nnimap mailing list into mailbox
  11252. INBOX.nnimap, all articles containing MAKE MONEY in the Subject: line
  11253. into INBOX.spam and everything else in INBOX.private.
  11254. The first string may contain @samp{\\@var{digit}} forms, like the ones used by
  11255. replace-match to insert sub-expressions from the matched text. For
  11256. instance:
  11257. @lisp
  11258. ("INBOX.lists.\\1" "^Sender: owner-\\([a-z-]+\\)@@")
  11259. @end lisp
  11260. The second element can also be a function. In that case, it will be
  11261. called with the first element of the rule as the argument, in a buffer
  11262. containing the headers of the article. It should return a non-nil value
  11263. if it thinks that the mail belongs in that group.
  11264. Nnmail users might recollect that the last regexp had to be empty to
  11265. match all articles (like in the example above). This is not required in
  11266. nnimap. Articles not matching any of the regexps will not be moved out
  11267. of your inbox. (This might affect performance if you keep lots of
  11268. unread articles in your inbox, since the splitting code would go over
  11269. them every time you fetch new mail.)
  11270. These rules are processed from the beginning of the alist toward the
  11271. end. The first rule to make a match will `win', unless you have
  11272. crossposting enabled. In that case, all matching rules will `win'.
  11273. This variable can also have a function as its value, the function will
  11274. be called with the headers narrowed and should return a group to where
  11275. it thinks the article should be split. See @code{nnimap-split-fancy}.
  11276. The splitting code tries to create mailboxes if it needs too.
  11277. To allow for different split rules on different virtual servers, and
  11278. even different split rules in different inboxes on the same server,
  11279. the syntax of this variable has been extended along the lines of:
  11280. @lisp
  11281. (setq nnimap-split-rule
  11282. '(("my1server" (".*" (("ding" "ding@@gnus.org")
  11283. ("junk" "From:.*Simon")))
  11284. ("my2server" ("INBOX" nnimap-split-fancy))
  11285. ("my[34]server" (".*" (("private" "To:.*Simon")
  11286. ("junk" my-junk-func)))))
  11287. @end lisp
  11288. The virtual server name is in fact a regexp, so that the same rules
  11289. may apply to several servers. In the example, the servers
  11290. @code{my3server} and @code{my4server} both use the same rules.
  11291. Similarly, the inbox string is also a regexp. The actual splitting
  11292. rules are as before, either a function, or a list with group/regexp or
  11293. group/function elements.
  11294. Nnmail equivalent: @code{nnmail-split-methods}.
  11295. @item nnimap-split-predicate
  11296. @cindex splitting
  11297. @vindex nnimap-split-predicate
  11298. Mail matching this predicate in @code{nnimap-split-inbox} will be
  11299. split; it is a string and the default is @samp{UNSEEN UNDELETED}.
  11300. This might be useful if you use another @sc{imap} client to read mail in
  11301. your inbox but would like Gnus to split all articles in the inbox
  11302. regardless of readedness. Then you might change this to
  11303. @samp{UNDELETED}.
  11304. @item nnimap-split-fancy
  11305. @cindex splitting, fancy
  11306. @findex nnimap-split-fancy
  11307. @vindex nnimap-split-fancy
  11308. It's possible to set @code{nnimap-split-rule} to
  11309. @code{nnmail-split-fancy} if you want to use fancy
  11310. splitting. @xref{Fancy Mail Splitting}.
  11311. However, to be able to have different fancy split rules for nnmail and
  11312. nnimap back ends you can set @code{nnimap-split-rule} to
  11313. @code{nnimap-split-fancy} and define the nnimap specific fancy split
  11314. rule in @code{nnimap-split-fancy}.
  11315. Example:
  11316. @lisp
  11317. (setq nnimap-split-rule 'nnimap-split-fancy
  11318. nnimap-split-fancy ...)
  11319. @end lisp
  11320. Nnmail equivalent: @code{nnmail-split-fancy}.
  11321. @end table
  11322. @node Editing IMAP ACLs
  11323. @subsubsection Editing @sc{imap} ACLs
  11324. @cindex editing imap acls
  11325. @cindex Access Control Lists
  11326. @cindex Editing @sc{imap} ACLs
  11327. @kindex G l
  11328. @findex gnus-group-nnimap-edit-acl
  11329. ACL stands for Access Control List. ACLs are used in @sc{imap} for
  11330. limiting (or enabling) other users access to your mail boxes. Not all
  11331. @sc{imap} servers support this, this function will give an error if it
  11332. doesn't.
  11333. To edit a ACL for a mailbox, type @kbd{G l}
  11334. (@code{gnus-group-edit-nnimap-acl}) and you'll be presented with a ACL
  11335. editing window with detailed instructions.
  11336. Some possible uses:
  11337. @itemize @bullet
  11338. @item
  11339. Giving "anyone" the "lrs" rights (lookup, read, keep seen/unseen flags)
  11340. on your mailing list mailboxes enables other users on the same server to
  11341. follow the list without subscribing to it.
  11342. @item
  11343. At least with the Cyrus server, you are required to give the user
  11344. "anyone" posting ("p") capabilities to have "plussing" work (that is,
  11345. mail sent to user+mailbox@@domain ending up in the @sc{imap} mailbox
  11346. INBOX.mailbox).
  11347. @end itemize
  11348. @node Expunging mailboxes
  11349. @subsubsection Expunging mailboxes
  11350. @cindex expunging
  11351. @cindex Expunge
  11352. @cindex Manual expunging
  11353. @kindex G x
  11354. @findex gnus-group-nnimap-expunge
  11355. If you're using the @code{never} setting of @code{nnimap-expunge-close},
  11356. you may want the option of expunging all deleted articles in a mailbox
  11357. manually. This is exactly what @kbd{G x} does.
  11358. Currently there is no way of showing deleted articles, you can just
  11359. delete them.
  11360. @node Combined Groups
  11361. @section Combined Groups
  11362. Gnus allows combining a mixture of all the other group types into bigger
  11363. groups.
  11364. @menu
  11365. * Virtual Groups:: Combining articles from many groups.
  11366. * Kibozed Groups:: Looking through parts of the newsfeed for articles.
  11367. @end menu
  11368. @node Virtual Groups
  11369. @subsection Virtual Groups
  11370. @cindex nnvirtual
  11371. @cindex virtual groups
  11372. @cindex merging groups
  11373. An @dfn{nnvirtual group} is really nothing more than a collection of
  11374. other groups.
  11375. For instance, if you are tired of reading many small groups, you can
  11376. put them all in one big group, and then grow tired of reading one
  11377. big, unwieldy group. The joys of computing!
  11378. You specify @code{nnvirtual} as the method. The address should be a
  11379. regexp to match component groups.
  11380. All marks in the virtual group will stick to the articles in the
  11381. component groups. So if you tick an article in a virtual group, the
  11382. article will also be ticked in the component group from whence it came.
  11383. (And vice versa---marks from the component groups will also be shown in
  11384. the virtual group.)
  11385. Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
  11386. newsgroups into one, big, happy newsgroup:
  11387. @lisp
  11388. (nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
  11389. @end lisp
  11390. The component groups can be native or foreign; everything should work
  11391. smoothly, but if your computer explodes, it was probably my fault.
  11392. Collecting the same group from several servers might actually be a good
  11393. idea if users have set the Distribution header to limit distribution.
  11394. If you would like to read @samp{soc.motss} both from a server in Japan
  11395. and a server in Norway, you could use the following as the group regexp:
  11396. @example
  11397. "^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$"
  11398. @end example
  11399. (Remember, though, that if you're creating the group with @kbd{G m}, you
  11400. shouldn't double the backslashes, and you should leave off the quote
  11401. characters at the beginning and the end of the string.)
  11402. This should work kinda smoothly---all articles from both groups should
  11403. end up in this one, and there should be no duplicates. Threading (and
  11404. the rest) will still work as usual, but there might be problems with the
  11405. sequence of articles. Sorting on date might be an option here
  11406. (@pxref{Selecting a Group}).
  11407. One limitation, however---all groups included in a virtual
  11408. group have to be alive (i.e., subscribed or unsubscribed). Killed or
  11409. zombie groups can't be component groups for @code{nnvirtual} groups.
  11410. @vindex nnvirtual-always-rescan
  11411. If the @code{nnvirtual-always-rescan} is non-@code{nil},
  11412. @code{nnvirtual} will always scan groups for unread articles when
  11413. entering a virtual group. If this variable is @code{nil} (which is the
  11414. default) and you read articles in a component group after the virtual
  11415. group has been activated, the read articles from the component group
  11416. will show up when you enter the virtual group. You'll also see this
  11417. effect if you have two virtual groups that have a component group in
  11418. common. If that's the case, you should set this variable to @code{t}.
  11419. Or you can just tap @code{M-g} on the virtual group every time before
  11420. you enter it---it'll have much the same effect.
  11421. @code{nnvirtual} can have both mail and news groups as component groups.
  11422. When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
  11423. has to ask the back end of the component group the article comes from
  11424. whether it is a news or mail back end. However, when you do a @kbd{^},
  11425. there is typically no sure way for the component back end to know this,
  11426. and in that case @code{nnvirtual} tells Gnus that the article came from a
  11427. not-news back end. (Just to be on the safe side.)
  11428. @kbd{C-c C-t} in the message buffer will insert the @code{Newsgroups}
  11429. line from the article you respond to in these cases.
  11430. @node Kibozed Groups
  11431. @subsection Kibozed Groups
  11432. @cindex nnkiboze
  11433. @cindex kibozing
  11434. @dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of)
  11435. the news feed''. @code{nnkiboze} is a back end that will do this for
  11436. you. Oh joy! Now you can grind any @sc{nntp} server down to a halt
  11437. with useless requests! Oh happiness!
  11438. @kindex G k @r{(Group)}
  11439. To create a kibozed group, use the @kbd{G k} command in the group
  11440. buffer.
  11441. The address field of the @code{nnkiboze} method is, as with
  11442. @code{nnvirtual}, a regexp to match groups to be ``included'' in the
  11443. @code{nnkiboze} group. That's where most similarities between @code{nnkiboze}
  11444. and @code{nnvirtual} end.
  11445. In addition to this regexp detailing component groups, an @code{nnkiboze} group
  11446. must have a score file to say what articles are to be included in
  11447. the group (@pxref{Scoring}).
  11448. @kindex M-x nnkiboze-generate-groups
  11449. @findex nnkiboze-generate-groups
  11450. You must run @kbd{M-x nnkiboze-generate-groups} after creating the
  11451. @code{nnkiboze} groups you want to have. This command will take time. Lots of
  11452. time. Oodles and oodles of time. Gnus has to fetch the headers from
  11453. all the articles in all the component groups and run them through the
  11454. scoring process to determine if there are any articles in the groups
  11455. that are to be part of the @code{nnkiboze} groups.
  11456. Please limit the number of component groups by using restrictive
  11457. regexps. Otherwise your sysadmin may become annoyed with you, and the
  11458. @sc{nntp} site may throw you off and never let you back in again.
  11459. Stranger things have happened.
  11460. @code{nnkiboze} component groups do not have to be alive---they can be dead,
  11461. and they can be foreign. No restrictions.
  11462. @vindex nnkiboze-directory
  11463. The generation of an @code{nnkiboze} group means writing two files in
  11464. @code{nnkiboze-directory}, which is @file{~/News/} by default. One
  11465. contains the @sc{nov} header lines for all the articles in the group,
  11466. and the other is an additional @file{.newsrc} file to store information
  11467. on what groups have been searched through to find component articles.
  11468. Articles marked as read in the @code{nnkiboze} group will have
  11469. their @sc{nov} lines removed from the @sc{nov} file.
  11470. @node Gnus Unplugged
  11471. @section Gnus Unplugged
  11472. @cindex offline
  11473. @cindex unplugged
  11474. @cindex Agent
  11475. @cindex Gnus Agent
  11476. @cindex Gnus Unplugged
  11477. In olden times (ca. February '88), people used to run their newsreaders
  11478. on big machines with permanent connections to the net. News transport
  11479. was dealt with by news servers, and all the newsreaders had to do was to
  11480. read news. Believe it or not.
  11481. Nowadays most people read news and mail at home, and use some sort of
  11482. modem to connect to the net. To avoid running up huge phone bills, it
  11483. would be nice to have a way to slurp down all the news and mail, hang up
  11484. the phone, read for several hours, and then upload any responses you
  11485. have to make. And then you repeat the procedure.
  11486. Of course, you can use news servers for doing this as well. I've used
  11487. @code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}
  11488. for some years, but doing that's a bore. Moving the news server
  11489. functionality up to the newsreader makes sense if you're the only person
  11490. reading news on a machine.
  11491. Using Gnus as an ``offline'' newsreader is quite simple.
  11492. @itemize @bullet
  11493. @item
  11494. First, set up Gnus as you would do if you were running it on a machine
  11495. that has full connection to the net. Go ahead. I'll still be waiting
  11496. here.
  11497. @item
  11498. Then, put the following magical incantation at the end of your
  11499. @file{.gnus.el} file:
  11500. @lisp
  11501. (gnus-agentize)
  11502. @end lisp
  11503. @end itemize
  11504. That's it. Gnus is now an ``offline'' newsreader.
  11505. Of course, to use it as such, you have to learn a few new commands.
  11506. @menu
  11507. * Agent Basics:: How it all is supposed to work.
  11508. * Agent Categories:: How to tell the Gnus Agent what to download.
  11509. * Agent Commands:: New commands for all the buffers.
  11510. * Agent Expiry:: How to make old articles go away.
  11511. * Agent and IMAP:: How to use the Agent with IMAP.
  11512. * Outgoing Messages:: What happens when you post/mail something?
  11513. * Agent Variables:: Customizing is fun.
  11514. * Example Setup:: An example @file{.gnus.el} file for offline people.
  11515. * Batching Agents:: How to fetch news from a @code{cron} job.
  11516. * Agent Caveats:: What you think it'll do and what it does.
  11517. @end menu
  11518. @node Agent Basics
  11519. @subsection Agent Basics
  11520. First, let's get some terminology out of the way.
  11521. The Gnus Agent is said to be @dfn{unplugged} when you have severed the
  11522. connection to the net (and notified the Agent that this is the case).
  11523. When the connection to the net is up again (and Gnus knows this), the
  11524. Agent is @dfn{plugged}.
  11525. The @dfn{local} machine is the one you're running on, and which isn't
  11526. connected to the net continuously.
  11527. @dfn{Downloading} means fetching things from the net to your local
  11528. machine. @dfn{Uploading} is doing the opposite.
  11529. Let's take a typical Gnus session using the Agent.
  11530. @itemize @bullet
  11531. @item
  11532. You start Gnus with @code{gnus-unplugged}. This brings up the Gnus
  11533. Agent in a disconnected state. You can read all the news that you have
  11534. already fetched while in this mode.
  11535. @item
  11536. You then decide to see whether any new news has arrived. You connect
  11537. your machine to the net (using PPP or whatever), and then hit @kbd{J j}
  11538. to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mail
  11539. as usual. To check for new mail in unplugged mode, see (@pxref{Mail
  11540. Source Specifiers}).
  11541. @item
  11542. You can then read the new news immediately, or you can download the news
  11543. onto your local machine. If you want to do the latter, you press @kbd{g}
  11544. to check if there are any new news and then @kbd{J
  11545. s} to fetch all the eligible articles in all the groups. (To let Gnus
  11546. know which articles you want to download, @pxref{Agent Categories}.)
  11547. @item
  11548. After fetching the articles, you press @kbd{J j} to make Gnus become
  11549. unplugged again, and you shut down the PPP thing (or whatever). And
  11550. then you read the news offline.
  11551. @item
  11552. And then you go to step 2.
  11553. @end itemize
  11554. Here are some things you should do the first time (or so) that you use
  11555. the Agent.
  11556. @itemize @bullet
  11557. @item
  11558. Decide which servers should be covered by the Agent. If you have a mail
  11559. back end, it would probably be nonsensical to have it covered by the
  11560. Agent. Go to the server buffer (@kbd{^} in the group buffer) and press
  11561. @kbd{J a} the server (or servers) that you wish to have covered by the
  11562. Agent (@pxref{Server Agent Commands}). This will typically be only the
  11563. primary select method, which is listed on the bottom in the buffer.
  11564. @item
  11565. Decide on download policy. @xref{Agent Categories}.
  11566. @item
  11567. Uhm... that's it.
  11568. @end itemize
  11569. @node Agent Categories
  11570. @subsection Agent Categories
  11571. One of the main reasons to integrate the news transport layer into the
  11572. newsreader is to allow greater control over what articles to download.
  11573. There's not much point in downloading huge amounts of articles, just to
  11574. find out that you're not interested in reading any of them. It's better
  11575. to be somewhat more conservative in choosing what to download, and then
  11576. mark the articles for downloading manually if it should turn out that
  11577. you're interested in the articles anyway.
  11578. The main way to control what is to be downloaded is to create a
  11579. @dfn{category} and then assign some (or all) groups to this category.
  11580. Groups that do not belong in any other category belong to the
  11581. @code{default} category. Gnus has its own buffer for creating and
  11582. managing categories.
  11583. @menu
  11584. * Category Syntax:: What a category looks like.
  11585. * The Category Buffer:: A buffer for maintaining categories.
  11586. * Category Variables:: Customize'r'Us.
  11587. @end menu
  11588. @node Category Syntax
  11589. @subsubsection Category Syntax
  11590. A category consists of two things.
  11591. @enumerate
  11592. @item
  11593. A predicate which (generally) gives a rough outline of which articles
  11594. are eligible for downloading; and
  11595. @item
  11596. a score rule which (generally) gives you a finer granularity when
  11597. deciding what articles to download. (Note that this @dfn{download
  11598. score} is not necessarily related to normal scores.)
  11599. @end enumerate
  11600. A predicate in its simplest form can be a single predicate such as
  11601. @code{true} or @code{false}. These two will download every available
  11602. article or nothing respectively. In the case of these two special
  11603. predicates an additional score rule is superfluous.
  11604. Predicates of @code{high} or @code{low} download articles in respect of
  11605. their scores in relationship to @code{gnus-agent-high-score} and
  11606. @code{gnus-agent-low-score} as described below.
  11607. To gain even finer control of what is to be regarded eligible for
  11608. download a predicate can consist of a number of predicates with logical
  11609. operators sprinkled in between.
  11610. Perhaps some examples are in order.
  11611. Here's a simple predicate. (It's the default predicate, in fact, used
  11612. for all groups that don't belong to any other category.)
  11613. @lisp
  11614. short
  11615. @end lisp
  11616. Quite simple, eh? This predicate is true if and only if the article is
  11617. short (for some value of ``short'').
  11618. Here's a more complex predicate:
  11619. @lisp
  11620. (or high
  11621. (and
  11622. (not low)
  11623. (not long)))
  11624. @end lisp
  11625. This means that an article should be downloaded if it has a high score,
  11626. or if the score is not low and the article is not long. You get the
  11627. drift.
  11628. The available logical operators are @code{or}, @code{and} and
  11629. @code{not}. (If you prefer, you can use the more ``C''-ish operators
  11630. @samp{|}, @code{&} and @code{!} instead.)
  11631. The following predicates are pre-defined, but if none of these fit what
  11632. you want to do, you can write your own.
  11633. @table @code
  11634. @item short
  11635. True iff the article is shorter than @code{gnus-agent-short-article}
  11636. lines; default 100.
  11637. @item long
  11638. True iff the article is longer than @code{gnus-agent-long-article}
  11639. lines; default 200.
  11640. @item low
  11641. True iff the article has a download score less than
  11642. @code{gnus-agent-low-score}; default 0.
  11643. @item high
  11644. True iff the article has a download score greater than
  11645. @code{gnus-agent-high-score}; default 0.
  11646. @item spam
  11647. True iff the Gnus Agent guesses that the article is spam. The
  11648. heuristics may change over time, but at present it just computes a
  11649. checksum and sees whether articles match.
  11650. @item true
  11651. Always true.
  11652. @item false
  11653. Always false.
  11654. @end table
  11655. If you want to create your own predicate function, here's what you have
  11656. to know: The functions are called with no parameters, but the
  11657. @code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
  11658. useful values.
  11659. For example, you could decide that you don't want to download articles
  11660. that were posted more than a certain number of days ago (e.g. posted
  11661. more than @code{gnus-agent-expire-days} ago) you might write a function
  11662. something along the lines of the following:
  11663. @lisp
  11664. (defun my-article-old-p ()
  11665. "Say whether an article is old."
  11666. (< (time-to-days (date-to-time (mail-header-date gnus-headers)))
  11667. (- (time-to-days (current-time)) gnus-agent-expire-days)))
  11668. @end lisp
  11669. with the predicate then defined as:
  11670. @lisp
  11671. (not my-article-old-p)
  11672. @end lisp
  11673. or you could append your predicate to the predefined
  11674. @code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
  11675. wherever. (Note: this would have to be at a point *after*
  11676. @code{gnus-agent} has been loaded via @code{(gnus-agentize)})
  11677. @lisp
  11678. (setq gnus-category-predicate-alist
  11679. (append gnus-category-predicate-alist
  11680. '((old . my-article-old-p))))
  11681. @end lisp
  11682. and simply specify your predicate as:
  11683. @lisp
  11684. (not old)
  11685. @end lisp
  11686. If/when using something like the above, be aware that there are many
  11687. misconfigured systems/mailers out there and so an article's date is not
  11688. always a reliable indication of when it was posted. Hell, some people
  11689. just don't give a damn.
  11690. The above predicates apply to *all* the groups which belong to the
  11691. category. However, if you wish to have a specific predicate for an
  11692. individual group within a category, or you're just too lazy to set up a
  11693. new category, you can enter a group's individual predicate in it's group
  11694. parameters like so:
  11695. @lisp
  11696. (agent-predicate . short)
  11697. @end lisp
  11698. This is the group parameter equivalent of the agent category default.
  11699. Note that when specifying a single word predicate like this, the
  11700. @code{agent-predicate} specification must be in dotted pair notation.
  11701. The equivalent of the longer example from above would be:
  11702. @lisp
  11703. (agent-predicate or high (and (not low) (not long)))
  11704. @end lisp
  11705. The outer parenthesis required in the category specification are not
  11706. entered here as, not being in dotted pair notation, the value of the
  11707. predicate is assumed to be a list.
  11708. Now, the syntax of the download score is the same as the syntax of
  11709. normal score files, except that all elements that require actually
  11710. seeing the article itself are verboten. This means that only the
  11711. following headers can be scored on: @code{Subject}, @code{From},
  11712. @code{Date}, @code{Message-ID}, @code{References}, @code{Chars},
  11713. @code{Lines}, and @code{Xref}.
  11714. As with predicates, the specification of the @code{download score rule}
  11715. to use in respect of a group can be in either the category definition if
  11716. it's to be applicable to all groups in therein, or a group's parameters
  11717. if it's to be specific to that group.
  11718. In both of these places the @code{download score rule} can take one of
  11719. three forms:
  11720. @enumerate
  11721. @item
  11722. Score rule
  11723. This has the same syntax as a normal gnus score file except only a
  11724. subset of scoring keywords are available as mentioned above.
  11725. example:
  11726. @itemize @bullet
  11727. @item
  11728. Category specification
  11729. @lisp
  11730. (("from"
  11731. ("Lars Ingebrigtsen" 1000000 nil s))
  11732. ("lines"
  11733. (500 -100 nil <)))
  11734. @end lisp
  11735. @item
  11736. Group Parameter specification
  11737. @lisp
  11738. (agent-score ("from"
  11739. ("Lars Ingebrigtsen" 1000000 nil s))
  11740. ("lines"
  11741. (500 -100 nil <)))
  11742. @end lisp
  11743. Again, note the omission of the outermost parenthesis here.
  11744. @end itemize
  11745. @item
  11746. Agent score file
  11747. These score files must *only* contain the permitted scoring keywords
  11748. stated above.
  11749. example:
  11750. @itemize @bullet
  11751. @item
  11752. Category specification
  11753. @lisp
  11754. ("~/News/agent.SCORE")
  11755. @end lisp
  11756. or perhaps
  11757. @lisp
  11758. ("~/News/agent.SCORE" "~/News/agent.group.SCORE")
  11759. @end lisp
  11760. @item
  11761. Group Parameter specification
  11762. @lisp
  11763. (agent-score "~/News/agent.SCORE")
  11764. @end lisp
  11765. Additional score files can be specified as above. Need I say anything
  11766. about parenthesis?
  11767. @end itemize
  11768. @item
  11769. Use @code{normal} score files
  11770. If you don't want to maintain two sets of scoring rules for a group, and
  11771. your desired @code{downloading} criteria for a group are the same as your
  11772. @code{reading} criteria then you can tell the agent to refer to your
  11773. @code{normal} score files when deciding what to download.
  11774. These directives in either the category definition or a group's
  11775. parameters will cause the agent to read in all the applicable score
  11776. files for a group, *filtering out* those sections that do not
  11777. relate to one of the permitted subset of scoring keywords.
  11778. @itemize @bullet
  11779. @item
  11780. Category Specification
  11781. @lisp
  11782. file
  11783. @end lisp
  11784. @item
  11785. Group Parameter specification
  11786. @lisp
  11787. (agent-score . file)
  11788. @end lisp
  11789. @end itemize
  11790. @end enumerate
  11791. @node The Category Buffer
  11792. @subsubsection The Category Buffer
  11793. You'd normally do all category maintenance from the category buffer.
  11794. When you enter it for the first time (with the @kbd{J c} command from
  11795. the group buffer), you'll only see the @code{default} category.
  11796. The following commands are available in this buffer:
  11797. @table @kbd
  11798. @item q
  11799. @kindex q (Category)
  11800. @findex gnus-category-exit
  11801. Return to the group buffer (@code{gnus-category-exit}).
  11802. @item k
  11803. @kindex k (Category)
  11804. @findex gnus-category-kill
  11805. Kill the current category (@code{gnus-category-kill}).
  11806. @item c
  11807. @kindex c (Category)
  11808. @findex gnus-category-copy
  11809. Copy the current category (@code{gnus-category-copy}).
  11810. @item a
  11811. @kindex a (Category)
  11812. @findex gnus-category-add
  11813. Add a new category (@code{gnus-category-add}).
  11814. @item p
  11815. @kindex p (Category)
  11816. @findex gnus-category-edit-predicate
  11817. Edit the predicate of the current category
  11818. (@code{gnus-category-edit-predicate}).
  11819. @item g
  11820. @kindex g (Category)
  11821. @findex gnus-category-edit-groups
  11822. Edit the list of groups belonging to the current category
  11823. (@code{gnus-category-edit-groups}).
  11824. @item s
  11825. @kindex s (Category)
  11826. @findex gnus-category-edit-score
  11827. Edit the download score rule of the current category
  11828. (@code{gnus-category-edit-score}).
  11829. @item l
  11830. @kindex l (Category)
  11831. @findex gnus-category-list
  11832. List all the categories (@code{gnus-category-list}).
  11833. @end table
  11834. @node Category Variables
  11835. @subsubsection Category Variables
  11836. @table @code
  11837. @item gnus-category-mode-hook
  11838. @vindex gnus-category-mode-hook
  11839. Hook run in category buffers.
  11840. @item gnus-category-line-format
  11841. @vindex gnus-category-line-format
  11842. Format of the lines in the category buffer (@pxref{Formatting
  11843. Variables}). Valid elements are:
  11844. @table @samp
  11845. @item c
  11846. The name of the category.
  11847. @item g
  11848. The number of groups in the category.
  11849. @end table
  11850. @item gnus-category-mode-line-format
  11851. @vindex gnus-category-mode-line-format
  11852. Format of the category mode line (@pxref{Mode Line Formatting}).
  11853. @item gnus-agent-short-article
  11854. @vindex gnus-agent-short-article
  11855. Articles that have fewer lines than this are short. Default 100.
  11856. @item gnus-agent-long-article
  11857. @vindex gnus-agent-long-article
  11858. Articles that have more lines than this are long. Default 200.
  11859. @item gnus-agent-low-score
  11860. @vindex gnus-agent-low-score
  11861. Articles that have a score lower than this have a low score. Default
  11862. 0.
  11863. @item gnus-agent-high-score
  11864. @vindex gnus-agent-high-score
  11865. Articles that have a score higher than this have a high score. Default
  11866. 0.
  11867. @end table
  11868. @node Agent Commands
  11869. @subsection Agent Commands
  11870. All the Gnus Agent commands are on the @kbd{J} submap. The @kbd{J j}
  11871. (@code{gnus-agent-toggle-plugged} command works in all modes, and
  11872. toggles the plugged/unplugged state of the Gnus Agent.
  11873. @menu
  11874. * Group Agent Commands::
  11875. * Summary Agent Commands::
  11876. * Server Agent Commands::
  11877. @end menu
  11878. You can run a complete batch fetch from the command line with the
  11879. following incantation:
  11880. @cindex gnus-agent-batch-fetch
  11881. @example
  11882. $ emacs -batch -l ~/.gnus.el -f gnus-agent-batch-fetch
  11883. @end example
  11884. @node Group Agent Commands
  11885. @subsubsection Group Agent Commands
  11886. @table @kbd
  11887. @item J u
  11888. @kindex J u (Agent Group)
  11889. @findex gnus-agent-fetch-groups
  11890. Fetch all eligible articles in the current group
  11891. (@code{gnus-agent-fetch-groups}).
  11892. @item J c
  11893. @kindex J c (Agent Group)
  11894. @findex gnus-enter-category-buffer
  11895. Enter the Agent category buffer (@code{gnus-enter-category-buffer}).
  11896. @item J s
  11897. @kindex J s (Agent Group)
  11898. @findex gnus-agent-fetch-session
  11899. Fetch all eligible articles in all groups
  11900. (@code{gnus-agent-fetch-session}).
  11901. @item J S
  11902. @kindex J S (Agent Group)
  11903. @findex gnus-group-send-drafts
  11904. Send all sendable messages in the draft group
  11905. (@code{gnus-group-send-drafts}). @xref{Drafts}.
  11906. @item J a
  11907. @kindex J a (Agent Group)
  11908. @findex gnus-agent-add-group
  11909. Add the current group to an Agent category
  11910. (@code{gnus-agent-add-group}). This command understands the
  11911. process/prefix convention (@pxref{Process/Prefix}).
  11912. @item J r
  11913. @kindex J r (Agent Group)
  11914. @findex gnus-agent-remove-group
  11915. Remove the current group from its category, if any
  11916. (@code{gnus-agent-remove-group}). This command understands the
  11917. process/prefix convention (@pxref{Process/Prefix}).
  11918. @item J Y
  11919. @kindex J Y (Agent Group)
  11920. @findex gnus-agent-synchronize-flags
  11921. Synchronize flags changed while unplugged with remote server, if any.
  11922. @end table
  11923. @node Summary Agent Commands
  11924. @subsubsection Summary Agent Commands
  11925. @table @kbd
  11926. @item J #
  11927. @kindex J # (Agent Summary)
  11928. @findex gnus-agent-mark-article
  11929. Mark the article for downloading (@code{gnus-agent-mark-article}).
  11930. @item J M-#
  11931. @kindex J M-# (Agent Summary)
  11932. @findex gnus-agent-unmark-article
  11933. Remove the downloading mark from the article
  11934. (@code{gnus-agent-unmark-article}).
  11935. @item @@
  11936. @kindex @@ (Agent Summary)
  11937. @findex gnus-agent-toggle-mark
  11938. Toggle whether to download the article (@code{gnus-agent-toggle-mark}).
  11939. @item J c
  11940. @kindex J c (Agent Summary)
  11941. @findex gnus-agent-catchup
  11942. Mark all undownloaded articles as read (@code{gnus-agent-catchup}).
  11943. @end table
  11944. @node Server Agent Commands
  11945. @subsubsection Server Agent Commands
  11946. @table @kbd
  11947. @item J a
  11948. @kindex J a (Agent Server)
  11949. @findex gnus-agent-add-server
  11950. Add the current server to the list of servers covered by the Gnus Agent
  11951. (@code{gnus-agent-add-server}).
  11952. @item J r
  11953. @kindex J r (Agent Server)
  11954. @findex gnus-agent-remove-server
  11955. Remove the current server from the list of servers covered by the Gnus
  11956. Agent (@code{gnus-agent-remove-server}).
  11957. @end table
  11958. @node Agent Expiry
  11959. @subsection Agent Expiry
  11960. @vindex gnus-agent-expire-days
  11961. @findex gnus-agent-expire
  11962. @kindex M-x gnus-agent-expire
  11963. @cindex Agent expiry
  11964. @cindex Gnus Agent expiry
  11965. @cindex expiry
  11966. @code{nnagent} doesn't handle expiry. Instead, there's a special
  11967. @code{gnus-agent-expire} command that will expire all read articles that
  11968. are older than @code{gnus-agent-expire-days} days. It can be run
  11969. whenever you feel that you're running out of space. It's not
  11970. particularly fast or efficient, and it's not a particularly good idea to
  11971. interrupt it (with @kbd{C-g} or anything else) once you've started it.
  11972. @vindex gnus-agent-expire-all
  11973. if @code{gnus-agent-expire-all} is non-@code{nil}, this command will
  11974. expire all articles---unread, read, ticked and dormant. If @code{nil}
  11975. (which is the default), only read articles are eligible for expiry, and
  11976. unread, ticked and dormant articles will be kept indefinitely.
  11977. @node Agent and IMAP
  11978. @subsection Agent and IMAP
  11979. The Agent work with any Gnus back end, including nnimap. However,
  11980. since there are some conceptual differences between @sc{nntp} and
  11981. @sc{imap}, this section (should) provide you with some information to
  11982. make Gnus Agent work smoother as a @sc{imap} Disconnected Mode client.
  11983. The first thing to keep in mind is that all flags (read, ticked, etc)
  11984. are kept on the @sc{imap} server, rather than in @file{.newsrc} as is the
  11985. case for nntp. Thus Gnus need to remember flag changes when
  11986. disconnected, and synchronize these flags when you plug back in.
  11987. Gnus keep track of flag changes when reading nnimap groups under the
  11988. Agent by default. When you plug back in, by default Gnus will check if
  11989. you have any changed any flags and ask if you wish to synchronize these
  11990. with the server. This behavior is customizable with
  11991. @code{gnus-agent-synchronize-flags}.
  11992. @vindex gnus-agent-synchronize-flags
  11993. If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
  11994. never automatically synchronize flags. If it is @code{ask}, the
  11995. default, the Agent will check if you made any changes and if so ask if
  11996. you wish to synchronize these when you re-connect. If it has any other
  11997. value, all flags will be synchronized automatically.
  11998. If you do not wish to automatically synchronize flags when you
  11999. re-connect, this can be done manually with the
  12000. @code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}
  12001. in the group buffer by default.
  12002. Some things are currently not implemented in the Agent that you'd might
  12003. expect from a disconnected @sc{imap} client, including:
  12004. @itemize @bullet
  12005. @item
  12006. Copying/moving articles into nnimap groups when unplugged.
  12007. @item
  12008. Creating/deleting nnimap groups when unplugged.
  12009. @end itemize
  12010. Technical note: the synchronization algorithm does not work by "pushing"
  12011. all local flags to the server, but rather incrementally update the
  12012. server view of flags by changing only those flags that were changed by
  12013. the user. Thus, if you set one flag on a article, quit the group and
  12014. re-select the group and remove the flag; the flag will be set and
  12015. removed from the server when you "synchronize". The queued flag
  12016. operations can be found in the per-server @code{flags} file in the Agent
  12017. directory. It's emptied when you synchronize flags.
  12018. @node Outgoing Messages
  12019. @subsection Outgoing Messages
  12020. When Gnus is unplugged, all outgoing messages (both mail and news) are
  12021. stored in the draft groups (@pxref{Drafts}). You can view them there
  12022. after posting, and edit them at will.
  12023. When Gnus is plugged again, you can send the messages either from the
  12024. draft group with the special commands available there, or you can use
  12025. the @kbd{J S} command in the group buffer to send all the sendable
  12026. messages in the draft group.
  12027. @node Agent Variables
  12028. @subsection Agent Variables
  12029. @table @code
  12030. @item gnus-agent-directory
  12031. @vindex gnus-agent-directory
  12032. Where the Gnus Agent will store its files. The default is
  12033. @file{~/News/agent/}.
  12034. @item gnus-agent-handle-level
  12035. @vindex gnus-agent-handle-level
  12036. Groups on levels (@pxref{Group Levels}) higher than this variable will
  12037. be ignored by the Agent. The default is @code{gnus-level-subscribed},
  12038. which means that only subscribed group will be considered by the Agent
  12039. by default.
  12040. @item gnus-agent-plugged-hook
  12041. @vindex gnus-agent-plugged-hook
  12042. Hook run when connecting to the network.
  12043. @item gnus-agent-unplugged-hook
  12044. @vindex gnus-agent-unplugged-hook
  12045. Hook run when disconnecting from the network.
  12046. @end table
  12047. @node Example Setup
  12048. @subsection Example Setup
  12049. If you don't want to read this manual, and you have a fairly standard
  12050. setup, you may be able to use something like the following as your
  12051. @file{.gnus.el} file to get started.
  12052. @lisp
  12053. ;;; Define how Gnus is to fetch news. We do this over @sc{nntp}
  12054. ;;; from your ISP's server.
  12055. (setq gnus-select-method '(nntp "news.your-isp.com"))
  12056. ;;; Define how Gnus is to read your mail. We read mail from
  12057. ;;; your ISP's POP server.
  12058. (setq mail-sources '((pop :server "pop.your-isp.com")))
  12059. ;;; Say how Gnus is to store the mail. We use nnml groups.
  12060. (setq gnus-secondary-select-methods '((nnml "")))
  12061. ;;; Make Gnus into an offline newsreader.
  12062. (gnus-agentize)
  12063. @end lisp
  12064. That should be it, basically. Put that in your @file{~/.gnus.el} file,
  12065. edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
  12066. gnus}.
  12067. If this is the first time you've run Gnus, you will be subscribed
  12068. automatically to a few default newsgroups. You'll probably want to
  12069. subscribe to more groups, and to do that, you have to query the
  12070. @sc{nntp} server for a complete list of groups with the @kbd{A A}
  12071. command. This usually takes quite a while, but you only have to do it
  12072. once.
  12073. After reading and parsing a while, you'll be presented with a list of
  12074. groups. Subscribe to the ones you want to read with the @kbd{u}
  12075. command. @kbd{l} to make all the killed groups disappear after you've
  12076. subscribe to all the groups you want to read. (@kbd{A k} will bring
  12077. back all the killed groups.)
  12078. You can now read the groups at once, or you can download the articles
  12079. with the @kbd{J s} command. And then read the rest of this manual to
  12080. find out which of the other gazillion things you want to customize.
  12081. @node Batching Agents
  12082. @subsection Batching Agents
  12083. Having the Gnus Agent fetch articles (and post whatever messages you've
  12084. written) is quite easy once you've gotten things set up properly. The
  12085. following shell script will do everything that is necessary:
  12086. @example
  12087. #!/bin/sh
  12088. emacs -batch -l ~/.emacs -f gnus-agent-batch >/dev/null
  12089. @end example
  12090. @node Agent Caveats
  12091. @subsection Agent Caveats
  12092. The Gnus Agent doesn't seem to work like most other offline
  12093. newsreaders. Here are some common questions that some imaginary people
  12094. may ask:
  12095. @table @dfn
  12096. @item If I read an article while plugged, do they get entered into the
  12097. Agent?
  12098. @strong{No.}
  12099. @item If I read an article while plugged, and the article already exists
  12100. in the Agent, will it get downloaded once more?
  12101. @strong{Yes.}
  12102. @end table
  12103. In short, when Gnus is unplugged, it only looks into the locally stored
  12104. articles; when it's plugged, it only talks to your ISP.
  12105. @node Scoring
  12106. @chapter Scoring
  12107. @cindex scoring
  12108. Other people use @dfn{kill files}, but we here at Gnus Towers like
  12109. scoring better than killing, so we'd rather switch than fight. They do
  12110. something completely different as well, so sit up straight and pay
  12111. attention!
  12112. @vindex gnus-summary-mark-below
  12113. All articles have a default score (@code{gnus-summary-default-score}),
  12114. which is 0 by default. This score may be raised or lowered either
  12115. interactively or by score files. Articles that have a score lower than
  12116. @code{gnus-summary-mark-below} are marked as read.
  12117. Gnus will read any @dfn{score files} that apply to the current group
  12118. before generating the summary buffer.
  12119. There are several commands in the summary buffer that insert score
  12120. entries based on the current article. You can, for instance, ask Gnus to
  12121. lower or increase the score of all articles with a certain subject.
  12122. There are two sorts of scoring entries: Permanent and temporary.
  12123. Temporary score entries are self-expiring entries. Any entries that are
  12124. temporary and have not been used for, say, a week, will be removed
  12125. silently to help keep the sizes of the score files down.
  12126. @menu
  12127. * Summary Score Commands:: Adding score entries for the current group.
  12128. * Group Score Commands:: General score commands.
  12129. * Score Variables:: Customize your scoring. (My, what terminology).
  12130. * Score File Format:: What a score file may contain.
  12131. * Score File Editing:: You can edit score files by hand as well.
  12132. * Adaptive Scoring:: Big Sister Gnus knows what you read.
  12133. * Home Score File:: How to say where new score entries are to go.
  12134. * Followups To Yourself:: Having Gnus notice when people answer you.
  12135. * Scoring Tips:: How to score effectively.
  12136. * Reverse Scoring:: That problem child of old is not problem.
  12137. * Global Score Files:: Earth-spanning, ear-splitting score files.
  12138. * Kill Files:: They are still here, but they can be ignored.
  12139. * Converting Kill Files:: Translating kill files to score files.
  12140. * GroupLens:: Getting predictions on what you like to read.
  12141. * Advanced Scoring:: Using logical expressions to build score rules.
  12142. * Score Decays:: It can be useful to let scores wither away.
  12143. @end menu
  12144. @node Summary Score Commands
  12145. @section Summary Score Commands
  12146. @cindex score commands
  12147. The score commands that alter score entries do not actually modify real
  12148. score files. That would be too inefficient. Gnus maintains a cache of
  12149. previously loaded score files, one of which is considered the
  12150. @dfn{current score file alist}. The score commands simply insert
  12151. entries into this list, and upon group exit, this list is saved.
  12152. The current score file is by default the group's local score file, even
  12153. if no such score file actually exists. To insert score commands into
  12154. some other score file (e.g. @file{all.SCORE}), you must first make this
  12155. score file the current one.
  12156. General score commands that don't actually change the score file:
  12157. @table @kbd
  12158. @item V s
  12159. @kindex V s @r{(Summary)}
  12160. @findex gnus-summary-set-score
  12161. Set the score of the current article (@code{gnus-summary-set-score}).
  12162. @item V S
  12163. @kindex V S @r{(Summary)}
  12164. @findex gnus-summary-current-score
  12165. Display the score of the current article
  12166. (@code{gnus-summary-current-score}).
  12167. @item V t
  12168. @kindex V t @r{(Summary)}
  12169. @findex gnus-score-find-trace
  12170. Display all score rules that have been used on the current article
  12171. (@code{gnus-score-find-trace}).
  12172. @item V R
  12173. @kindex V R @r{(Summary)}
  12174. @findex gnus-summary-rescore
  12175. Run the current summary through the scoring process
  12176. (@code{gnus-summary-rescore}). This might be useful if you're playing
  12177. around with your score files behind Gnus' back and want to see the
  12178. effect you're having.
  12179. @item V c
  12180. @kindex V c @r{(Summary)}
  12181. @findex gnus-score-change-score-file
  12182. Make a different score file the current
  12183. (@code{gnus-score-change-score-file}).
  12184. @item V e
  12185. @kindex V e @r{(Summary)}
  12186. @findex gnus-score-edit-current-scores
  12187. Edit the current score file (@code{gnus-score-edit-current-scores}).
  12188. You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
  12189. File Editing}).
  12190. @item V f
  12191. @kindex V f @r{(Summary)}
  12192. @findex gnus-score-edit-file
  12193. Edit a score file and make this score file the current one
  12194. (@code{gnus-score-edit-file}).
  12195. @item V F
  12196. @kindex V F @r{(Summary)}
  12197. @findex gnus-score-flush-cache
  12198. Flush the score cache (@code{gnus-score-flush-cache}). This is useful
  12199. after editing score files.
  12200. @item V C
  12201. @kindex V C @r{(Summary)}
  12202. @findex gnus-score-customize
  12203. Customize a score file in a visually pleasing manner
  12204. (@code{gnus-score-customize}).
  12205. @end table
  12206. The rest of these commands modify the local score file.
  12207. @table @kbd
  12208. @item V m
  12209. @kindex V m @r{(Summary)}
  12210. @findex gnus-score-set-mark-below
  12211. Prompt for a score, and mark all articles with a score below this as
  12212. read (@code{gnus-score-set-mark-below}).
  12213. @item V x
  12214. @kindex V x @r{(Summary)}
  12215. @findex gnus-score-set-expunge-below
  12216. Prompt for a score, and add a score rule to the current score file to
  12217. expunge all articles below this score
  12218. (@code{gnus-score-set-expunge-below}).
  12219. @end table
  12220. The keystrokes for actually making score entries follow a very regular
  12221. pattern, so there's no need to list all the commands. (Hundreds of
  12222. them.)
  12223. @findex gnus-summary-increase-score
  12224. @findex gnus-summary-lower-score
  12225. @enumerate
  12226. @item
  12227. The first key is either @kbd{I} (upper case i) for increasing the score
  12228. or @kbd{L} for lowering the score.
  12229. @item
  12230. The second key says what header you want to score on. The following
  12231. keys are available:
  12232. @table @kbd
  12233. @item a
  12234. Score on the author name.
  12235. @item s
  12236. Score on the subject line.
  12237. @item x
  12238. Score on the @code{Xref} line---i.e., the cross-posting line.
  12239. @item r
  12240. Score on the @code{References} line.
  12241. @item d
  12242. Score on the date.
  12243. @item l
  12244. Score on the number of lines.
  12245. @item i
  12246. Score on the @code{Message-ID} header.
  12247. @item f
  12248. Score on followups---this matches the author name, and adds scores to
  12249. the followups to this author.
  12250. @item b
  12251. Score on the body.
  12252. @item h
  12253. Score on the head.
  12254. @item t
  12255. Score on thread.
  12256. @end table
  12257. @item
  12258. The third key is the match type. Which match types are valid depends on
  12259. what headers you are scoring on.
  12260. @table @code
  12261. @item strings
  12262. @table @kbd
  12263. @item e
  12264. Exact matching.
  12265. @item s
  12266. Substring matching.
  12267. @item f
  12268. Fuzzy matching (@pxref{Fuzzy Matching}).
  12269. @item r
  12270. Regexp matching
  12271. @end table
  12272. @item date
  12273. @table @kbd
  12274. @item b
  12275. Before date.
  12276. @item a
  12277. After date.
  12278. @item n
  12279. This date.
  12280. @end table
  12281. @item number
  12282. @table @kbd
  12283. @item <
  12284. Less than number.
  12285. @item =
  12286. Equal to number.
  12287. @item >
  12288. Greater than number.
  12289. @end table
  12290. @end table
  12291. @item
  12292. The fourth and final key says whether this is a temporary (i.e., expiring)
  12293. score entry, or a permanent (i.e., non-expiring) score entry, or whether
  12294. it is to be done immediately, without adding to the score file.
  12295. @table @kbd
  12296. @item t
  12297. Temporary score entry.
  12298. @item p
  12299. Permanent score entry.
  12300. @item i
  12301. Immediately scoring.
  12302. @end table
  12303. @end enumerate
  12304. So, let's say you want to increase the score on the current author with
  12305. exact matching permanently: @kbd{I a e p}. If you want to lower the
  12306. score based on the subject line, using substring matching, and make a
  12307. temporary score entry: @kbd{L s s t}. Pretty easy.
  12308. To make things a bit more complicated, there are shortcuts. If you use
  12309. a capital letter on either the second or third keys, Gnus will use
  12310. defaults for the remaining one or two keystrokes. The defaults are
  12311. ``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a s
  12312. t}, and @kbd{I a R} is the same as @kbd{I a r t}.
  12313. These functions take both the numerical prefix and the symbolic prefix
  12314. (@pxref{Symbolic Prefixes}). A numerical prefix says how much to lower
  12315. (or increase) the score of the article. A symbolic prefix of @code{a}
  12316. says to use the @file{all.SCORE} file for the command instead of the
  12317. current score file.
  12318. @vindex gnus-score-mimic-keymap
  12319. The @code{gnus-score-mimic-keymap} says whether these commands will
  12320. pretend they are keymaps or not.
  12321. @node Group Score Commands
  12322. @section Group Score Commands
  12323. @cindex group score commands
  12324. There aren't many of these as yet, I'm afraid.
  12325. @table @kbd
  12326. @item W f
  12327. @kindex W f @r{(Group)}
  12328. @findex gnus-score-flush-cache
  12329. Gnus maintains a cache of score alists to avoid having to reload them
  12330. all the time. This command will flush the cache
  12331. (@code{gnus-score-flush-cache}).
  12332. @end table
  12333. You can do scoring from the command line by saying something like:
  12334. @findex gnus-batch-score
  12335. @cindex batch scoring
  12336. @example
  12337. $ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score
  12338. @end example
  12339. @node Score Variables
  12340. @section Score Variables
  12341. @cindex score variables
  12342. @table @code
  12343. @item gnus-use-scoring
  12344. @vindex gnus-use-scoring
  12345. If @code{nil}, Gnus will not check for score files, and will not, in
  12346. general, do any score-related work. This is @code{t} by default.
  12347. @item gnus-kill-killed
  12348. @vindex gnus-kill-killed
  12349. If this variable is @code{nil}, Gnus will never apply score files to
  12350. articles that have already been through the kill process. While this
  12351. may save you lots of time, it also means that if you apply a kill file
  12352. to a group, and then change the kill file and want to run it over you
  12353. group again to kill more articles, it won't work. You have to set this
  12354. variable to @code{t} to do that. (It is @code{t} by default.)
  12355. @item gnus-kill-files-directory
  12356. @vindex gnus-kill-files-directory
  12357. All kill and score files will be stored in this directory, which is
  12358. initialized from the @code{SAVEDIR} environment variable by default.
  12359. This is @file{~/News/} by default.
  12360. @item gnus-score-file-suffix
  12361. @vindex gnus-score-file-suffix
  12362. Suffix to add to the group name to arrive at the score file name
  12363. (@samp{SCORE} by default.)
  12364. @item gnus-score-uncacheable-files
  12365. @vindex gnus-score-uncacheable-files
  12366. @cindex score cache
  12367. All score files are normally cached to avoid excessive re-loading of
  12368. score files. However, if this might make your Emacs grow big and
  12369. bloated, so this regexp can be used to weed out score files unlikely to be needed again. It would be a bad idea to deny caching of
  12370. @file{all.SCORE}, while it might be a good idea to not cache
  12371. @file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, this
  12372. variable is @samp{ADAPT$} by default, so no adaptive score files will
  12373. be cached.
  12374. @item gnus-save-score
  12375. @vindex gnus-save-score
  12376. If you have really complicated score files, and do lots of batch
  12377. scoring, then you might set this variable to @code{t}. This will make
  12378. Gnus save the scores into the @file{.newsrc.eld} file.
  12379. If you do not set this to @code{t}, then manual scores (like those set
  12380. with @kbd{V s} (@code{gnus-summary-set-score})) will not be preserved
  12381. across group visits.
  12382. @item gnus-score-interactive-default-score
  12383. @vindex gnus-score-interactive-default-score
  12384. Score used by all the interactive raise/lower commands to raise/lower
  12385. score with. Default is 1000, which may seem excessive, but this is to
  12386. ensure that the adaptive scoring scheme gets enough room to play with.
  12387. We don't want the small changes from the adaptive scoring to overwrite
  12388. manually entered data.
  12389. @item gnus-summary-default-score
  12390. @vindex gnus-summary-default-score
  12391. Default score of an article, which is 0 by default.
  12392. @item gnus-summary-expunge-below
  12393. @vindex gnus-summary-expunge-below
  12394. Don't display the summary lines of articles that have scores lower than
  12395. this variable. This is @code{nil} by default, which means that no
  12396. articles will be hidden. This variable is local to the summary buffers,
  12397. and has to be set from @code{gnus-summary-mode-hook}.
  12398. @item gnus-score-over-mark
  12399. @vindex gnus-score-over-mark
  12400. Mark (in the third column) used for articles with a score over the
  12401. default. Default is @samp{+}.
  12402. @item gnus-score-below-mark
  12403. @vindex gnus-score-below-mark
  12404. Mark (in the third column) used for articles with a score below the
  12405. default. Default is @samp{-}.
  12406. @item gnus-score-find-score-files-function
  12407. @vindex gnus-score-find-score-files-function
  12408. Function used to find score files for the current group. This function
  12409. is called with the name of the group as the argument.
  12410. Predefined functions available are:
  12411. @table @code
  12412. @item gnus-score-find-single
  12413. @findex gnus-score-find-single
  12414. Only apply the group's own score file.
  12415. @item gnus-score-find-bnews
  12416. @findex gnus-score-find-bnews
  12417. Apply all score files that match, using bnews syntax. This is the
  12418. default. If the current group is @samp{gnu.emacs.gnus}, for instance,
  12419. @file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
  12420. @file{gnu.all.SCORE} would all apply. In short, the instances of
  12421. @samp{all} in the score file names are translated into @samp{.*}, and
  12422. then a regexp match is done.
  12423. This means that if you have some score entries that you want to apply to
  12424. all groups, then you put those entries in the @file{all.SCORE} file.
  12425. The score files are applied in a semi-random order, although Gnus will
  12426. try to apply the more general score files before the more specific score
  12427. files. It does this by looking at the number of elements in the score
  12428. file names---discarding the @samp{all} elements.
  12429. @item gnus-score-find-hierarchical
  12430. @findex gnus-score-find-hierarchical
  12431. Apply all score files from all the parent groups. This means that you
  12432. can't have score files like @file{all.SCORE}, but you can have
  12433. @file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for each
  12434. server.
  12435. @end table
  12436. This variable can also be a list of functions. In that case, all these
  12437. functions will be called with the group name as argument, and all the
  12438. returned lists of score files will be applied. These functions can also
  12439. return lists of score alists directly. In that case, the functions that
  12440. return these non-file score alists should probably be placed before the
  12441. ``real'' score file functions, to ensure that the last score file
  12442. returned is the local score file. Phu.
  12443. For example, to do hierarchical scoring but use a non-server-specific
  12444. overall score file, you could use the value
  12445. @example
  12446. (list (lambda (group) ("all.SCORE"))
  12447. 'gnus-score-find-hierarchical)
  12448. @end example
  12449. @item gnus-score-expiry-days
  12450. @vindex gnus-score-expiry-days
  12451. This variable says how many days should pass before an unused score file
  12452. entry is expired. If this variable is @code{nil}, no score file entries
  12453. are expired. It's 7 by default.
  12454. @item gnus-update-score-entry-dates
  12455. @vindex gnus-update-score-entry-dates
  12456. If this variable is non-@code{nil}, matching score entries will have
  12457. their dates updated. (This is how Gnus controls expiry---all
  12458. non-matching entries will become too old while matching entries will
  12459. stay fresh and young.) However, if you set this variable to @code{nil},
  12460. even matching entries will grow old and will have to face that oh-so
  12461. grim reaper.
  12462. @item gnus-score-after-write-file-function
  12463. @vindex gnus-score-after-write-file-function
  12464. Function called with the name of the score file just written.
  12465. @item gnus-score-thread-simplify
  12466. @vindex gnus-score-thread-simplify
  12467. If this variable is non-@code{nil}, article subjects will be simplified
  12468. for subject scoring purposes in the same manner as with
  12469. threading---according to the current value of
  12470. gnus-simplify-subject-functions. If the scoring entry uses
  12471. @code{substring} or @code{exact} matching, the match will also be
  12472. simplified in this manner.
  12473. @end table
  12474. @node Score File Format
  12475. @section Score File Format
  12476. @cindex score file format
  12477. A score file is an @code{emacs-lisp} file that normally contains just a
  12478. single form. Casual users are not expected to edit these files;
  12479. everything can be changed from the summary buffer.
  12480. Anyway, if you'd like to dig into it yourself, here's an example:
  12481. @lisp
  12482. (("from"
  12483. ("Lars Ingebrigtsen" -10000)
  12484. ("Per Abrahamsen")
  12485. ("larsi\\|lmi" -50000 nil R))
  12486. ("subject"
  12487. ("Ding is Badd" nil 728373))
  12488. ("xref"
  12489. ("alt.politics" -1000 728372 s))
  12490. ("lines"
  12491. (2 -100 nil <))
  12492. (mark 0)
  12493. (expunge -1000)
  12494. (mark-and-expunge -10)
  12495. (read-only nil)
  12496. (orphan -10)
  12497. (adapt t)
  12498. (files "/hom/larsi/News/gnu.SCORE")
  12499. (exclude-files "all.SCORE")
  12500. (local (gnus-newsgroup-auto-expire t)
  12501. (gnus-summary-make-false-root empty))
  12502. (eval (ding)))
  12503. @end lisp
  12504. This example demonstrates most score file elements. For a different
  12505. approach, see @pxref{Advanced Scoring}.
  12506. Even though this looks much like lisp code, nothing here is actually
  12507. @code{eval}ed. The lisp reader is used to read this form, though, so it
  12508. has to be valid syntactically, if not semantically.
  12509. Six keys are supported by this alist:
  12510. @table @code
  12511. @item STRING
  12512. If the key is a string, it is the name of the header to perform the
  12513. match on. Scoring can only be performed on these eight headers:
  12514. @code{From}, @code{Subject}, @code{References}, @code{Message-ID},
  12515. @code{Xref}, @code{Lines}, @code{Chars} and @code{Date}. In addition to
  12516. these headers, there are three strings to tell Gnus to fetch the entire
  12517. article and do the match on larger parts of the article: @code{Body}
  12518. will perform the match on the body of the article, @code{Head} will
  12519. perform the match on the head of the article, and @code{All} will
  12520. perform the match on the entire article. Note that using any of these
  12521. last three keys will slow down group entry @emph{considerably}. The
  12522. final ``header'' you can score on is @code{Followup}. These score
  12523. entries will result in new score entries being added for all follow-ups
  12524. to articles that matches these score entries.
  12525. Following this key is a arbitrary number of score entries, where each
  12526. score entry has one to four elements.
  12527. @enumerate
  12528. @item
  12529. The first element is the @dfn{match element}. On most headers this will
  12530. be a string, but on the Lines and Chars headers, this must be an
  12531. integer.
  12532. @item
  12533. If the second element is present, it should be a number---the @dfn{score
  12534. element}. This number should be an integer in the neginf to posinf
  12535. interval. This number is added to the score of the article if the match
  12536. is successful. If this element is not present, the
  12537. @code{gnus-score-interactive-default-score} number will be used
  12538. instead. This is 1000 by default.
  12539. @item
  12540. If the third element is present, it should be a number---the @dfn{date
  12541. element}. This date says when the last time this score entry matched,
  12542. which provides a mechanism for expiring the score entries. It this
  12543. element is not present, the score entry is permanent. The date is
  12544. represented by the number of days since December 31, 1 BCE.
  12545. @item
  12546. If the fourth element is present, it should be a symbol---the @dfn{type
  12547. element}. This element specifies what function should be used to see
  12548. whether this score entry matches the article. What match types that can
  12549. be used depends on what header you wish to perform the match on.
  12550. @table @dfn
  12551. @item From, Subject, References, Xref, Message-ID
  12552. For most header types, there are the @code{r} and @code{R} (regexp), as
  12553. well as @code{s} and @code{S} (substring) types, and @code{e} and
  12554. @code{E} (exact match), and @code{w} (word match) types. If this
  12555. element is not present, Gnus will assume that substring matching should
  12556. be used. @code{R}, @code{S}, and @code{E} differ from the others in
  12557. that the matches will be done in a case-sensitive manner. All these
  12558. one-letter types are really just abbreviations for the @code{regexp},
  12559. @code{string}, @code{exact}, and @code{word} types, which you can use
  12560. instead, if you feel like.
  12561. @item Lines, Chars
  12562. These two headers use different match types: @code{<}, @code{>},
  12563. @code{=}, @code{>=} and @code{<=}.
  12564. These predicates are true if
  12565. @example
  12566. (PREDICATE HEADER MATCH)
  12567. @end example
  12568. evaluates to non-@code{nil}. For instance, the advanced match
  12569. @code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the
  12570. following form:
  12571. @lisp
  12572. (< header-value 4)
  12573. @end lisp
  12574. Or to put it another way: When using @code{<} on @code{Lines} with 4 as
  12575. the match, we get the score added if the article has less than 4 lines.
  12576. (It's easy to get confused and think it's the other way around. But
  12577. it's not. I think.)
  12578. When matching on @code{Lines}, be careful because some back ends (like
  12579. @code{nndir}) do not generate @code{Lines} header, so every article ends
  12580. up being marked as having 0 lines. This can lead to strange results if
  12581. you happen to lower score of the articles with few lines.
  12582. @item Date
  12583. For the Date header we have three kinda silly match types:
  12584. @code{before}, @code{at} and @code{after}. I can't really imagine this
  12585. ever being useful, but, like, it would feel kinda silly not to provide
  12586. this function. Just in case. You never know. Better safe than sorry.
  12587. Once burnt, twice shy. Don't judge a book by its cover. Never not have
  12588. sex on a first date. (I have been told that at least one person, and I
  12589. quote, ``found this function indispensable'', however.)
  12590. @cindex ISO8601
  12591. @cindex date
  12592. A more useful match type is @code{regexp}. With it, you can match the
  12593. date string using a regular expression. The date is normalized to
  12594. ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}. If
  12595. you want to match all articles that have been posted on April 1st in
  12596. every year, you could use @samp{....0401.........} as a match string,
  12597. for instance. (Note that the date is kept in its original time zone, so
  12598. this will match articles that were posted when it was April 1st where
  12599. the article was posted from. Time zones are such wholesome fun for the
  12600. whole family, eh?)
  12601. @item Head, Body, All
  12602. These three match keys use the same match types as the @code{From} (etc)
  12603. header uses.
  12604. @item Followup
  12605. This match key is somewhat special, in that it will match the
  12606. @code{From} header, and affect the score of not only the matching
  12607. articles, but also all followups to the matching articles. This allows
  12608. you e.g. increase the score of followups to your own articles, or
  12609. decrease the score of followups to the articles of some known
  12610. trouble-maker. Uses the same match types as the @code{From} header
  12611. uses. (Using this match key will lead to creation of @file{ADAPT}
  12612. files.)
  12613. @item Thread
  12614. This match key works along the same lines as the @code{Followup} match
  12615. key. If you say that you want to score on a (sub-)thread started by an
  12616. article with a @code{Message-ID} @var{x}, then you add a @samp{thread}
  12617. match. This will add a new @samp{thread} match for each article that
  12618. has @var{x} in its @code{References} header. (These new @samp{thread}
  12619. matches will use the @code{Message-ID}s of these matching articles.)
  12620. This will ensure that you can raise/lower the score of an entire thread,
  12621. even though some articles in the thread may not have complete
  12622. @code{References} headers. Note that using this may lead to
  12623. undeterministic scores of the articles in the thread. (Using this match
  12624. key will lead to creation of @file{ADAPT} files.)
  12625. @end table
  12626. @end enumerate
  12627. @cindex Score File Atoms
  12628. @item mark
  12629. The value of this entry should be a number. Any articles with a score
  12630. lower than this number will be marked as read.
  12631. @item expunge
  12632. The value of this entry should be a number. Any articles with a score
  12633. lower than this number will be removed from the summary buffer.
  12634. @item mark-and-expunge
  12635. The value of this entry should be a number. Any articles with a score
  12636. lower than this number will be marked as read and removed from the
  12637. summary buffer.
  12638. @item thread-mark-and-expunge
  12639. The value of this entry should be a number. All articles that belong to
  12640. a thread that has a total score below this number will be marked as read
  12641. and removed from the summary buffer. @code{gnus-thread-score-function}
  12642. says how to compute the total score for a thread.
  12643. @item files
  12644. The value of this entry should be any number of file names. These files
  12645. are assumed to be score files as well, and will be loaded the same way
  12646. this one was.
  12647. @item exclude-files
  12648. The clue of this entry should be any number of files. These files will
  12649. not be loaded, even though they would normally be so, for some reason or
  12650. other.
  12651. @item eval
  12652. The value of this entry will be @code{eval}el. This element will be
  12653. ignored when handling global score files.
  12654. @item read-only
  12655. Read-only score files will not be updated or saved. Global score files
  12656. should feature this atom (@pxref{Global Score Files}). (Note:
  12657. @dfn{Global} here really means @dfn{global}; not your personal
  12658. apply-to-all-groups score files.)
  12659. @item orphan
  12660. The value of this entry should be a number. Articles that do not have
  12661. parents will get this number added to their scores. Imagine you follow
  12662. some high-volume newsgroup, like @samp{comp.lang.c}. Most likely you
  12663. will only follow a few of the threads, also want to see any new threads.
  12664. You can do this with the following two score file entries:
  12665. @example
  12666. (orphan -500)
  12667. (mark-and-expunge -100)
  12668. @end example
  12669. When you enter the group the first time, you will only see the new
  12670. threads. You then raise the score of the threads that you find
  12671. interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the
  12672. rest. Next time you enter the group, you will see new articles in the
  12673. interesting threads, plus any new threads.
  12674. I.e.---the orphan score atom is for high-volume groups where there
  12675. exist a few interesting threads which can't be found automatically by
  12676. ordinary scoring rules.
  12677. @item adapt
  12678. This entry controls the adaptive scoring. If it is @code{t}, the
  12679. default adaptive scoring rules will be used. If it is @code{ignore}, no
  12680. adaptive scoring will be performed on this group. If it is a list, this
  12681. list will be used as the adaptive scoring rules. If it isn't present,
  12682. or is something other than @code{t} or @code{ignore}, the default
  12683. adaptive scoring rules will be used. If you want to use adaptive
  12684. scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
  12685. @code{t}, and insert an @code{(adapt ignore)} in the groups where you do
  12686. not want adaptive scoring. If you only want adaptive scoring in a few
  12687. groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
  12688. insert @code{(adapt t)} in the score files of the groups where you want
  12689. it.
  12690. @item adapt-file
  12691. All adaptive score entries will go to the file named by this entry. It
  12692. will also be applied when entering the group. This atom might be handy
  12693. if you want to adapt on several groups at once, using the same adaptive
  12694. file for a number of groups.
  12695. @item local
  12696. @cindex local variables
  12697. The value of this entry should be a list of @code{(VAR VALUE)} pairs.
  12698. Each @var{var} will be made buffer-local to the current summary buffer,
  12699. and set to the value specified. This is a convenient, if somewhat
  12700. strange, way of setting variables in some groups if you don't like hooks
  12701. much. Note that the @var{value} won't be evaluated.
  12702. @end table
  12703. @node Score File Editing
  12704. @section Score File Editing
  12705. You normally enter all scoring commands from the summary buffer, but you
  12706. might feel the urge to edit them by hand as well, so we've supplied you
  12707. with a mode for that.
  12708. It's simply a slightly customized @code{emacs-lisp} mode, with these
  12709. additional commands:
  12710. @table @kbd
  12711. @item C-c C-c
  12712. @kindex C-c C-c (Score)
  12713. @findex gnus-score-edit-done
  12714. Save the changes you have made and return to the summary buffer
  12715. (@code{gnus-score-edit-done}).
  12716. @item C-c C-d
  12717. @kindex C-c C-d (Score)
  12718. @findex gnus-score-edit-insert-date
  12719. Insert the current date in numerical format
  12720. (@code{gnus-score-edit-insert-date}). This is really the day number, if
  12721. you were wondering.
  12722. @item C-c C-p
  12723. @kindex C-c C-p (Score)
  12724. @findex gnus-score-pretty-print
  12725. The adaptive score files are saved in an unformatted fashion. If you
  12726. intend to read one of these files, you want to @dfn{pretty print} it
  12727. first. This command (@code{gnus-score-pretty-print}) does that for
  12728. you.
  12729. @end table
  12730. Type @kbd{M-x gnus-score-mode} to use this mode.
  12731. @vindex gnus-score-mode-hook
  12732. @code{gnus-score-menu-hook} is run in score mode buffers.
  12733. In the summary buffer you can use commands like @kbd{V f} and @kbd{V
  12734. e} to begin editing score files.
  12735. @node Adaptive Scoring
  12736. @section Adaptive Scoring
  12737. @cindex adaptive scoring
  12738. If all this scoring is getting you down, Gnus has a way of making it all
  12739. happen automatically---as if by magic. Or rather, as if by artificial
  12740. stupidity, to be precise.
  12741. @vindex gnus-use-adaptive-scoring
  12742. When you read an article, or mark an article as read, or kill an
  12743. article, you leave marks behind. On exit from the group, Gnus can sniff
  12744. these marks and add score elements depending on what marks it finds.
  12745. You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
  12746. @code{t} or @code{(line)}. If you want score adaptively on separate
  12747. words appearing in the subjects, you should set this variable to
  12748. @code{(word)}. If you want to use both adaptive methods, set this
  12749. variable to @code{(word line)}.
  12750. @vindex gnus-default-adaptive-score-alist
  12751. To give you complete control over the scoring process, you can customize
  12752. the @code{gnus-default-adaptive-score-alist} variable. For instance, it
  12753. might look something like this:
  12754. @lisp
  12755. (setq gnus-default-adaptive-score-alist
  12756. '((gnus-unread-mark)
  12757. (gnus-ticked-mark (from 4))
  12758. (gnus-dormant-mark (from 5))
  12759. (gnus-del-mark (from -4) (subject -1))
  12760. (gnus-read-mark (from 4) (subject 2))
  12761. (gnus-expirable-mark (from -1) (subject -1))
  12762. (gnus-killed-mark (from -1) (subject -3))
  12763. (gnus-kill-file-mark)
  12764. (gnus-ancient-mark)
  12765. (gnus-low-score-mark)
  12766. (gnus-catchup-mark (from -1) (subject -1))))
  12767. @end lisp
  12768. As you see, each element in this alist has a mark as a key (either a
  12769. variable name or a ``real'' mark---a character). Following this key is
  12770. a arbitrary number of header/score pairs. If there are no header/score
  12771. pairs following the key, no adaptive scoring will be done on articles
  12772. that have that key as the article mark. For instance, articles with
  12773. @code{gnus-unread-mark} in the example above will not get adaptive score
  12774. entries.
  12775. Each article can have only one mark, so just a single of these rules
  12776. will be applied to each article.
  12777. To take @code{gnus-del-mark} as an example---this alist says that all
  12778. articles that have that mark (i.e., are marked with @samp{D}) will have a
  12779. score entry added to lower based on the @code{From} header by -4, and
  12780. lowered by @code{Subject} by -1. Change this to fit your prejudices.
  12781. If you have marked 10 articles with the same subject with
  12782. @code{gnus-del-mark}, the rule for that mark will be applied ten times.
  12783. That means that that subject will get a score of ten times -1, which
  12784. should be, unless I'm much mistaken, -10.
  12785. If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
  12786. the read articles will be marked with the @samp{E} mark. This'll
  12787. probably make adaptive scoring slightly impossible, so auto-expiring and
  12788. adaptive scoring doesn't really mix very well.
  12789. The headers you can score on are @code{from}, @code{subject},
  12790. @code{message-id}, @code{references}, @code{xref}, @code{lines},
  12791. @code{chars} and @code{date}. In addition, you can score on
  12792. @code{followup}, which will create an adaptive score entry that matches
  12793. on the @code{References} header using the @code{Message-ID} of the
  12794. current article, thereby matching the following thread.
  12795. You can also score on @code{thread}, which will try to score all
  12796. articles that appear in a thread. @code{thread} matches uses a
  12797. @code{Message-ID} to match on the @code{References} header of the
  12798. article. If the match is made, the @code{Message-ID} of the article is
  12799. added to the @code{thread} rule. (Think about it. I'd recommend two
  12800. aspirins afterwards.)
  12801. If you use this scheme, you should set the score file atom @code{mark}
  12802. to something small---like -300, perhaps, to avoid having small random
  12803. changes result in articles getting marked as read.
  12804. After using adaptive scoring for a week or so, Gnus should start to
  12805. become properly trained and enhance the authors you like best, and kill
  12806. the authors you like least, without you having to say so explicitly.
  12807. You can control what groups the adaptive scoring is to be performed on
  12808. by using the score files (@pxref{Score File Format}). This will also
  12809. let you use different rules in different groups.
  12810. @vindex gnus-adaptive-file-suffix
  12811. The adaptive score entries will be put into a file where the name is the
  12812. group name with @code{gnus-adaptive-file-suffix} appended. The default
  12813. is @samp{ADAPT}.
  12814. @vindex gnus-score-exact-adapt-limit
  12815. When doing adaptive scoring, substring or fuzzy matching would probably
  12816. give you the best results in most cases. However, if the header one
  12817. matches is short, the possibility for false positives is great, so if
  12818. the length of the match is less than
  12819. @code{gnus-score-exact-adapt-limit}, exact matching will be used. If
  12820. this variable is @code{nil}, exact matching will always be used to avoid
  12821. this problem.
  12822. @vindex gnus-default-adaptive-word-score-alist
  12823. As mentioned above, you can adapt either on individual words or entire
  12824. headers. If you adapt on words, the
  12825. @code{gnus-default-adaptive-word-score-alist} variable says what score
  12826. each instance of a word should add given a mark.
  12827. @lisp
  12828. (setq gnus-default-adaptive-word-score-alist
  12829. `((,gnus-read-mark . 30)
  12830. (,gnus-catchup-mark . -10)
  12831. (,gnus-killed-mark . -20)
  12832. (,gnus-del-mark . -15)))
  12833. @end lisp
  12834. This is the default value. If you have adaption on words enabled, every
  12835. word that appears in subjects of articles marked with
  12836. @code{gnus-read-mark} will result in a score rule that increase the
  12837. score with 30 points.
  12838. @vindex gnus-default-ignored-adaptive-words
  12839. @vindex gnus-ignored-adaptive-words
  12840. Words that appear in the @code{gnus-default-ignored-adaptive-words} list
  12841. will be ignored. If you wish to add more words to be ignored, use the
  12842. @code{gnus-ignored-adaptive-words} list instead.
  12843. @vindex gnus-adaptive-word-syntax-table
  12844. When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
  12845. syntax table in effect. It is similar to the standard syntax table, but
  12846. it considers numbers to be non-word-constituent characters.
  12847. @vindex gnus-adaptive-word-minimum
  12848. If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive
  12849. word scoring process will never bring down the score of an article to
  12850. below this number. The default is @code{nil}.
  12851. @vindex gnus-adaptive-word-no-group-words
  12852. If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus
  12853. won't adaptively word score any of the words in the group name. Useful
  12854. for groups like @samp{comp.editors.emacs}, where most of the subject
  12855. lines contain the word @samp{emacs}.
  12856. After using this scheme for a while, it might be nice to write a
  12857. @code{gnus-psychoanalyze-user} command to go through the rules and see
  12858. what words you like and what words you don't like. Or perhaps not.
  12859. Note that the adaptive word scoring thing is highly experimental and is
  12860. likely to change in the future. Initial impressions seem to indicate
  12861. that it's totally useless as it stands. Some more work (involving more
  12862. rigorous statistical methods) will have to be done to make this useful.
  12863. @node Home Score File
  12864. @section Home Score File
  12865. The score file where new score file entries will go is called the
  12866. @dfn{home score file}. This is normally (and by default) the score file
  12867. for the group itself. For instance, the home score file for
  12868. @samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
  12869. However, this may not be what you want. It is often convenient to share
  12870. a common home score file among many groups---all @samp{emacs} groups
  12871. could perhaps use the same home score file.
  12872. @vindex gnus-home-score-file
  12873. The variable that controls this is @code{gnus-home-score-file}. It can
  12874. be:
  12875. @enumerate
  12876. @item
  12877. A string. Then this file will be used as the home score file for all
  12878. groups.
  12879. @item
  12880. A function. The result of this function will be used as the home score
  12881. file. The function will be called with the name of the group as the
  12882. parameter.
  12883. @item
  12884. A list. The elements in this list can be:
  12885. @enumerate
  12886. @item
  12887. @code{(@var{regexp} @var{file-name})}. If the @var{regexp} matches the
  12888. group name, the @var{file-name} will be used as the home score file.
  12889. @item
  12890. A function. If the function returns non-nil, the result will be used as
  12891. the home score file.
  12892. @item
  12893. A string. Use the string as the home score file.
  12894. @end enumerate
  12895. The list will be traversed from the beginning towards the end looking
  12896. for matches.
  12897. @end enumerate
  12898. So, if you want to use just a single score file, you could say:
  12899. @lisp
  12900. (setq gnus-home-score-file
  12901. "my-total-score-file.SCORE")
  12902. @end lisp
  12903. If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
  12904. @file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
  12905. @findex gnus-hierarchial-home-score-file
  12906. @lisp
  12907. (setq gnus-home-score-file
  12908. 'gnus-hierarchial-home-score-file)
  12909. @end lisp
  12910. This is a ready-made function provided for your convenience.
  12911. Other functions include
  12912. @table @code
  12913. @item gnus-current-home-score-file
  12914. @findex gnus-current-home-score-file
  12915. Return the ``current'' regular score file. This will make scoring
  12916. commands add entry to the ``innermost'' matching score file.
  12917. @end table
  12918. If you want to have one score file for the @samp{emacs} groups and
  12919. another for the @samp{comp} groups, while letting all other groups use
  12920. their own home score files:
  12921. @lisp
  12922. (setq gnus-home-score-file
  12923. ;; All groups that match the regexp "\\.emacs"
  12924. '(("\\.emacs" "emacs.SCORE")
  12925. ;; All the comp groups in one score file
  12926. ("^comp" "comp.SCORE")))
  12927. @end lisp
  12928. @vindex gnus-home-adapt-file
  12929. @code{gnus-home-adapt-file} works exactly the same way as
  12930. @code{gnus-home-score-file}, but says what the home adaptive score file
  12931. is instead. All new adaptive file entries will go into the file
  12932. specified by this variable, and the same syntax is allowed.
  12933. In addition to using @code{gnus-home-score-file} and
  12934. @code{gnus-home-adapt-file}, you can also use group parameters
  12935. (@pxref{Group Parameters}) and topic parameters (@pxref{Topic
  12936. Parameters}) to achieve much the same. Group and topic parameters take
  12937. precedence over this variable.
  12938. @node Followups To Yourself
  12939. @section Followups To Yourself
  12940. Gnus offers two commands for picking out the @code{Message-ID} header in
  12941. the current buffer. Gnus will then add a score rule that scores using
  12942. this @code{Message-ID} on the @code{References} header of other
  12943. articles. This will, in effect, increase the score of all articles that
  12944. respond to the article in the current buffer. Quite useful if you want
  12945. to easily note when people answer what you've said.
  12946. @table @code
  12947. @item gnus-score-followup-article
  12948. @findex gnus-score-followup-article
  12949. This will add a score to articles that directly follow up your own
  12950. article.
  12951. @item gnus-score-followup-thread
  12952. @findex gnus-score-followup-thread
  12953. This will add a score to all articles that appear in a thread ``below''
  12954. your own article.
  12955. @end table
  12956. @vindex message-sent-hook
  12957. These two functions are both primarily meant to be used in hooks like
  12958. @code{message-sent-hook}, like this:
  12959. @lisp
  12960. (add-hook 'message-sent-hook 'gnus-score-followup-thread)
  12961. @end lisp
  12962. If you look closely at your own @code{Message-ID}, you'll notice that
  12963. the first two or three characters are always the same. Here's two of
  12964. mine:
  12965. @example
  12966. <x6u3u47icf.fsf@@eyesore.no>
  12967. <x6sp9o7ibw.fsf@@eyesore.no>
  12968. @end example
  12969. So ``my'' ident on this machine is @samp{x6}. This can be
  12970. exploited---the following rule will raise the score on all followups to
  12971. myself:
  12972. @lisp
  12973. ("references"
  12974. ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore\\.no>"
  12975. 1000 nil r))
  12976. @end lisp
  12977. Whether it's the first two or first three characters that are ``yours''
  12978. is system-dependent.
  12979. @node Scoring Tips
  12980. @section Scoring Tips
  12981. @cindex scoring tips
  12982. @table @dfn
  12983. @item Crossposts
  12984. @cindex crossposts
  12985. @cindex scoring crossposts
  12986. If you want to lower the score of crossposts, the line to match on is
  12987. the @code{Xref} header.
  12988. @lisp
  12989. ("xref" (" talk.politics.misc:" -1000))
  12990. @end lisp
  12991. @item Multiple crossposts
  12992. If you want to lower the score of articles that have been crossposted to
  12993. more than, say, 3 groups:
  12994. @lisp
  12995. ("xref"
  12996. ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+"
  12997. -1000 nil r))
  12998. @end lisp
  12999. @item Matching on the body
  13000. This is generally not a very good idea---it takes a very long time.
  13001. Gnus actually has to fetch each individual article from the server. But
  13002. you might want to anyway, I guess. Even though there are three match
  13003. keys (@code{Head}, @code{Body} and @code{All}), you should choose one
  13004. and stick with it in each score file. If you use any two, each article
  13005. will be fetched @emph{twice}. If you want to match a bit on the
  13006. @code{Head} and a bit on the @code{Body}, just use @code{All} for all
  13007. the matches.
  13008. @item Marking as read
  13009. You will probably want to mark articles that have scores below a certain
  13010. number as read. This is most easily achieved by putting the following
  13011. in your @file{all.SCORE} file:
  13012. @lisp
  13013. ((mark -100))
  13014. @end lisp
  13015. You may also consider doing something similar with @code{expunge}.
  13016. @item Negated character classes
  13017. If you say stuff like @code{[^abcd]*}, you may get unexpected results.
  13018. That will match newlines, which might lead to, well, The Unknown. Say
  13019. @code{[^abcd\n]*} instead.
  13020. @end table
  13021. @node Reverse Scoring
  13022. @section Reverse Scoring
  13023. @cindex reverse scoring
  13024. If you want to keep just articles that have @samp{Sex with Emacs} in the
  13025. subject header, and expunge all other articles, you could put something
  13026. like this in your score file:
  13027. @lisp
  13028. (("subject"
  13029. ("Sex with Emacs" 2))
  13030. (mark 1)
  13031. (expunge 1))
  13032. @end lisp
  13033. So, you raise all articles that match @samp{Sex with Emacs} and mark the
  13034. rest as read, and expunge them to boot.
  13035. @node Global Score Files
  13036. @section Global Score Files
  13037. @cindex global score files
  13038. Sure, other newsreaders have ``global kill files''. These are usually
  13039. nothing more than a single kill file that applies to all groups, stored
  13040. in the user's home directory. Bah! Puny, weak newsreaders!
  13041. What I'm talking about here are Global Score Files. Score files from
  13042. all over the world, from users everywhere, uniting all nations in one
  13043. big, happy score file union! Ange-score! New and untested!
  13044. @vindex gnus-global-score-files
  13045. All you have to do to use other people's score files is to set the
  13046. @code{gnus-global-score-files} variable. One entry for each score file,
  13047. or each score file directory. Gnus will decide by itself what score
  13048. files are applicable to which group.
  13049. To use the score file
  13050. @file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and
  13051. all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory,
  13052. say this:
  13053. @lisp
  13054. (setq gnus-global-score-files
  13055. '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE"
  13056. "/ftp@@ftp.some-where:/pub/score/"))
  13057. @end lisp
  13058. @findex gnus-score-search-global-directories
  13059. @noindent
  13060. Simple, eh? Directory names must end with a @samp{/}. These
  13061. directories are typically scanned only once during each Gnus session.
  13062. If you feel the need to manually re-scan the remote directories, you can
  13063. use the @code{gnus-score-search-global-directories} command.
  13064. Note that, at present, using this option will slow down group entry
  13065. somewhat. (That is---a lot.)
  13066. If you want to start maintaining score files for other people to use,
  13067. just put your score file up for anonymous ftp and announce it to the
  13068. world. Become a retro-moderator! Participate in the retro-moderator
  13069. wars sure to ensue, where retro-moderators battle it out for the
  13070. sympathy of the people, luring them to use their score files on false
  13071. premises! Yay! The net is saved!
  13072. Here are some tips for the would-be retro-moderator, off the top of my
  13073. head:
  13074. @itemize @bullet
  13075. @item
  13076. Articles heavily crossposted are probably junk.
  13077. @item
  13078. To lower a single inappropriate article, lower by @code{Message-ID}.
  13079. @item
  13080. Particularly brilliant authors can be raised on a permanent basis.
  13081. @item
  13082. Authors that repeatedly post off-charter for the group can safely be
  13083. lowered out of existence.
  13084. @item
  13085. Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
  13086. articles completely.
  13087. @item
  13088. Use expiring score entries to keep the size of the file down. You
  13089. should probably have a long expiry period, though, as some sites keep
  13090. old articles for a long time.
  13091. @end itemize
  13092. ... I wonder whether other newsreaders will support global score files
  13093. in the future. @emph{Snicker}. Yup, any day now, newsreaders like Blue
  13094. Wave, xrn and 1stReader are bound to implement scoring. Should we start
  13095. holding our breath yet?
  13096. @node Kill Files
  13097. @section Kill Files
  13098. @cindex kill files
  13099. Gnus still supports those pesky old kill files. In fact, the kill file
  13100. entries can now be expiring, which is something I wrote before Daniel
  13101. Quinlan thought of doing score files, so I've left the code in there.
  13102. In short, kill processing is a lot slower (and I do mean @emph{a lot})
  13103. than score processing, so it might be a good idea to rewrite your kill
  13104. files into score files.
  13105. Anyway, a kill file is a normal @code{emacs-lisp} file. You can put any
  13106. forms into this file, which means that you can use kill files as some
  13107. sort of primitive hook function to be run on group entry, even though
  13108. that isn't a very good idea.
  13109. Normal kill files look like this:
  13110. @lisp
  13111. (gnus-kill "From" "Lars Ingebrigtsen")
  13112. (gnus-kill "Subject" "ding")
  13113. (gnus-expunge "X")
  13114. @end lisp
  13115. This will mark every article written by me as read, and remove the
  13116. marked articles from the summary buffer. Very useful, you'll agree.
  13117. Other programs use a totally different kill file syntax. If Gnus
  13118. encounters what looks like a @code{rn} kill file, it will take a stab at
  13119. interpreting it.
  13120. Two summary functions for editing a GNUS kill file:
  13121. @table @kbd
  13122. @item M-k
  13123. @kindex M-k @r{(Summary)}
  13124. @findex gnus-summary-edit-local-kill
  13125. Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
  13126. @item M-K
  13127. @kindex M-K @r{(Summary)}
  13128. @findex gnus-summary-edit-global-kill
  13129. Edit the general kill file (@code{gnus-summary-edit-global-kill}).
  13130. @end table
  13131. Two group mode functions for editing the kill files:
  13132. @table @kbd
  13133. @item M-k
  13134. @kindex M-k @r{(Group)}
  13135. @findex gnus-group-edit-local-kill
  13136. Edit this group's kill file (@code{gnus-group-edit-local-kill}).
  13137. @item M-K
  13138. @kindex M-K @r{(Group)}
  13139. @findex gnus-group-edit-global-kill
  13140. Edit the general kill file (@code{gnus-group-edit-global-kill}).
  13141. @end table
  13142. Kill file variables:
  13143. @table @code
  13144. @item gnus-kill-file-name
  13145. @vindex gnus-kill-file-name
  13146. A kill file for the group @samp{soc.motss} is normally called
  13147. @file{soc.motss.KILL}. The suffix appended to the group name to get
  13148. this file name is detailed by the @code{gnus-kill-file-name} variable.
  13149. The ``global'' kill file (not in the score file sense of ``global'', of
  13150. course) is just called @file{KILL}.
  13151. @vindex gnus-kill-save-kill-file
  13152. @item gnus-kill-save-kill-file
  13153. If this variable is non-@code{nil}, Gnus will save the
  13154. kill file after processing, which is necessary if you use expiring
  13155. kills.
  13156. @item gnus-apply-kill-hook
  13157. @vindex gnus-apply-kill-hook
  13158. @findex gnus-apply-kill-file-unless-scored
  13159. @findex gnus-apply-kill-file
  13160. A hook called to apply kill files to a group. It is
  13161. @code{(gnus-apply-kill-file)} by default. If you want to ignore the
  13162. kill file if you have a score file for the same group, you can set this
  13163. hook to @code{(gnus-apply-kill-file-unless-scored)}. If you don't want
  13164. kill files to be processed, you should set this variable to @code{nil}.
  13165. @item gnus-kill-file-mode-hook
  13166. @vindex gnus-kill-file-mode-hook
  13167. A hook called in kill-file mode buffers.
  13168. @end table
  13169. @node Converting Kill Files
  13170. @section Converting Kill Files
  13171. @cindex kill files
  13172. @cindex converting kill files
  13173. If you have loads of old kill files, you may want to convert them into
  13174. score files. If they are ``regular'', you can use
  13175. the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
  13176. by hand.
  13177. The kill to score conversion package isn't included in Gnus by default.
  13178. You can fetch it from
  13179. @uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}.
  13180. If your old kill files are very complex---if they contain more
  13181. non-@code{gnus-kill} forms than not, you'll have to convert them by
  13182. hand. Or just let them be as they are. Gnus will still use them as
  13183. before.
  13184. @node GroupLens
  13185. @section GroupLens
  13186. @cindex GroupLens
  13187. GroupLens is a collaborative filtering system that helps you work
  13188. together with other people to find the quality news articles out of the
  13189. huge volume of news articles generated every day.
  13190. To accomplish this the GroupLens system combines your opinions about
  13191. articles you have already read with the opinions of others who have done
  13192. likewise and gives you a personalized prediction for each unread news
  13193. article. Think of GroupLens as a matchmaker. GroupLens watches how you
  13194. rate articles, and finds other people that rate articles the same way.
  13195. Once it has found some people you agree with it tells you, in the form
  13196. of a prediction, what they thought of the article. You can use this
  13197. prediction to help you decide whether or not you want to read the
  13198. article.
  13199. @menu
  13200. * Using GroupLens:: How to make Gnus use GroupLens.
  13201. * Rating Articles:: Letting GroupLens know how you rate articles.
  13202. * Displaying Predictions:: Displaying predictions given by GroupLens.
  13203. * GroupLens Variables:: Customizing GroupLens.
  13204. @end menu
  13205. @node Using GroupLens
  13206. @subsection Using GroupLens
  13207. To use GroupLens you must register a pseudonym with your local Better
  13208. Bit Bureau (BBB).
  13209. @uref{http://www.cs.umn.edu/Research/GroupLens/bbb.html} is the only
  13210. better bit in town at the moment.
  13211. Once you have registered you'll need to set a couple of variables.
  13212. @table @code
  13213. @item gnus-use-grouplens
  13214. @vindex gnus-use-grouplens
  13215. Setting this variable to a non-@code{nil} value will make Gnus hook into
  13216. all the relevant GroupLens functions.
  13217. @item grouplens-pseudonym
  13218. @vindex grouplens-pseudonym
  13219. This variable should be set to the pseudonym you got when registering
  13220. with the Better Bit Bureau.
  13221. @item grouplens-newsgroups
  13222. @vindex grouplens-newsgroups
  13223. A list of groups that you want to get GroupLens predictions for.
  13224. @end table
  13225. That's the minimum of what you need to get up and running with GroupLens.
  13226. Once you've registered, GroupLens will start giving you scores for
  13227. articles based on the average of what other people think. But, to get
  13228. the real benefit of GroupLens you need to start rating articles
  13229. yourself. Then the scores GroupLens gives you will be personalized for
  13230. you, based on how the people you usually agree with have already rated.
  13231. @node Rating Articles
  13232. @subsection Rating Articles
  13233. In GroupLens, an article is rated on a scale from 1 to 5, inclusive.
  13234. Where 1 means something like this article is a waste of bandwidth and 5
  13235. means that the article was really good. The basic question to ask
  13236. yourself is, "on a scale from 1 to 5 would I like to see more articles
  13237. like this one?"
  13238. There are four ways to enter a rating for an article in GroupLens.
  13239. @table @kbd
  13240. @item r
  13241. @kindex r (GroupLens)
  13242. @findex bbb-summary-rate-article
  13243. This function will prompt you for a rating on a scale of one to five.
  13244. @item k
  13245. @kindex k (GroupLens)
  13246. @findex grouplens-score-thread
  13247. This function will prompt you for a rating, and rate all the articles in
  13248. the thread. This is really useful for some of those long running giant
  13249. threads in rec.humor.
  13250. @end table
  13251. The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be
  13252. the score of the article you're reading.
  13253. @table @kbd
  13254. @item 1-5 n
  13255. @kindex n (GroupLens)
  13256. @findex grouplens-next-unread-article
  13257. Rate the article and go to the next unread article.
  13258. @item 1-5 ,
  13259. @kindex , (GroupLens)
  13260. @findex grouplens-best-unread-article
  13261. Rate the article and go to the next unread article with the highest score.
  13262. @end table
  13263. If you want to give the current article a score of 4 and then go to the
  13264. next article, just type @kbd{4 n}.
  13265. @node Displaying Predictions
  13266. @subsection Displaying Predictions
  13267. GroupLens makes a prediction for you about how much you will like a
  13268. news article. The predictions from GroupLens are on a scale from 1 to
  13269. 5, where 1 is the worst and 5 is the best. You can use the predictions
  13270. from GroupLens in one of three ways controlled by the variable
  13271. @code{gnus-grouplens-override-scoring}.
  13272. @vindex gnus-grouplens-override-scoring
  13273. There are three ways to display predictions in grouplens. You may
  13274. choose to have the GroupLens scores contribute to, or override the
  13275. regular gnus scoring mechanism. override is the default; however, some
  13276. people prefer to see the Gnus scores plus the grouplens scores. To get
  13277. the separate scoring behavior you need to set
  13278. @code{gnus-grouplens-override-scoring} to @code{'separate}. To have the
  13279. GroupLens predictions combined with the grouplens scores set it to
  13280. @code{'override} and to combine the scores set
  13281. @code{gnus-grouplens-override-scoring} to @code{'combine}. When you use
  13282. the combine option you will also want to set the values for
  13283. @code{grouplens-prediction-offset} and
  13284. @code{grouplens-score-scale-factor}.
  13285. @vindex grouplens-prediction-display
  13286. In either case, GroupLens gives you a few choices for how you would like
  13287. to see your predictions displayed. The display of predictions is
  13288. controlled by the @code{grouplens-prediction-display} variable.
  13289. The following are valid values for that variable.
  13290. @table @code
  13291. @item prediction-spot
  13292. The higher the prediction, the further to the right an @samp{*} is
  13293. displayed.
  13294. @item confidence-interval
  13295. A numeric confidence interval.
  13296. @item prediction-bar
  13297. The higher the prediction, the longer the bar.
  13298. @item confidence-bar
  13299. Numerical confidence.
  13300. @item confidence-spot
  13301. The spot gets bigger with more confidence.
  13302. @item prediction-num
  13303. Plain-old numeric value.
  13304. @item confidence-plus-minus
  13305. Prediction +/- confidence.
  13306. @end table
  13307. @node GroupLens Variables
  13308. @subsection GroupLens Variables
  13309. @table @code
  13310. @item gnus-summary-grouplens-line-format
  13311. The summary line format used in GroupLens-enhanced summary buffers. It
  13312. accepts the same specs as the normal summary line format (@pxref{Summary
  13313. Buffer Lines}). The default is @samp{%U%R%z%l%I%(%[%4L: %-20,20n%]%)
  13314. %s\n}.
  13315. @item grouplens-bbb-host
  13316. Host running the bbbd server. @samp{grouplens.cs.umn.edu} is the
  13317. default.
  13318. @item grouplens-bbb-port
  13319. Port of the host running the bbbd server. The default is 9000.
  13320. @item grouplens-score-offset
  13321. Offset the prediction by this value. In other words, subtract the
  13322. prediction value by this number to arrive at the effective score. The
  13323. default is 0.
  13324. @item grouplens-score-scale-factor
  13325. This variable allows the user to magnify the effect of GroupLens scores.
  13326. The scale factor is applied after the offset. The default is 1.
  13327. @end table
  13328. @node Advanced Scoring
  13329. @section Advanced Scoring
  13330. Scoring on Subjects and From headers is nice enough, but what if you're
  13331. really interested in what a person has to say only when she's talking
  13332. about a particular subject? Or what if you really don't want to
  13333. read what person A has to say when she's following up to person B, but
  13334. want to read what she says when she's following up to person C?
  13335. By using advanced scoring rules you may create arbitrarily complex
  13336. scoring patterns.
  13337. @menu
  13338. * Advanced Scoring Syntax:: A definition.
  13339. * Advanced Scoring Examples:: What they look like.
  13340. * Advanced Scoring Tips:: Getting the most out of it.
  13341. @end menu
  13342. @node Advanced Scoring Syntax
  13343. @subsection Advanced Scoring Syntax
  13344. Ordinary scoring rules have a string as the first element in the rule.
  13345. Advanced scoring rules have a list as the first element. The second
  13346. element is the score to be applied if the first element evaluated to a
  13347. non-@code{nil} value.
  13348. These lists may consist of three logical operators, one redirection
  13349. operator, and various match operators.
  13350. Logical operators:
  13351. @table @code
  13352. @item &
  13353. @itemx and
  13354. This logical operator will evaluate each of its arguments until it finds
  13355. one that evaluates to @code{false}, and then it'll stop. If all arguments
  13356. evaluate to @code{true} values, then this operator will return
  13357. @code{true}.
  13358. @item |
  13359. @itemx or
  13360. This logical operator will evaluate each of its arguments until it finds
  13361. one that evaluates to @code{true}. If no arguments are @code{true},
  13362. then this operator will return @code{false}.
  13363. @item !
  13364. @itemx not
  13365. @itemx ¬
  13366. This logical operator only takes a single argument. It returns the
  13367. logical negation of the value of its argument.
  13368. @end table
  13369. There is an @dfn{indirection operator} that will make its arguments
  13370. apply to the ancestors of the current article being scored. For
  13371. instance, @code{1-} will make score rules apply to the parent of the
  13372. current article. @code{2-} will make score rules apply to the
  13373. grandparent of the current article. Alternatively, you can write
  13374. @code{^^}, where the number of @code{^}s (carets) says how far back into
  13375. the ancestry you want to go.
  13376. Finally, we have the match operators. These are the ones that do the
  13377. real work. Match operators are header name strings followed by a match
  13378. and a match type. A typical match operator looks like @samp{("from"
  13379. "Lars Ingebrigtsen" s)}. The header names are the same as when using
  13380. simple scoring, and the match types are also the same.
  13381. @node Advanced Scoring Examples
  13382. @subsection Advanced Scoring Examples
  13383. Let's say you want to increase the score of articles written by Lars
  13384. when he's talking about Gnus:
  13385. @example
  13386. ((&
  13387. ("from" "Lars Ingebrigtsen")
  13388. ("subject" "Gnus"))
  13389. 1000)
  13390. @end example
  13391. Quite simple, huh?
  13392. When he writes long articles, he sometimes has something nice to say:
  13393. @example
  13394. ((&
  13395. ("from" "Lars Ingebrigtsen")
  13396. (|
  13397. ("subject" "Gnus")
  13398. ("lines" 100 >)))
  13399. 1000)
  13400. @end example
  13401. However, when he responds to things written by Reig Eigil Logge, you
  13402. really don't want to read what he's written:
  13403. @example
  13404. ((&
  13405. ("from" "Lars Ingebrigtsen")
  13406. (1- ("from" "Reig Eigir Logge")))
  13407. -100000)
  13408. @end example
  13409. Everybody that follows up Redmondo when he writes about disappearing
  13410. socks should have their scores raised, but only when they talk about
  13411. white socks. However, when Lars talks about socks, it's usually not
  13412. very interesting:
  13413. @example
  13414. ((&
  13415. (1-
  13416. (&
  13417. ("from" "redmondo@@.*no" r)
  13418. ("body" "disappearing.*socks" t)))
  13419. (! ("from" "Lars Ingebrigtsen"))
  13420. ("body" "white.*socks"))
  13421. 1000)
  13422. @end example
  13423. The possibilities are endless.
  13424. @node Advanced Scoring Tips
  13425. @subsection Advanced Scoring Tips
  13426. The @code{&} and @code{|} logical operators do short-circuit logic.
  13427. That is, they stop processing their arguments when it's clear what the
  13428. result of the operation will be. For instance, if one of the arguments
  13429. of an @code{&} evaluates to @code{false}, there's no point in evaluating
  13430. the rest of the arguments. This means that you should put slow matches
  13431. (@samp{body}, @samp{header}) last and quick matches (@samp{from},
  13432. @samp{subject}) first.
  13433. The indirection arguments (@code{1-} and so on) will make their
  13434. arguments work on previous generations of the thread. If you say
  13435. something like:
  13436. @example
  13437. ...
  13438. (1-
  13439. (1-
  13440. ("from" "lars")))
  13441. ...
  13442. @end example
  13443. Then that means "score on the from header of the grandparent of the
  13444. current article". An indirection is quite fast, but it's better to say:
  13445. @example
  13446. (1-
  13447. (&
  13448. ("from" "Lars")
  13449. ("subject" "Gnus")))
  13450. @end example
  13451. than it is to say:
  13452. @example
  13453. (&
  13454. (1- ("from" "Lars"))
  13455. (1- ("subject" "Gnus")))
  13456. @end example
  13457. @node Score Decays
  13458. @section Score Decays
  13459. @cindex score decays
  13460. @cindex decays
  13461. You may find that your scores have a tendency to grow without
  13462. bounds, especially if you're using adaptive scoring. If scores get too
  13463. big, they lose all meaning---they simply max out and it's difficult to
  13464. use them in any sensible way.
  13465. @vindex gnus-decay-scores
  13466. @findex gnus-decay-score
  13467. @vindex gnus-decay-score-function
  13468. Gnus provides a mechanism for decaying scores to help with this problem.
  13469. When score files are loaded and @code{gnus-decay-scores} is
  13470. non-@code{nil}, Gnus will run the score files through the decaying
  13471. mechanism thereby lowering the scores of all non-permanent score rules.
  13472. The decay itself if performed by the @code{gnus-decay-score-function}
  13473. function, which is @code{gnus-decay-score} by default. Here's the
  13474. definition of that function:
  13475. @lisp
  13476. (defun gnus-decay-score (score)
  13477. "Decay SCORE.
  13478. This is done according to `gnus-score-decay-constant'
  13479. and `gnus-score-decay-scale'."
  13480. (floor
  13481. (- score
  13482. (* (if (< score 0) 1 -1)
  13483. (min (abs score)
  13484. (max gnus-score-decay-constant
  13485. (* (abs score)
  13486. gnus-score-decay-scale)))))))
  13487. @end lisp
  13488. @vindex gnus-score-decay-scale
  13489. @vindex gnus-score-decay-constant
  13490. @code{gnus-score-decay-constant} is 3 by default and
  13491. @code{gnus-score-decay-scale} is 0.05. This should cause the following:
  13492. @enumerate
  13493. @item
  13494. Scores between -3 and 3 will be set to 0 when this function is called.
  13495. @item
  13496. Scores with magnitudes between 3 and 60 will be shrunk by 3.
  13497. @item
  13498. Scores with magnitudes greater than 60 will be shrunk by 5% of the
  13499. score.
  13500. @end enumerate
  13501. If you don't like this decay function, write your own. It is called
  13502. with the score to be decayed as its only parameter, and it should return
  13503. the new score, which should be an integer.
  13504. Gnus will try to decay scores once a day. If you haven't run Gnus for
  13505. four days, Gnus will decay the scores four times, for instance.
  13506. @node Various
  13507. @chapter Various
  13508. @menu
  13509. * Process/Prefix:: A convention used by many treatment commands.
  13510. * Interactive:: Making Gnus ask you many questions.
  13511. * Symbolic Prefixes:: How to supply some Gnus functions with options.
  13512. * Formatting Variables:: You can specify what buffers should look like.
  13513. * Windows Configuration:: Configuring the Gnus buffer windows.
  13514. * Faces and Fonts:: How to change how faces look.
  13515. * Compilation:: How to speed Gnus up.
  13516. * Mode Lines:: Displaying information in the mode lines.
  13517. * Highlighting and Menus:: Making buffers look all nice and cozy.
  13518. * Buttons:: Get tendonitis in ten easy steps!
  13519. * Daemons:: Gnus can do things behind your back.
  13520. * NoCeM:: How to avoid spam and other fatty foods.
  13521. * Undo:: Some actions can be undone.
  13522. * Moderation:: What to do if you're a moderator.
  13523. * Emacs Enhancements:: There can be more pictures and stuff under
  13524. Emacs 21.
  13525. * XEmacs Enhancements:: There are more pictures and stuff under XEmacs.
  13526. * Fuzzy Matching:: What's the big fuzz?
  13527. * Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email.
  13528. * Various Various:: Things that are really various.
  13529. @end menu
  13530. @node Process/Prefix
  13531. @section Process/Prefix
  13532. @cindex process/prefix convention
  13533. Many functions, among them functions for moving, decoding and saving
  13534. articles, use what is known as the @dfn{Process/Prefix convention}.
  13535. This is a method for figuring out what articles the user wants the
  13536. command to be performed on.
  13537. It goes like this:
  13538. If the numeric prefix is N, perform the operation on the next N
  13539. articles, starting with the current one. If the numeric prefix is
  13540. negative, perform the operation on the previous N articles, starting
  13541. with the current one.
  13542. @vindex transient-mark-mode
  13543. If @code{transient-mark-mode} in non-@code{nil} and the region is
  13544. active, all articles in the region will be worked upon.
  13545. If there is no numeric prefix, but some articles are marked with the
  13546. process mark, perform the operation on the articles marked with
  13547. the process mark.
  13548. If there is neither a numeric prefix nor any articles marked with the
  13549. process mark, just perform the operation on the current article.
  13550. Quite simple, really, but it needs to be made clear so that surprises
  13551. are avoided.
  13552. Commands that react to the process mark will push the current list of
  13553. process marked articles onto a stack and will then clear all process
  13554. marked articles. You can restore the previous configuration with the
  13555. @kbd{M P y} command (@pxref{Setting Process Marks}).
  13556. @vindex gnus-summary-goto-unread
  13557. One thing that seems to shock & horrify lots of people is that, for
  13558. instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}.
  13559. Since each @kbd{d} (which marks the current article as read) by default
  13560. goes to the next unread article after marking, this means that @kbd{3 d}
  13561. will mark the next three unread articles as read, no matter what the
  13562. summary buffer looks like. Set @code{gnus-summary-goto-unread} to
  13563. @code{nil} for a more straightforward action.
  13564. Many commands do not use the process/prefix convention. All commands
  13565. that do explicitly say so in this manual. To apply the process/prefix
  13566. convention to commands that do not use it, you can use the @kbd{M-&}
  13567. command. For instance, to mark all the articles in the group as
  13568. expirable, you could say @kbd{M P b M-& E}.
  13569. @node Interactive
  13570. @section Interactive
  13571. @cindex interaction
  13572. @table @code
  13573. @item gnus-novice-user
  13574. @vindex gnus-novice-user
  13575. If this variable is non-@code{nil}, you are either a newcomer to the
  13576. World of Usenet, or you are very cautious, which is a nice thing to be,
  13577. really. You will be given questions of the type ``Are you sure you want
  13578. to do this?'' before doing anything dangerous. This is @code{t} by
  13579. default.
  13580. @item gnus-expert-user
  13581. @vindex gnus-expert-user
  13582. If this variable is non-@code{nil}, you will seldom be asked any
  13583. questions by Gnus. It will simply assume you know what you're doing, no
  13584. matter how strange.
  13585. @item gnus-interactive-catchup
  13586. @vindex gnus-interactive-catchup
  13587. Require confirmation before catching up a group if non-@code{nil}. It
  13588. is @code{t} by default.
  13589. @item gnus-interactive-exit
  13590. @vindex gnus-interactive-exit
  13591. Require confirmation before exiting Gnus. This variable is @code{t} by
  13592. default.
  13593. @end table
  13594. @node Symbolic Prefixes
  13595. @section Symbolic Prefixes
  13596. @cindex symbolic prefixes
  13597. Quite a lot of Emacs commands react to the (numeric) prefix. For
  13598. instance, @kbd{C-u 4 C-f} moves point four characters forward, and
  13599. @kbd{C-u 9 0 0 I s s p} adds a permanent @code{Subject} substring score
  13600. rule of 900 to the current article.
  13601. This is all nice and well, but what if you want to give a command some
  13602. additional information? Well, what most commands do is interpret the
  13603. ``raw'' prefix in some special way. @kbd{C-u 0 C-x C-s} means that one
  13604. doesn't want a backup file to be created when saving the current buffer,
  13605. for instance. But what if you want to save without making a backup
  13606. file, and you want Emacs to flash lights and play a nice tune at the
  13607. same time? You can't, and you're probably perfectly happy that way.
  13608. @kindex M-i @r{(Summary)}
  13609. @findex gnus-symbolic-argument
  13610. I'm not, so I've added a second prefix---the @dfn{symbolic prefix}. The
  13611. prefix key is @kbd{M-i} (@code{gnus-symbolic-argument}), and the next
  13612. character typed in is the value. You can stack as many @kbd{M-i}
  13613. prefixes as you want. @kbd{M-i a C-M-u} means ``feed the @kbd{C-M-u}
  13614. command the symbolic prefix @code{a}''. @kbd{M-i a M-i b C-M-u} means
  13615. ``feed the @kbd{C-M-u} command the symbolic prefixes @code{a} and
  13616. @code{b}''. You get the drift.
  13617. Typing in symbolic prefixes to commands that don't accept them doesn't
  13618. hurt, but it doesn't do any good either. Currently not many Gnus
  13619. functions make use of the symbolic prefix.
  13620. If you're interested in how Gnus implements this, @pxref{Extended
  13621. Interactive}.
  13622. @node Formatting Variables
  13623. @section Formatting Variables
  13624. @cindex formatting variables
  13625. Throughout this manual you've probably noticed lots of variables called
  13626. things like @code{gnus-group-line-format} and
  13627. @code{gnus-summary-mode-line-format}. These control how Gnus is to
  13628. output lines in the various buffers. There's quite a lot of them.
  13629. Fortunately, they all use the same syntax, so there's not that much to
  13630. be annoyed by.
  13631. Here's an example format spec (from the group buffer): @samp{%M%S%5y:
  13632. %(%g%)\n}. We see that it is indeed extremely ugly, and that there are
  13633. lots of percentages everywhere.
  13634. @menu
  13635. * Formatting Basics:: A formatting variable is basically a format string.
  13636. * Mode Line Formatting:: Some rules about mode line formatting variables.
  13637. * Advanced Formatting:: Modifying output in various ways.
  13638. * User-Defined Specs:: Having Gnus call your own functions.
  13639. * Formatting Fonts:: Making the formatting look colorful and nice.
  13640. @end menu
  13641. Currently Gnus uses the following formatting variables:
  13642. @code{gnus-group-line-format}, @code{gnus-summary-line-format},
  13643. @code{gnus-server-line-format}, @code{gnus-topic-line-format},
  13644. @code{gnus-group-mode-line-format},
  13645. @code{gnus-summary-mode-line-format},
  13646. @code{gnus-article-mode-line-format},
  13647. @code{gnus-server-mode-line-format}, and
  13648. @code{gnus-summary-pick-line-format}.
  13649. All these format variables can also be arbitrary elisp forms. In that
  13650. case, they will be @code{eval}ed to insert the required lines.
  13651. @kindex M-x gnus-update-format
  13652. @findex gnus-update-format
  13653. Gnus includes a command to help you while creating your own format
  13654. specs. @kbd{M-x gnus-update-format} will @code{eval} the current form,
  13655. update the spec in question and pop you to a buffer where you can
  13656. examine the resulting lisp code to be run to generate the line.
  13657. @node Formatting Basics
  13658. @subsection Formatting Basics
  13659. Each @samp{%} element will be replaced by some string or other when the
  13660. buffer in question is generated. @samp{%5y} means ``insert the @samp{y}
  13661. spec, and pad with spaces to get a 5-character field''.
  13662. As with normal C and Emacs Lisp formatting strings, the numerical
  13663. modifier between the @samp{%} and the formatting type character will
  13664. @dfn{pad} the output so that it is always at least that long.
  13665. @samp{%5y} will make the field always (at least) five characters wide by
  13666. padding with spaces to the left. If you say @samp{%-5y}, it will pad to
  13667. the right instead.
  13668. You may also wish to limit the length of the field to protect against
  13669. particularly wide values. For that you can say @samp{%4,6y}, which
  13670. means that the field will never be more than 6 characters wide and never
  13671. less than 4 characters wide.
  13672. @node Mode Line Formatting
  13673. @subsection Mode Line Formatting
  13674. Mode line formatting variables (e.g.,
  13675. @code{gnus-summary-mode-line-format}) follow the same rules as other,
  13676. buffer line oriented formatting variables (@pxref{Formatting Basics})
  13677. with the following two differences:
  13678. @enumerate
  13679. @item
  13680. There must be no newline (@samp{\n}) at the end.
  13681. @item
  13682. The special @samp{%%b} spec can be used to display the buffer name.
  13683. Well, it's no spec at all, really---@samp{%%} is just a way to quote
  13684. @samp{%} to allow it to pass through the formatting machinery unmangled,
  13685. so that Emacs receives @samp{%b}, which is something the Emacs mode line
  13686. display interprets to mean ``show the buffer name''. For a full list of
  13687. mode line specs Emacs understands, see the documentation of the
  13688. @code{mode-line-format} variable.
  13689. @end enumerate
  13690. @node Advanced Formatting
  13691. @subsection Advanced Formatting
  13692. It is frequently useful to post-process the fields in some way.
  13693. Padding, limiting, cutting off parts and suppressing certain values can
  13694. be achieved by using @dfn{tilde modifiers}. A typical tilde spec might
  13695. look like @samp{%~(cut 3)~(ignore "0")y}.
  13696. These are the valid modifiers:
  13697. @table @code
  13698. @item pad
  13699. @itemx pad-left
  13700. Pad the field to the left with spaces until it reaches the required
  13701. length.
  13702. @item pad-right
  13703. Pad the field to the right with spaces until it reaches the required
  13704. length.
  13705. @item max
  13706. @itemx max-left
  13707. Cut off characters from the left until it reaches the specified length.
  13708. @item max-right
  13709. Cut off characters from the right until it reaches the specified
  13710. length.
  13711. @item cut
  13712. @itemx cut-left
  13713. Cut off the specified number of characters from the left.
  13714. @item cut-right
  13715. Cut off the specified number of characters from the right.
  13716. @item ignore
  13717. Return an empty string if the field is equal to the specified value.
  13718. @item form
  13719. Use the specified form as the field value when the @samp{@@} spec is
  13720. used.
  13721. @end table
  13722. Let's take an example. The @samp{%o} spec in the summary mode lines
  13723. will return a date in compact ISO8601 format---@samp{19960809T230410}.
  13724. This is quite a mouthful, so we want to shave off the century number and
  13725. the time, leaving us with a six-character date. That would be
  13726. @samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}. (Cutting is done before
  13727. maxing, and we need the padding to ensure that the date is never less
  13728. than 6 characters to make it look nice in columns.)
  13729. Ignoring is done first; then cutting; then maxing; and then as the very
  13730. last operation, padding.
  13731. If you use lots of these advanced thingies, you'll find that Gnus gets
  13732. quite slow. This can be helped enormously by running @kbd{M-x
  13733. gnus-compile} when you are satisfied with the look of your lines.
  13734. @xref{Compilation}.
  13735. @node User-Defined Specs
  13736. @subsection User-Defined Specs
  13737. All the specs allow for inserting user defined specifiers---@samp{u}.
  13738. The next character in the format string should be a letter. Gnus
  13739. will call the function @code{gnus-user-format-function-}@samp{X}, where
  13740. @samp{X} is the letter following @samp{%u}. The function will be passed
  13741. a single parameter---what the parameter means depends on what buffer
  13742. it's being called from. The function should return a string, which will
  13743. be inserted into the buffer just like information from any other
  13744. specifier. This function may also be called with dummy values, so it
  13745. should protect against that.
  13746. You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve
  13747. much the same without defining new functions. Here's an example:
  13748. @samp{%~(form (count-lines (point-min) (point)))@@}. The form
  13749. given here will be evaluated to yield the current line number, and then
  13750. inserted.
  13751. @node Formatting Fonts
  13752. @subsection Formatting Fonts
  13753. There are specs for highlighting, and these are shared by all the format
  13754. variables. Text inside the @samp{%(} and @samp{%)} specifiers will get
  13755. the special @code{mouse-face} property set, which means that it will be
  13756. highlighted (with @code{gnus-mouse-face}) when you put the mouse pointer
  13757. over it.
  13758. Text inside the @samp{%@{} and @samp{%@}} specifiers will have their
  13759. normal faces set using @code{gnus-face-0}, which is @code{bold} by
  13760. default. If you say @samp{%1@{}, you'll get @code{gnus-face-1} instead,
  13761. and so on. Create as many faces as you wish. The same goes for the
  13762. @code{mouse-face} specs---you can say @samp{%3(hello%)} to have
  13763. @samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}.
  13764. Text inside the @samp{%<} and @samp{%>} specifiers will get the special
  13765. @code{balloon-help} property set to @code{gnus-balloon-face-0}. If you
  13766. say @samp{%1<}, you'll get @code{gnus-balloon-face-1} and so on. The
  13767. @code{gnus-balloon-face-*} variables should be either strings or symbols
  13768. naming functions that return a string. Under @code{balloon-help-mode},
  13769. when the mouse passes over text with this property set, a balloon window
  13770. will appear and display the string. Please refer to the doc string of
  13771. @code{balloon-help-mode} for more information on this.
  13772. Here's an alternative recipe for the group buffer:
  13773. @lisp
  13774. ;; Create three face types.
  13775. (setq gnus-face-1 'bold)
  13776. (setq gnus-face-3 'italic)
  13777. ;; We want the article count to be in
  13778. ;; a bold and green face. So we create
  13779. ;; a new face called `my-green-bold'.
  13780. (copy-face 'bold 'my-green-bold)
  13781. ;; Set the color.
  13782. (set-face-foreground 'my-green-bold "ForestGreen")
  13783. (setq gnus-face-2 'my-green-bold)
  13784. ;; Set the new & fancy format.
  13785. (setq gnus-group-line-format
  13786. "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n")
  13787. @end lisp
  13788. I'm sure you'll be able to use this scheme to create totally unreadable
  13789. and extremely vulgar displays. Have fun!
  13790. Note that the @samp{%(} specs (and friends) do not make any sense on the
  13791. mode-line variables.
  13792. @node Windows Configuration
  13793. @section Windows Configuration
  13794. @cindex windows configuration
  13795. No, there's nothing here about X, so be quiet.
  13796. @vindex gnus-use-full-window
  13797. If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all
  13798. other windows and occupy the entire Emacs screen by itself. It is
  13799. @code{t} by default.
  13800. Setting this variable to @code{nil} kinda works, but there are
  13801. glitches. Use at your own peril.
  13802. @vindex gnus-buffer-configuration
  13803. @code{gnus-buffer-configuration} describes how much space each Gnus
  13804. buffer should be given. Here's an excerpt of this variable:
  13805. @lisp
  13806. ((group (vertical 1.0 (group 1.0 point)
  13807. (if gnus-carpal (group-carpal 4))))
  13808. (article (vertical 1.0 (summary 0.25 point)
  13809. (article 1.0))))
  13810. @end lisp
  13811. This is an alist. The @dfn{key} is a symbol that names some action or
  13812. other. For instance, when displaying the group buffer, the window
  13813. configuration function will use @code{group} as the key. A full list of
  13814. possible names is listed below.
  13815. The @dfn{value} (i.e., the @dfn{split}) says how much space each buffer
  13816. should occupy. To take the @code{article} split as an example -
  13817. @lisp
  13818. (article (vertical 1.0 (summary 0.25 point)
  13819. (article 1.0)))
  13820. @end lisp
  13821. This @dfn{split} says that the summary buffer should occupy 25% of upper
  13822. half of the screen, and that it is placed over the article buffer. As
  13823. you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all
  13824. reaching for that calculator there). However, the special number
  13825. @code{1.0} is used to signal that this buffer should soak up all the
  13826. rest of the space available after the rest of the buffers have taken
  13827. whatever they need. There should be only one buffer with the @code{1.0}
  13828. size spec per split.
  13829. Point will be put in the buffer that has the optional third element
  13830. @code{point}. In a @code{frame} split, the last subsplit having a leaf
  13831. split where the tag @code{frame-focus} is a member (i.e. is the third or
  13832. fourth element in the list, depending on whether the @code{point} tag is
  13833. present) gets focus.
  13834. Here's a more complicated example:
  13835. @lisp
  13836. (article (vertical 1.0 (group 4)
  13837. (summary 0.25 point)
  13838. (if gnus-carpal (summary-carpal 4))
  13839. (article 1.0)))
  13840. @end lisp
  13841. If the size spec is an integer instead of a floating point number,
  13842. then that number will be used to say how many lines a buffer should
  13843. occupy, not a percentage.
  13844. If the @dfn{split} looks like something that can be @code{eval}ed (to be
  13845. precise---if the @code{car} of the split is a function or a subr), this
  13846. split will be @code{eval}ed. If the result is non-@code{nil}, it will
  13847. be used as a split. This means that there will be three buffers if
  13848. @code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal}
  13849. is non-@code{nil}.
  13850. Not complicated enough for you? Well, try this on for size:
  13851. @lisp
  13852. (article (horizontal 1.0
  13853. (vertical 0.5
  13854. (group 1.0)
  13855. (gnus-carpal 4))
  13856. (vertical 1.0
  13857. (summary 0.25 point)
  13858. (summary-carpal 4)
  13859. (article 1.0))))
  13860. @end lisp
  13861. Whoops. Two buffers with the mystery 100% tag. And what's that
  13862. @code{horizontal} thingie?
  13863. If the first element in one of the split is @code{horizontal}, Gnus will
  13864. split the window horizontally, giving you two windows side-by-side.
  13865. Inside each of these strips you may carry on all you like in the normal
  13866. fashion. The number following @code{horizontal} says what percentage of
  13867. the screen is to be given to this strip.
  13868. For each split, there @emph{must} be one element that has the 100% tag.
  13869. The splitting is never accurate, and this buffer will eat any leftover
  13870. lines from the splits.
  13871. To be slightly more formal, here's a definition of what a valid split
  13872. may look like:
  13873. @example
  13874. split = frame | horizontal | vertical | buffer | form
  13875. frame = "(frame " size *split ")"
  13876. horizontal = "(horizontal " size *split ")"
  13877. vertical = "(vertical " size *split ")"
  13878. buffer = "(" buf-name " " size *[ "point" ] *[ "frame-focus"] ")"
  13879. size = number | frame-params
  13880. buf-name = group | article | summary ...
  13881. @end example
  13882. The limitations are that the @code{frame} split can only appear as the
  13883. top-level split. @var{form} should be an Emacs Lisp form that should
  13884. return a valid split. We see that each split is fully recursive, and
  13885. may contain any number of @code{vertical} and @code{horizontal} splits.
  13886. @vindex gnus-window-min-width
  13887. @vindex gnus-window-min-height
  13888. @cindex window height
  13889. @cindex window width
  13890. Finding the right sizes can be a bit complicated. No window may be less
  13891. than @code{gnus-window-min-height} (default 1) characters high, and all
  13892. windows must be at least @code{gnus-window-min-width} (default 1)
  13893. characters wide. Gnus will try to enforce this before applying the
  13894. splits. If you want to use the normal Emacs window width/height limit,
  13895. you can just set these two variables to @code{nil}.
  13896. If you're not familiar with Emacs terminology, @code{horizontal} and
  13897. @code{vertical} splits may work the opposite way of what you'd expect.
  13898. Windows inside a @code{horizontal} split are shown side-by-side, and
  13899. windows within a @code{vertical} split are shown above each other.
  13900. @findex gnus-configure-frame
  13901. If you want to experiment with window placement, a good tip is to call
  13902. @code{gnus-configure-frame} directly with a split. This is the function
  13903. that does all the real work when splitting buffers. Below is a pretty
  13904. nonsensical configuration with 5 windows; two for the group buffer and
  13905. three for the article buffer. (I said it was nonsensical.) If you
  13906. @code{eval} the statement below, you can get an idea of how that would
  13907. look straight away, without going through the normal Gnus channels.
  13908. Play with it until you're satisfied, and then use
  13909. @code{gnus-add-configuration} to add your new creation to the buffer
  13910. configuration list.
  13911. @lisp
  13912. (gnus-configure-frame
  13913. '(horizontal 1.0
  13914. (vertical 10
  13915. (group 1.0)
  13916. (article 0.3 point))
  13917. (vertical 1.0
  13918. (article 1.0)
  13919. (horizontal 4
  13920. (group 1.0)
  13921. (article 10)))))
  13922. @end lisp
  13923. You might want to have several frames as well. No prob---just use the
  13924. @code{frame} split:
  13925. @lisp
  13926. (gnus-configure-frame
  13927. '(frame 1.0
  13928. (vertical 1.0
  13929. (summary 0.25 point frame-focus)
  13930. (article 1.0))
  13931. (vertical ((height . 5) (width . 15)
  13932. (user-position . t)
  13933. (left . -1) (top . 1))
  13934. (picon 1.0))))
  13935. @end lisp
  13936. This split will result in the familiar summary/article window
  13937. configuration in the first (or ``main'') frame, while a small additional
  13938. frame will be created where picons will be shown. As you can see,
  13939. instead of the normal @code{1.0} top-level spec, each additional split
  13940. should have a frame parameter alist as the size spec.
  13941. @xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp
  13942. Reference Manual}. Under XEmacs, a frame property list will be
  13943. accepted, too---for instance, @code{(height 5 width 15 left -1 top 1)}
  13944. is such a plist.
  13945. The list of all possible keys for @code{gnus-buffer-configuration} can
  13946. be found in its default value.
  13947. Note that the @code{message} key is used for both
  13948. @code{gnus-group-mail} and @code{gnus-summary-mail-other-window}. If
  13949. it is desirable to distinguish between the two, something like this
  13950. might be used:
  13951. @lisp
  13952. (message (horizontal 1.0
  13953. (vertical 1.0 (message 1.0 point))
  13954. (vertical 0.24
  13955. (if (buffer-live-p gnus-summary-buffer)
  13956. '(summary 0.5))
  13957. (group 1.0)))))
  13958. @end lisp
  13959. One common desire for a multiple frame split is to have a separate frame
  13960. for composing mail and news while leaving the original frame intact. To
  13961. accomplish that, something like the following can be done:
  13962. @lisp
  13963. (message
  13964. (frame 1.0
  13965. (if (not (buffer-live-p gnus-summary-buffer))
  13966. (car (cdr (assoc 'group gnus-buffer-configuration)))
  13967. (car (cdr (assoc 'summary gnus-buffer-configuration))))
  13968. (vertical ((user-position . t) (top . 1) (left . 1)
  13969. (name . "Message"))
  13970. (message 1.0 point))))
  13971. @end lisp
  13972. @findex gnus-add-configuration
  13973. Since the @code{gnus-buffer-configuration} variable is so long and
  13974. complicated, there's a function you can use to ease changing the config
  13975. of a single setting: @code{gnus-add-configuration}. If, for instance,
  13976. you want to change the @code{article} setting, you could say:
  13977. @lisp
  13978. (gnus-add-configuration
  13979. '(article (vertical 1.0
  13980. (group 4)
  13981. (summary .25 point)
  13982. (article 1.0))))
  13983. @end lisp
  13984. You'd typically stick these @code{gnus-add-configuration} calls in your
  13985. @file{.gnus.el} file or in some startup hook---they should be run after
  13986. Gnus has been loaded.
  13987. @vindex gnus-always-force-window-configuration
  13988. If all windows mentioned in the configuration are already visible, Gnus
  13989. won't change the window configuration. If you always want to force the
  13990. ``right'' window configuration, you can set
  13991. @code{gnus-always-force-window-configuration} to non-@code{nil}.
  13992. If you're using tree displays (@pxref{Tree Display}), and the tree
  13993. window is displayed vertically next to another window, you may also want
  13994. to fiddle with @code{gnus-tree-minimize-window} to avoid having the
  13995. windows resized.
  13996. @subsection Example Window Configurations
  13997. @itemize @bullet
  13998. @item
  13999. Narrow left hand side occupied by group buffer. Right hand side split
  14000. between summary buffer (top one-sixth) and article buffer (bottom).
  14001. @ifinfo
  14002. @example
  14003. +---+---------+
  14004. | G | Summary |
  14005. | r +---------+
  14006. | o | |
  14007. | u | Article |
  14008. | p | |
  14009. +---+---------+
  14010. @end example
  14011. @end ifinfo
  14012. @lisp
  14013. (gnus-add-configuration
  14014. '(article
  14015. (horizontal 1.0
  14016. (vertical 25 (group 1.0))
  14017. (vertical 1.0
  14018. (summary 0.16 point)
  14019. (article 1.0)))))
  14020. (gnus-add-configuration
  14021. '(summary
  14022. (horizontal 1.0
  14023. (vertical 25 (group 1.0))
  14024. (vertical 1.0 (summary 1.0 point)))))
  14025. @end lisp
  14026. @end itemize
  14027. @node Faces and Fonts
  14028. @section Faces and Fonts
  14029. @cindex faces
  14030. @cindex fonts
  14031. @cindex colors
  14032. Fiddling with fonts and faces used to be very difficult, but these days
  14033. it is very simple. You simply say @kbd{M-x customize-face}, pick out
  14034. the face you want to alter, and alter it via the standard Customize
  14035. interface.
  14036. @node Compilation
  14037. @section Compilation
  14038. @cindex compilation
  14039. @cindex byte-compilation
  14040. @findex gnus-compile
  14041. Remember all those line format specification variables?
  14042. @code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so
  14043. on. Now, Gnus will of course heed whatever these variables are, but,
  14044. unfortunately, changing them will mean a quite significant slow-down.
  14045. (The default values of these variables have byte-compiled functions
  14046. associated with them, while the user-generated versions do not, of
  14047. course.)
  14048. To help with this, you can run @kbd{M-x gnus-compile} after you've
  14049. fiddled around with the variables and feel that you're (kind of)
  14050. satisfied. This will result in the new specs being byte-compiled, and
  14051. you'll get top speed again. Gnus will save these compiled specs in the
  14052. @file{.newsrc.eld} file. (User-defined functions aren't compiled by
  14053. this function, though---you should compile them yourself by sticking
  14054. them into the @code{.gnus.el} file and byte-compiling that file.)
  14055. @node Mode Lines
  14056. @section Mode Lines
  14057. @cindex mode lines
  14058. @vindex gnus-updated-mode-lines
  14059. @code{gnus-updated-mode-lines} says what buffers should keep their mode
  14060. lines updated. It is a list of symbols. Supported symbols include
  14061. @code{group}, @code{article}, @code{summary}, @code{server},
  14062. @code{browse}, and @code{tree}. If the corresponding symbol is present,
  14063. Gnus will keep that mode line updated with information that may be
  14064. pertinent. If this variable is @code{nil}, screen refresh may be
  14065. quicker.
  14066. @cindex display-time
  14067. @vindex gnus-mode-non-string-length
  14068. By default, Gnus displays information on the current article in the mode
  14069. lines of the summary and article buffers. The information Gnus wishes
  14070. to display (e.g. the subject of the article) is often longer than the
  14071. mode lines, and therefore have to be cut off at some point. The
  14072. @code{gnus-mode-non-string-length} variable says how long the other
  14073. elements on the line is (i.e., the non-info part). If you put
  14074. additional elements on the mode line (e.g. a clock), you should modify
  14075. this variable:
  14076. @c Hook written by Francesco Potorti` <pot@cnuce.cnr.it>
  14077. @lisp
  14078. (add-hook 'display-time-hook
  14079. (lambda () (setq gnus-mode-non-string-length
  14080. (+ 21
  14081. (if line-number-mode 5 0)
  14082. (if column-number-mode 4 0)
  14083. (length display-time-string)))))
  14084. @end lisp
  14085. If this variable is @code{nil} (which is the default), the mode line
  14086. strings won't be chopped off, and they won't be padded either. Note
  14087. that the default is unlikely to be desirable, as even the percentage
  14088. complete in the buffer may be crowded off the mode line; the user should
  14089. configure this variable appropriately for her configuration.
  14090. @node Highlighting and Menus
  14091. @section Highlighting and Menus
  14092. @cindex visual
  14093. @cindex highlighting
  14094. @cindex menus
  14095. @vindex gnus-visual
  14096. The @code{gnus-visual} variable controls most of the Gnus-prettifying
  14097. aspects. If @code{nil}, Gnus won't attempt to create menus or use fancy
  14098. colors or fonts. This will also inhibit loading the @file{gnus-vis.el}
  14099. file.
  14100. This variable can be a list of visual properties that are enabled. The
  14101. following elements are valid, and are all included by default:
  14102. @table @code
  14103. @item group-highlight
  14104. Do highlights in the group buffer.
  14105. @item summary-highlight
  14106. Do highlights in the summary buffer.
  14107. @item article-highlight
  14108. Do highlights in the article buffer.
  14109. @item highlight
  14110. Turn on highlighting in all buffers.
  14111. @item group-menu
  14112. Create menus in the group buffer.
  14113. @item summary-menu
  14114. Create menus in the summary buffers.
  14115. @item article-menu
  14116. Create menus in the article buffer.
  14117. @item browse-menu
  14118. Create menus in the browse buffer.
  14119. @item server-menu
  14120. Create menus in the server buffer.
  14121. @item score-menu
  14122. Create menus in the score buffers.
  14123. @item menu
  14124. Create menus in all buffers.
  14125. @end table
  14126. So if you only want highlighting in the article buffer and menus in all
  14127. buffers, you could say something like:
  14128. @lisp
  14129. (setq gnus-visual '(article-highlight menu))
  14130. @end lisp
  14131. If you want highlighting only and no menus whatsoever, you'd say:
  14132. @lisp
  14133. (setq gnus-visual '(highlight))
  14134. @end lisp
  14135. If @code{gnus-visual} is @code{t}, highlighting and menus will be used
  14136. in all Gnus buffers.
  14137. Other general variables that influence the look of all buffers include:
  14138. @table @code
  14139. @item gnus-mouse-face
  14140. @vindex gnus-mouse-face
  14141. This is the face (i.e., font) used for mouse highlighting in Gnus. No
  14142. mouse highlights will be done if @code{gnus-visual} is @code{nil}.
  14143. @end table
  14144. There are hooks associated with the creation of all the different menus:
  14145. @table @code
  14146. @item gnus-article-menu-hook
  14147. @vindex gnus-article-menu-hook
  14148. Hook called after creating the article mode menu.
  14149. @item gnus-group-menu-hook
  14150. @vindex gnus-group-menu-hook
  14151. Hook called after creating the group mode menu.
  14152. @item gnus-summary-menu-hook
  14153. @vindex gnus-summary-menu-hook
  14154. Hook called after creating the summary mode menu.
  14155. @item gnus-server-menu-hook
  14156. @vindex gnus-server-menu-hook
  14157. Hook called after creating the server mode menu.
  14158. @item gnus-browse-menu-hook
  14159. @vindex gnus-browse-menu-hook
  14160. Hook called after creating the browse mode menu.
  14161. @item gnus-score-menu-hook
  14162. @vindex gnus-score-menu-hook
  14163. Hook called after creating the score mode menu.
  14164. @end table
  14165. @node Buttons
  14166. @section Buttons
  14167. @cindex buttons
  14168. @cindex mouse
  14169. @cindex click
  14170. Those new-fangled @dfn{mouse} contraptions are very popular with the
  14171. young, hep kids who don't want to learn the proper way to do things
  14172. these days. Why, I remember way back in the summer of '89, when I was
  14173. using Emacs on a Tops 20 system. Three hundred users on one single
  14174. machine, and every user was running Simula compilers. Bah!
  14175. Right.
  14176. @vindex gnus-carpal
  14177. Well, you can make Gnus display buffers full of buttons you can click to
  14178. do anything by setting @code{gnus-carpal} to @code{t}. Pretty simple,
  14179. really. Tell the chiropractor I sent you.
  14180. @table @code
  14181. @item gnus-carpal-mode-hook
  14182. @vindex gnus-carpal-mode-hook
  14183. Hook run in all carpal mode buffers.
  14184. @item gnus-carpal-button-face
  14185. @vindex gnus-carpal-button-face
  14186. Face used on buttons.
  14187. @item gnus-carpal-header-face
  14188. @vindex gnus-carpal-header-face
  14189. Face used on carpal buffer headers.
  14190. @item gnus-carpal-group-buffer-buttons
  14191. @vindex gnus-carpal-group-buffer-buttons
  14192. Buttons in the group buffer.
  14193. @item gnus-carpal-summary-buffer-buttons
  14194. @vindex gnus-carpal-summary-buffer-buttons
  14195. Buttons in the summary buffer.
  14196. @item gnus-carpal-server-buffer-buttons
  14197. @vindex gnus-carpal-server-buffer-buttons
  14198. Buttons in the server buffer.
  14199. @item gnus-carpal-browse-buffer-buttons
  14200. @vindex gnus-carpal-browse-buffer-buttons
  14201. Buttons in the browse buffer.
  14202. @end table
  14203. All the @code{buttons} variables are lists. The elements in these list
  14204. are either cons cells where the @code{car} contains a text to be displayed and
  14205. the @code{cdr} contains a function symbol, or a simple string.
  14206. @node Daemons
  14207. @section Daemons
  14208. @cindex demons
  14209. @cindex daemons
  14210. Gnus, being larger than any program ever written (allegedly), does lots
  14211. of strange stuff that you may wish to have done while you're not
  14212. present. For instance, you may want it to check for new mail once in a
  14213. while. Or you may want it to close down all connections to all servers
  14214. when you leave Emacs idle. And stuff like that.
  14215. Gnus will let you do stuff like that by defining various
  14216. @dfn{handlers}. Each handler consists of three elements: A
  14217. @var{function}, a @var{time}, and an @var{idle} parameter.
  14218. Here's an example of a handler that closes connections when Emacs has
  14219. been idle for thirty minutes:
  14220. @lisp
  14221. (gnus-demon-close-connections nil 30)
  14222. @end lisp
  14223. Here's a handler that scans for PGP headers every hour when Emacs is
  14224. idle:
  14225. @lisp
  14226. (gnus-demon-scan-pgp 60 t)
  14227. @end lisp
  14228. This @var{time} parameter and than @var{idle} parameter work together
  14229. in a strange, but wonderful fashion. Basically, if @var{idle} is
  14230. @code{nil}, then the function will be called every @var{time} minutes.
  14231. If @var{idle} is @code{t}, then the function will be called after
  14232. @var{time} minutes only if Emacs is idle. So if Emacs is never idle,
  14233. the function will never be called. But once Emacs goes idle, the
  14234. function will be called every @var{time} minutes.
  14235. If @var{idle} is a number and @var{time} is a number, the function will
  14236. be called every @var{time} minutes only when Emacs has been idle for
  14237. @var{idle} minutes.
  14238. If @var{idle} is a number and @var{time} is @code{nil}, the function
  14239. will be called once every time Emacs has been idle for @var{idle}
  14240. minutes.
  14241. And if @var{time} is a string, it should look like @samp{07:31}, and
  14242. the function will then be called once every day somewhere near that
  14243. time. Modified by the @var{idle} parameter, of course.
  14244. @vindex gnus-demon-timestep
  14245. (When I say ``minute'' here, I really mean @code{gnus-demon-timestep}
  14246. seconds. This is 60 by default. If you change that variable,
  14247. all the timings in the handlers will be affected.)
  14248. So, if you want to add a handler, you could put something like this in
  14249. your @file{.gnus} file:
  14250. @findex gnus-demon-add-handler
  14251. @lisp
  14252. (gnus-demon-add-handler 'gnus-demon-close-connections 30 t)
  14253. @end lisp
  14254. @findex gnus-demon-add-nocem
  14255. @findex gnus-demon-add-scanmail
  14256. @findex gnus-demon-add-rescan
  14257. @findex gnus-demon-add-scan-timestamps
  14258. @findex gnus-demon-add-disconnection
  14259. Some ready-made functions to do this have been created:
  14260. @code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection},
  14261. @code{gnus-demon-add-nntp-close-connection},
  14262. @code{gnus-demon-add-scan-timestamps}, @code{gnus-demon-add-rescan}, and
  14263. @code{gnus-demon-add-scanmail}. Just put those functions in your
  14264. @file{.gnus} if you want those abilities.
  14265. @findex gnus-demon-init
  14266. @findex gnus-demon-cancel
  14267. @vindex gnus-demon-handlers
  14268. If you add handlers to @code{gnus-demon-handlers} directly, you should
  14269. run @code{gnus-demon-init} to make the changes take hold. To cancel all
  14270. daemons, you can use the @code{gnus-demon-cancel} function.
  14271. Note that adding daemons can be pretty naughty if you over do it. Adding
  14272. functions that scan all news and mail from all servers every two seconds
  14273. is a sure-fire way of getting booted off any respectable system. So
  14274. behave.
  14275. @node NoCeM
  14276. @section NoCeM
  14277. @cindex nocem
  14278. @cindex spam
  14279. @dfn{Spamming} is posting the same article lots and lots of times.
  14280. Spamming is bad. Spamming is evil.
  14281. Spamming is usually canceled within a day or so by various anti-spamming
  14282. agencies. These agencies usually also send out @dfn{NoCeM} messages.
  14283. NoCeM is pronounced ``no see-'em'', and means what the name
  14284. implies---these are messages that make the offending articles, like, go
  14285. away.
  14286. What use are these NoCeM messages if the articles are canceled anyway?
  14287. Some sites do not honor cancel messages and some sites just honor cancels
  14288. from a select few people. Then you may wish to make use of the NoCeM
  14289. messages, which are distributed in the @samp{alt.nocem.misc} newsgroup.
  14290. Gnus can read and parse the messages in this group automatically, and
  14291. this will make spam disappear.
  14292. There are some variables to customize, of course:
  14293. @table @code
  14294. @item gnus-use-nocem
  14295. @vindex gnus-use-nocem
  14296. Set this variable to @code{t} to set the ball rolling. It is @code{nil}
  14297. by default.
  14298. @item gnus-nocem-groups
  14299. @vindex gnus-nocem-groups
  14300. Gnus will look for NoCeM messages in the groups in this list. The
  14301. default is @code{("news.lists.filters" "news.admin.net-abuse.bulletins"
  14302. "alt.nocem.misc" "news.admin.net-abuse.announce")}.
  14303. @item gnus-nocem-issuers
  14304. @vindex gnus-nocem-issuers
  14305. There are many people issuing NoCeM messages. This list says what
  14306. people you want to listen to. The default is @code{("Automoose-1"
  14307. "clewis@@ferret.ocunix.on.ca" "cosmo.roadkill" "SpamHippo"
  14308. "hweede@@snafu.de")}; fine, upstanding citizens all of them.
  14309. Known despammers that you can put in this list are listed at
  14310. @uref{http://www.xs4all.nl/~rosalind/nocemreg/nocemreg.html}.
  14311. You do not have to heed NoCeM messages from all these people---just the
  14312. ones you want to listen to. You also don't have to accept all NoCeM
  14313. messages from the people you like. Each NoCeM message has a @dfn{type}
  14314. header that gives the message a (more or less, usually less) rigorous
  14315. definition. Common types are @samp{spam}, @samp{spew}, @samp{mmf},
  14316. @samp{binary}, and @samp{troll}. To specify this, you have to use
  14317. @code{(@var{issuer} @var{conditions} @dots{})} elements in the list.
  14318. Each condition is either a string (which is a regexp that matches types
  14319. you want to use) or a list on the form @code{(not @var{string})}, where
  14320. @var{string} is a regexp that matches types you don't want to use.
  14321. For instance, if you want all NoCeM messages from Chris Lewis except his
  14322. @samp{troll} messages, you'd say:
  14323. @lisp
  14324. ("clewis@@ferret.ocunix.on.ca" ".*" (not "troll"))
  14325. @end lisp
  14326. On the other hand, if you just want nothing but his @samp{spam} and
  14327. @samp{spew} messages, you'd say:
  14328. @lisp
  14329. ("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam")
  14330. @end lisp
  14331. The specs are applied left-to-right.
  14332. @item gnus-nocem-verifyer
  14333. @vindex gnus-nocem-verifyer
  14334. @findex mc-verify
  14335. This should be a function for verifying that the NoCeM issuer is who she
  14336. says she is. The default is @code{mc-verify}, which is a Mailcrypt
  14337. function. If this is too slow and you don't care for verification
  14338. (which may be dangerous), you can set this variable to @code{nil}.
  14339. If you want signed NoCeM messages to be verified and unsigned messages
  14340. not to be verified (but used anyway), you could do something like:
  14341. @lisp
  14342. (setq gnus-nocem-verifyer 'my-gnus-mc-verify)
  14343. (defun my-gnus-mc-verify ()
  14344. (not (eq 'forged
  14345. (ignore-errors
  14346. (if (mc-verify)
  14347. t
  14348. 'forged)))))
  14349. @end lisp
  14350. This might be dangerous, though.
  14351. @item gnus-nocem-directory
  14352. @vindex gnus-nocem-directory
  14353. This is where Gnus will store its NoCeM cache files. The default is
  14354. @file{~/News/NoCeM/}.
  14355. @item gnus-nocem-expiry-wait
  14356. @vindex gnus-nocem-expiry-wait
  14357. The number of days before removing old NoCeM entries from the cache.
  14358. The default is 15. If you make it shorter Gnus will be faster, but you
  14359. might then see old spam.
  14360. @item gnus-nocem-check-from
  14361. @vindex gnus-nocem-check-from
  14362. Non-@code{nil} means check for valid issuers in message bodies.
  14363. Otherwise don't bother fetching articles unless their author matches a
  14364. valid issuer; that is much faster if you are selective about the
  14365. issuers.
  14366. @item gnus-nocem-check-article-limit
  14367. @vindex gnus-nocem-check-article-limit
  14368. If non-@code{nil}, the maximum number of articles to check in any NoCeM
  14369. group. NoCeM groups can be huge and very slow to process.
  14370. @end table
  14371. Using NoCeM could potentially be a memory hog. If you have many living
  14372. (i. e., subscribed or unsubscribed groups), your Emacs process will grow
  14373. big. If this is a problem, you should kill off all (or most) of your
  14374. unsubscribed groups (@pxref{Subscription Commands}).
  14375. @node Undo
  14376. @section Undo
  14377. @cindex undo
  14378. It is very useful to be able to undo actions one has done. In normal
  14379. Emacs buffers, it's easy enough---you just push the @code{undo} button.
  14380. In Gnus buffers, however, it isn't that simple.
  14381. The things Gnus displays in its buffer is of no value whatsoever to
  14382. Gnus---it's all just data designed to look nice to the user.
  14383. Killing a group in the group buffer with @kbd{C-k} makes the line
  14384. disappear, but that's just a side-effect of the real action---the
  14385. removal of the group in question from the internal Gnus structures.
  14386. Undoing something like that can't be done by the normal Emacs
  14387. @code{undo} function.
  14388. Gnus tries to remedy this somewhat by keeping track of what the user
  14389. does and coming up with actions that would reverse the actions the user
  14390. takes. When the user then presses the @code{undo} key, Gnus will run
  14391. the code to reverse the previous action, or the previous actions.
  14392. However, not all actions are easily reversible, so Gnus currently offers
  14393. a few key functions to be undoable. These include killing groups,
  14394. yanking groups, and changing the list of read articles of groups.
  14395. That's it, really. More functions may be added in the future, but each
  14396. added function means an increase in data to be stored, so Gnus will
  14397. never be totally undoable.
  14398. @findex gnus-undo-mode
  14399. @vindex gnus-use-undo
  14400. @findex gnus-undo
  14401. The undoability is provided by the @code{gnus-undo-mode} minor mode. It
  14402. is used if @code{gnus-use-undo} is non-@code{nil}, which is the
  14403. default. The @kbd{C-M-_} key performs the @code{gnus-undo}
  14404. command, which should feel kinda like the normal Emacs @code{undo}
  14405. command.
  14406. @node Moderation
  14407. @section Moderation
  14408. @cindex moderation
  14409. If you are a moderator, you can use the @file{gnus-mdrtn.el} package.
  14410. It is not included in the standard Gnus package. Write a mail to
  14411. @samp{larsi@@gnus.org} and state what group you moderate, and you'll
  14412. get a copy.
  14413. The moderation package is implemented as a minor mode for summary
  14414. buffers. Put
  14415. @lisp
  14416. (add-hook 'gnus-summary-mode-hook 'gnus-moderate)
  14417. @end lisp
  14418. in your @file{.gnus.el} file.
  14419. If you are the moderator of @samp{rec.zoofle}, this is how it's
  14420. supposed to work:
  14421. @enumerate
  14422. @item
  14423. You split your incoming mail by matching on
  14424. @samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-posted
  14425. articles in some mail group---for instance, @samp{nnml:rec.zoofle}.
  14426. @item
  14427. You enter that group once in a while and post articles using the @kbd{e}
  14428. (edit-and-post) or @kbd{s} (just send unedited) commands.
  14429. @item
  14430. If, while reading the @samp{rec.zoofle} newsgroup, you happen upon some
  14431. articles that weren't approved by you, you can cancel them with the
  14432. @kbd{c} command.
  14433. @end enumerate
  14434. To use moderation mode in these two groups, say:
  14435. @lisp
  14436. (setq gnus-moderated-list
  14437. "^nnml:rec.zoofle$\\|^rec.zoofle$")
  14438. @end lisp
  14439. @node Emacs Enhancements
  14440. @section Emacs Enhancements
  14441. @cindex Emacs 21
  14442. Starting with version 21, Emacs is able to display pictures and stuff,
  14443. so Gnus has taken advantage of that.
  14444. Gnus-specific tool bars will be used if Tool Bar mode is on. Currently
  14445. the group, summary and message buffers have tool bars defined.
  14446. MIME image types may be displayed internally if Emacs was built with
  14447. appropriate support (see variable @code{image-types}). `X-Face' headers
  14448. may be rendered as images internally if you have appropriate support
  14449. programs (@pxref{X-Face}). You can play sounds internally if Emacs was
  14450. built with suitable audio support; otherwise Gnus will attempt to play
  14451. sounds externally.
  14452. @vindex gnus-treat-display-smileys
  14453. A simplified version of the XEmacs Smiley support for @dfn{emoticons}
  14454. (@pxref{Smileys}) is available on graphical displays under the control
  14455. of @code{gnus-treat-display-smileys}. Text `smiley' faces---@samp{:-)},
  14456. @samp{:-/}, @samp{:-(} and the like---are mapped to pictures which are
  14457. displayed instead. The mapping is controlled by a list of regexps
  14458. @vindex smiley-regexp-alist
  14459. @code{smiley-regexp-alist} mapping matched text to image file names. It
  14460. contains matches for `smiley', `wry' and `frowny' by default.
  14461. There is currently no Emacs support for `Picons' (@pxref{Picons}), but
  14462. there is no reason why it couldn't be added.
  14463. @node XEmacs Enhancements
  14464. @section XEmacs Enhancements
  14465. @cindex XEmacs
  14466. XEmacs is able to display pictures and stuff, so Gnus has taken
  14467. advantage of that.
  14468. @menu
  14469. * Picons:: How to display pictures of what your reading.
  14470. * Smileys:: Show all those happy faces the way they were meant to be shown.
  14471. * Toolbar:: Click'n'drool.
  14472. * XVarious:: Other XEmacsy Gnusey variables.
  14473. @end menu
  14474. @node Picons
  14475. @subsection Picons
  14476. @iftex
  14477. @iflatex
  14478. \include{picons}
  14479. @end iflatex
  14480. @end iftex
  14481. So@dots{} You want to slow down your news reader even more! This is a
  14482. good way to do so. Its also a great way to impress people staring
  14483. over your shoulder as you read news.
  14484. @menu
  14485. * Picon Basics:: What are picons and How do I get them.
  14486. * Picon Requirements:: Don't go further if you aren't using XEmacs.
  14487. * Easy Picons:: Displaying Picons---the easy way.
  14488. * Hard Picons:: The way you should do it. You'll learn something.
  14489. * Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with.
  14490. @end menu
  14491. @node Picon Basics
  14492. @subsubsection Picon Basics
  14493. What are Picons? To quote directly from the Picons Web site:
  14494. @iftex
  14495. @iflatex
  14496. \margindex{}
  14497. @end iflatex
  14498. @end iftex
  14499. @quotation
  14500. @dfn{Picons} is short for ``personal icons''. They're small,
  14501. constrained images used to represent users and domains on the net,
  14502. organized into databases so that the appropriate image for a given
  14503. e-mail address can be found. Besides users and domains, there are picon
  14504. databases for Usenet newsgroups and weather forecasts. The picons are
  14505. in either monochrome @code{XBM} format or color @code{XPM} and
  14506. @code{GIF} formats.
  14507. @end quotation
  14508. @vindex gnus-picons-piconsearch-url
  14509. If you have a permanent connection to the Internet you can use Steve
  14510. Kinzler's Picons Search engine by setting
  14511. @code{gnus-picons-piconsearch-url} to the string @*
  14512. @uref{http://www.cs.indiana.edu/picons/search.html}.
  14513. @vindex gnus-picons-database
  14514. Otherwise you need a local copy of his database. For instructions on
  14515. obtaining and installing the picons databases, point your Web browser at @*
  14516. @uref{http://www.cs.indiana.edu/picons/ftp/index.html}. Gnus expects
  14517. picons to be installed into a location pointed to by
  14518. @code{gnus-picons-database}.
  14519. @node Picon Requirements
  14520. @subsubsection Picon Requirements
  14521. To have Gnus display Picons for you, you must be running XEmacs
  14522. 19.13 or greater since all other versions of Emacs aren't yet able to
  14523. display images.
  14524. Additionally, you must have @code{x} support compiled into XEmacs. To
  14525. display color picons which are much nicer than the black & white one,
  14526. you also need one of @code{xpm} or @code{gif} compiled into XEmacs.
  14527. @vindex gnus-picons-convert-x-face
  14528. If you want to display faces from @code{X-Face} headers, you should have
  14529. the @code{xface} support compiled into XEmacs. Otherwise you must have
  14530. the @code{netpbm} utilities installed, or munge the
  14531. @code{gnus-picons-convert-x-face} variable to use something else.
  14532. @node Easy Picons
  14533. @subsubsection Easy Picons
  14534. To enable displaying picons, simply put the following line in your
  14535. @file{~/.gnus} file and start Gnus.
  14536. @lisp
  14537. (setq gnus-use-picons t)
  14538. (setq gnus-treat-display-picons t)
  14539. @end lisp
  14540. and make sure @code{gnus-picons-database} points to the directory
  14541. containing the Picons databases.
  14542. Alternatively if you want to use the web piconsearch engine add this:
  14543. @lisp
  14544. (setq gnus-picons-piconsearch-url
  14545. "http://www.cs.indiana.edu:800/piconsearch")
  14546. @end lisp
  14547. @node Hard Picons
  14548. @subsubsection Hard Picons
  14549. @iftex
  14550. @iflatex
  14551. \margindex{}
  14552. @end iflatex
  14553. @end iftex
  14554. Gnus can display picons for you as you enter and leave groups and
  14555. articles. It knows how to interact with three sections of the picons
  14556. database. Namely, it can display the picons newsgroup pictures,
  14557. author's face picture(s), and the authors domain. To enable this
  14558. feature, you need to select where to get the picons from, and where to
  14559. display them.
  14560. @table @code
  14561. @item gnus-picons-database
  14562. @vindex gnus-picons-database
  14563. The location of the picons database. Should point to a directory
  14564. containing the @file{news}, @file{domains}, @file{users} (and so on)
  14565. subdirectories. This is only useful if
  14566. @code{gnus-picons-piconsearch-url} is @code{nil}. Defaults to
  14567. @file{/usr/local/faces/}.
  14568. @item gnus-picons-piconsearch-url
  14569. @vindex gnus-picons-piconsearch-url
  14570. The URL for the web picons search engine. The only currently known
  14571. engine is @uref{http://www.cs.indiana.edu:800/piconsearch}. To
  14572. workaround network delays, icons will be fetched in the background. If
  14573. this is @code{nil} 'the default), then picons are fetched from local
  14574. database indicated by @code{gnus-picons-database}.
  14575. @item gnus-picons-display-where
  14576. @vindex gnus-picons-display-where
  14577. Where the picon images should be displayed. It is @code{picons} by
  14578. default (which by default maps to the buffer @samp{*Picons*}). Other
  14579. valid places could be @code{article}, @code{summary}, or
  14580. @samp{*scratch*} for all I care. Just make sure that you've made the
  14581. buffer visible using the standard Gnus window configuration
  14582. routines---@pxref{Windows Configuration}.
  14583. @item gnus-picons-group-excluded-groups
  14584. @vindex gnus-picons-group-excluded-groups
  14585. Groups that are matched by this regexp won't have their group icons
  14586. displayed.
  14587. @end table
  14588. Note: If you set @code{gnus-use-picons} to @code{t}, it will set up your
  14589. window configuration for you to include the @code{picons} buffer.
  14590. Now that you've made those decision, you need to add the following
  14591. functions to the appropriate hooks so these pictures will get displayed
  14592. at the right time.
  14593. @vindex gnus-picons-display-where
  14594. @table @code
  14595. @item gnus-article-display-picons
  14596. @findex gnus-article-display-picons
  14597. Looks up and displays the picons for the author and the author's domain
  14598. in the @code{gnus-picons-display-where} buffer.
  14599. @item gnus-picons-article-display-x-face
  14600. @findex gnus-article-display-picons
  14601. Decodes and displays the X-Face header if present.
  14602. @end table
  14603. @node Picon Useless Configuration
  14604. @subsubsection Picon Useless Configuration
  14605. @iftex
  14606. @iflatex
  14607. \margindex{}
  14608. @end iflatex
  14609. @end iftex
  14610. The following variables offer further control over how things are
  14611. done, where things are located, and other useless stuff you really
  14612. don't need to worry about.
  14613. @table @code
  14614. @item gnus-picons-news-directories
  14615. @vindex gnus-picons-news-directories
  14616. List of subdirectories to search in @code{gnus-picons-database} for
  14617. newsgroups faces. @code{("news")} is the default.
  14618. @item gnus-picons-user-directories
  14619. @vindex gnus-picons-user-directories
  14620. List of subdirectories to search in @code{gnus-picons-database} for user
  14621. faces. @code{("local" "users" "usenix" "misc")} is the default.
  14622. @item gnus-picons-domain-directories
  14623. @vindex gnus-picons-domain-directories
  14624. List of subdirectories to search in @code{gnus-picons-database} for
  14625. domain name faces. Defaults to @code{("domains")}. Some people may
  14626. want to add @samp{"unknown"} to this list.
  14627. @item gnus-picons-convert-x-face
  14628. @vindex gnus-picons-convert-x-face
  14629. If you don't have @code{xface} support builtin XEmacs, this is the
  14630. command to use to convert the @code{X-Face} header to an X bitmap
  14631. (@code{xbm}). Defaults to @code{(format "@{ echo '/* Width=48,
  14632. Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s"
  14633. gnus-picons-x-face-file-name)}
  14634. @item gnus-picons-x-face-file-name
  14635. @vindex gnus-picons-x-face-file-name
  14636. Names a temporary file to store the @code{X-Face} bitmap in. Defaults
  14637. to @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}.
  14638. @item gnus-picons-has-modeline-p
  14639. @vindex gnus-picons-has-modeline-p
  14640. If you have set @code{gnus-picons-display-where} to @code{picons}, your
  14641. XEmacs frame will become really cluttered. To alleviate this a bit you
  14642. can set @code{gnus-picons-has-modeline-p} to @code{nil}; this will
  14643. remove the mode line from the Picons buffer. This is only useful if
  14644. @code{gnus-picons-display-where} is @code{picons}.
  14645. @item gnus-picons-refresh-before-display
  14646. @vindex gnus-picons-refresh-before-display
  14647. If non-nil, display the article buffer before computing the picons.
  14648. Defaults to @code{nil}.
  14649. @item gnus-picons-display-as-address
  14650. @vindex gnus-picons-display-as-address
  14651. If @code{t} display textual email addresses along with pictures.
  14652. Defaults to @code{t}.
  14653. @item gnus-picons-file-suffixes
  14654. @vindex gnus-picons-file-suffixes
  14655. Ordered list of suffixes on picon file names to try. Defaults to
  14656. @code{("xpm" "gif" "xbm")} minus those not builtin your XEmacs.
  14657. @item gnus-picons-setup-hook
  14658. @vindex gnus-picons-setup-hook
  14659. Hook run in the picon buffer, if that is displayed.
  14660. @item gnus-picons-display-article-move-p
  14661. @vindex gnus-picons-display-article-move-p
  14662. Whether to move point to first empty line when displaying picons. This
  14663. has only an effect if `gnus-picons-display-where' has value `article'.
  14664. If @code{nil}, display the picons in the @code{From} and
  14665. @code{Newsgroups} lines. This is the default.
  14666. @item gnus-picons-clear-cache-on-shutdown
  14667. @vindex gnus-picons-clear-cache-on-shutdown
  14668. Whether to clear the picons cache when exiting gnus. Gnus caches every
  14669. picons it finds while it is running. This saves some time in the search
  14670. process but eats some memory. If this variable is set to @code{nil},
  14671. Gnus will never clear the cache itself; you will have to manually call
  14672. @code{gnus-picons-clear-cache} to clear it. Otherwise the cache will be
  14673. cleared every time you exit Gnus. Defaults to @code{t}.
  14674. @iftex
  14675. @iflatex
  14676. \margindex{}
  14677. @end iflatex
  14678. @end iftex
  14679. @end table
  14680. @node Smileys
  14681. @subsection Smileys
  14682. @cindex smileys
  14683. @iftex
  14684. @iflatex
  14685. \gnusfig{-3cm}{0.5cm}{\epsfig{figure=tmp/BigFace.ps,height=20cm}}
  14686. \input{smiley}
  14687. @end iflatex
  14688. @end iftex
  14689. @dfn{Smiley} is a package separate from Gnus, but since Gnus is
  14690. currently the only package that uses Smiley, it is documented here.
  14691. In short---to use Smiley in Gnus, put the following in your
  14692. @file{.gnus.el} file:
  14693. @lisp
  14694. (setq gnus-treat-display-smileys t)
  14695. @end lisp
  14696. Smiley maps text smiley faces---@samp{:-)}, @samp{:-=}, @samp{:-(} and
  14697. the like---to pictures and displays those instead of the text smiley
  14698. faces. The conversion is controlled by a list of regexps that matches
  14699. text and maps that to file names.
  14700. @vindex smiley-nosey-regexp-alist
  14701. @vindex smiley-deformed-regexp-alist
  14702. Smiley supplies two example conversion alists by default:
  14703. @code{smiley-deformed-regexp-alist} (which matches @samp{:)}, @samp{:(}
  14704. and so on), and @code{smiley-nosey-regexp-alist} (which matches
  14705. @samp{:-)}, @samp{:-(} and so on).
  14706. The alist used is specified by the @code{smiley-regexp-alist} variable,
  14707. which defaults to the value of @code{smiley-deformed-regexp-alist}.
  14708. The first item in each element is the regexp to be matched; the second
  14709. element is the regexp match group that is to be replaced by the picture;
  14710. and the third element is the name of the file to be displayed.
  14711. The following variables customize where Smiley will look for these
  14712. files, as well as the color to be used and stuff:
  14713. @table @code
  14714. @item smiley-data-directory
  14715. @vindex smiley-data-directory
  14716. Where Smiley will look for smiley faces files.
  14717. @item smiley-flesh-color
  14718. @vindex smiley-flesh-color
  14719. Skin color. The default is @samp{yellow}, which is really racist.
  14720. @item smiley-features-color
  14721. @vindex smiley-features-color
  14722. Color of the features of the face. The default is @samp{black}.
  14723. @item smiley-tongue-color
  14724. @vindex smiley-tongue-color
  14725. Color of the tongue. The default is @samp{red}.
  14726. @item smiley-circle-color
  14727. @vindex smiley-circle-color
  14728. Color of the circle around the face. The default is @samp{black}.
  14729. @item smiley-mouse-face
  14730. @vindex smiley-mouse-face
  14731. Face used for mouse highlighting over the smiley face.
  14732. @end table
  14733. @node Toolbar
  14734. @subsection Toolbar
  14735. @table @code
  14736. @iftex
  14737. @iflatex
  14738. \margindex{}
  14739. @end iflatex
  14740. @end iftex
  14741. @item gnus-use-toolbar
  14742. @vindex gnus-use-toolbar
  14743. If @code{nil}, don't display toolbars. If non-@code{nil}, it should be
  14744. one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar},
  14745. @code{right-toolbar}, or @code{left-toolbar}.
  14746. @item gnus-group-toolbar
  14747. @vindex gnus-group-toolbar
  14748. The toolbar in the group buffer.
  14749. @item gnus-summary-toolbar
  14750. @vindex gnus-summary-toolbar
  14751. The toolbar in the summary buffer.
  14752. @item gnus-summary-mail-toolbar
  14753. @vindex gnus-summary-mail-toolbar
  14754. The toolbar in the summary buffer of mail groups.
  14755. @end table
  14756. @node XVarious
  14757. @subsection Various XEmacs Variables
  14758. @table @code
  14759. @item gnus-xmas-glyph-directory
  14760. @vindex gnus-xmas-glyph-directory
  14761. This is where Gnus will look for pictures. Gnus will normally
  14762. auto-detect this directory, but you may set it manually if you have an
  14763. unusual directory structure.
  14764. @item gnus-xmas-logo-color-alist
  14765. @vindex gnus-xmas-logo-color-alist
  14766. This is an alist where the key is a type symbol and the values are the
  14767. foreground and background color of the splash page glyph.
  14768. @item gnus-xmas-logo-color-style
  14769. @vindex gnus-xmas-logo-color-style
  14770. This is the key used to look up the color in the alist described above.
  14771. Valid values include @code{flame}, @code{pine}, @code{moss},
  14772. @code{irish}, @code{sky}, @code{tin}, @code{velvet}, @code{grape},
  14773. @code{labia}, @code{berry}, @code{neutral}, and @code{september}.
  14774. @item gnus-xmas-modeline-glyph
  14775. @vindex gnus-xmas-modeline-glyph
  14776. A glyph displayed in all Gnus mode lines. It is a tiny gnu head by
  14777. default.
  14778. @iftex
  14779. @iflatex
  14780. \margindex{}
  14781. @end iflatex
  14782. @end iftex
  14783. @end table
  14784. @node Fuzzy Matching
  14785. @section Fuzzy Matching
  14786. @cindex fuzzy matching
  14787. Gnus provides @dfn{fuzzy matching} of @code{Subject} lines when doing
  14788. things like scoring, thread gathering and thread comparison.
  14789. As opposed to regular expression matching, fuzzy matching is very fuzzy.
  14790. It's so fuzzy that there's not even a definition of what @dfn{fuzziness}
  14791. means, and the implementation has changed over time.
  14792. Basically, it tries to remove all noise from lines before comparing.
  14793. @samp{Re: }, parenthetical remarks, white space, and so on, are filtered
  14794. out of the strings before comparing the results. This often leads to
  14795. adequate results---even when faced with strings generated by text
  14796. manglers masquerading as newsreaders.
  14797. @node Thwarting Email Spam
  14798. @section Thwarting Email Spam
  14799. @cindex email spam
  14800. @cindex spam
  14801. @cindex UCE
  14802. @cindex unsolicited commercial email
  14803. In these last days of the Usenet, commercial vultures are hanging about
  14804. and grepping through news like crazy to find email addresses they can
  14805. foist off their scams and products to. As a reaction to this, many
  14806. people have started putting nonsense addresses into their @code{From}
  14807. lines. I think this is counterproductive---it makes it difficult for
  14808. people to send you legitimate mail in response to things you write, as
  14809. well as making it difficult to see who wrote what. This rewriting may
  14810. perhaps be a bigger menace than the unsolicited commercial email itself
  14811. in the end.
  14812. The biggest problem I have with email spam is that it comes in under
  14813. false pretenses. I press @kbd{g} and Gnus merrily informs me that I
  14814. have 10 new emails. I say ``Golly gee! Happy is me!'' and select the
  14815. mail group, only to find two pyramid schemes, seven advertisements
  14816. (``New! Miracle tonic for growing full, lustrous hair on your toes!'')
  14817. and one mail asking me to repent and find some god.
  14818. This is annoying.
  14819. The way to deal with this is having Gnus split out all spam into a
  14820. @samp{spam} mail group (@pxref{Splitting Mail}).
  14821. First, pick one (1) valid mail address that you can be reached at, and
  14822. put it in your @code{From} header of all your news articles. (I've
  14823. chosen @samp{larsi@@trym.ifi.uio.no}, but for many addresses on the form
  14824. @samp{larsi+usenet@@ifi.uio.no} will be a better choice. Ask your
  14825. sysadmin whether your sendmail installation accepts keywords in the local
  14826. part of the mail address.)
  14827. @lisp
  14828. (setq message-default-news-headers
  14829. "From: Lars Magne Ingebrigtsen <larsi@@trym.ifi.uio.no>\n")
  14830. @end lisp
  14831. Then put the following split rule in @code{nnmail-split-fancy}
  14832. (@pxref{Fancy Mail Splitting}):
  14833. @lisp
  14834. (
  14835. ...
  14836. (to "larsi@@trym.ifi.uio.no"
  14837. (| ("subject" "re:.*" "misc")
  14838. ("references" ".*@@.*" "misc")
  14839. "spam"))
  14840. ...
  14841. )
  14842. @end lisp
  14843. This says that all mail to this address is suspect, but if it has a
  14844. @code{Subject} that starts with a @samp{Re:} or has a @code{References}
  14845. header, it's probably ok. All the rest goes to the @samp{spam} group.
  14846. (This idea probably comes from Tim Pierce.)
  14847. In addition, many mail spammers talk directly to your @code{smtp} server
  14848. and do not include your email address explicitly in the @code{To}
  14849. header. Why they do this is unknown---perhaps it's to thwart this
  14850. thwarting scheme? In any case, this is trivial to deal with---you just
  14851. put anything not addressed to you in the @samp{spam} group by ending
  14852. your fancy split rule in this way:
  14853. @lisp
  14854. (
  14855. ...
  14856. (to "larsi" "misc")
  14857. "spam")
  14858. @end lisp
  14859. In my experience, this will sort virtually everything into the right
  14860. group. You still have to check the @samp{spam} group from time to time to
  14861. check for legitimate mail, though. If you feel like being a good net
  14862. citizen, you can even send off complaints to the proper authorities on
  14863. each unsolicited commercial email---at your leisure.
  14864. If you are also a lazy net citizen, you will probably prefer
  14865. complaining automatically with the @file{gnus-junk.el} package,
  14866. available as free software at @*
  14867. @uref{http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html}. Since most
  14868. e-mail spam is sent automatically, this may reconcile the cosmic
  14869. balance somewhat.
  14870. This works for me. It allows people an easy way to contact me (they can
  14871. just press @kbd{r} in the usual way), and I'm not bothered at all with
  14872. spam. It's a win-win situation. Forging @code{From} headers to point
  14873. to non-existent domains is yucky, in my opinion.
  14874. @node Various Various
  14875. @section Various Various
  14876. @cindex mode lines
  14877. @cindex highlights
  14878. @table @code
  14879. @item gnus-home-directory
  14880. All Gnus path variables will be initialized from this variable, which
  14881. defaults to @file{~/}.
  14882. @item gnus-directory
  14883. @vindex gnus-directory
  14884. Most Gnus storage path variables will be initialized from this variable,
  14885. which defaults to the @samp{SAVEDIR} environment variable, or
  14886. @file{~/News/} if that variable isn't set.
  14887. Note that Gnus is mostly loaded when the @file{.gnus.el} file is read.
  14888. This means that other directory variables that are initialized from this
  14889. variable won't be set properly if you set this variable in
  14890. @file{.gnus.el}. Set this variable in @file{.emacs} instead.
  14891. @item gnus-default-directory
  14892. @vindex gnus-default-directory
  14893. Not related to the above variable at all---this variable says what the
  14894. default directory of all Gnus buffers should be. If you issue commands
  14895. like @kbd{C-x C-f}, the prompt you'll get starts in the current buffer's
  14896. default directory. If this variable is @code{nil} (which is the
  14897. default), the default directory will be the default directory of the
  14898. buffer you were in when you started Gnus.
  14899. @item gnus-verbose
  14900. @vindex gnus-verbose
  14901. This variable is an integer between zero and ten. The higher the value,
  14902. the more messages will be displayed. If this variable is zero, Gnus
  14903. will never flash any messages, if it is seven (which is the default),
  14904. most important messages will be shown, and if it is ten, Gnus won't ever
  14905. shut up, but will flash so many messages it will make your head swim.
  14906. @item gnus-verbose-backends
  14907. @vindex gnus-verbose-backends
  14908. This variable works the same way as @code{gnus-verbose}, but it applies
  14909. to the Gnus back ends instead of Gnus proper.
  14910. @item nnheader-max-head-length
  14911. @vindex nnheader-max-head-length
  14912. When the back ends read straight heads of articles, they all try to read
  14913. as little as possible. This variable (default 4096) specifies
  14914. the absolute max length the back ends will try to read before giving up
  14915. on finding a separator line between the head and the body. If this
  14916. variable is @code{nil}, there is no upper read bound. If it is
  14917. @code{t}, the back ends won't try to read the articles piece by piece,
  14918. but read the entire articles. This makes sense with some versions of
  14919. @code{ange-ftp} or @code{efs}.
  14920. @item nnheader-head-chop-length
  14921. @vindex nnheader-head-chop-length
  14922. This variable (default 2048) says how big a piece of each article to
  14923. read when doing the operation described above.
  14924. @item nnheader-file-name-translation-alist
  14925. @vindex nnheader-file-name-translation-alist
  14926. @cindex file names
  14927. @cindex invalid characters in file names
  14928. @cindex characters in file names
  14929. This is an alist that says how to translate characters in file names.
  14930. For instance, if @samp{:} is invalid as a file character in file names
  14931. on your system (you OS/2 user you), you could say something like:
  14932. @lisp
  14933. (setq nnheader-file-name-translation-alist
  14934. '((?: . ?_)))
  14935. @end lisp
  14936. In fact, this is the default value for this variable on OS/2 and MS
  14937. Windows (phooey) systems.
  14938. @item gnus-hidden-properties
  14939. @vindex gnus-hidden-properties
  14940. This is a list of properties to use to hide ``invisible'' text. It is
  14941. @code{(invisible t intangible t)} by default on most systems, which
  14942. makes invisible text invisible and intangible.
  14943. @item gnus-parse-headers-hook
  14944. @vindex gnus-parse-headers-hook
  14945. A hook called before parsing headers. It can be used, for instance, to
  14946. gather statistics on the headers fetched, or perhaps you'd like to prune
  14947. some headers. I don't see why you'd want that, though.
  14948. @item gnus-shell-command-separator
  14949. @vindex gnus-shell-command-separator
  14950. String used to separate two shell commands. The default is @samp{;}.
  14951. @item gnus-invalid-group-regexp
  14952. @vindex gnus-invalid-group-regexp
  14953. Regexp to match ``invalid'' group names when querying user for a group
  14954. name. The default value catches some @strong{really} invalid group
  14955. names who could possibly mess up Gnus internally (like allowing
  14956. @samp{:} in a group name, which is normally used to delimit method and
  14957. group).
  14958. @sc{imap} users might want to allow @samp{/} in group names though.
  14959. @end table
  14960. @node The End
  14961. @chapter The End
  14962. Well, that's the manual---you can get on with your life now. Keep in
  14963. touch. Say hello to your cats from me.
  14964. My @strong{ghod}---I just can't stand goodbyes. Sniffle.
  14965. Ol' Charles Reznikoff said it pretty well, so I leave the floor to him:
  14966. @quotation
  14967. @strong{Te Deum}
  14968. @sp 1
  14969. Not because of victories @*
  14970. I sing,@*
  14971. having none,@*
  14972. but for the common sunshine,@*
  14973. the breeze,@*
  14974. the largess of the spring.
  14975. @sp 1
  14976. Not for victory@*
  14977. but for the day's work done@*
  14978. as well as I was able;@*
  14979. not for a seat upon the dais@*
  14980. but at the common table.@*
  14981. @end quotation
  14982. @node Appendices
  14983. @chapter Appendices
  14984. @menu
  14985. * History:: How Gnus got where it is today.
  14986. * On Writing Manuals:: Why this is not a beginner's guide.
  14987. * Terminology:: We use really difficult, like, words here.
  14988. * Customization:: Tailoring Gnus to your needs.
  14989. * Troubleshooting:: What you might try if things do not work.
  14990. * Gnus Reference Guide:: Rilly, rilly technical stuff.
  14991. * Emacs for Heathens:: A short introduction to Emacsian terms.
  14992. * Frequently Asked Questions:: A question-and-answer session.
  14993. @end menu
  14994. @node History
  14995. @section History
  14996. @cindex history
  14997. @sc{gnus} was written by Masanobu @sc{Umeda}. When autumn crept up in
  14998. '94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus.
  14999. If you want to investigate the person responsible for this outrage,
  15000. you can point your (feh!) web browser to
  15001. @uref{http://quimby.gnus.org/}. This is also the primary
  15002. distribution point for the new and spiffy versions of Gnus, and is
  15003. known as The Site That Destroys Newsrcs And Drives People Mad.
  15004. During the first extended alpha period of development, the new Gnus was
  15005. called ``(ding) Gnus''. @dfn{(ding)} is, of course, short for
  15006. @dfn{ding is not Gnus}, which is a total and utter lie, but who cares?
  15007. (Besides, the ``Gnus'' in this abbreviation should probably be
  15008. pronounced ``news'' as @sc{Umeda} intended, which makes it a more
  15009. appropriate name, don't you think?)
  15010. In any case, after spending all that energy on coming up with a new and
  15011. spunky name, we decided that the name was @emph{too} spunky, so we
  15012. renamed it back again to ``Gnus''. But in mixed case. ``Gnus'' vs.
  15013. ``@sc{gnus}''. New vs. old.
  15014. @menu
  15015. * Gnus Versions:: What Gnus versions have been released.
  15016. * Other Gnus Versions:: Other Gnus versions that also have been released.
  15017. * Why?:: What's the point of Gnus?
  15018. * Compatibility:: Just how compatible is Gnus with @sc{gnus}?
  15019. * Conformity:: Gnus tries to conform to all standards.
  15020. * Emacsen:: Gnus can be run on a few modern Emacsen.
  15021. * Gnus Development:: How Gnus is developed.
  15022. * Contributors:: Oodles of people.
  15023. * New Features:: Pointers to some of the new stuff in Gnus.
  15024. @end menu
  15025. @node Gnus Versions
  15026. @subsection Gnus Versions
  15027. @cindex Pterodactyl Gnus
  15028. @cindex ding Gnus
  15029. @cindex September Gnus
  15030. @cindex Quassia Gnus
  15031. The first ``proper'' release of Gnus 5 was done in November 1995 when it
  15032. was included in the Emacs 19.30 distribution (132 (ding) Gnus releases
  15033. plus 15 Gnus 5.0 releases).
  15034. In May 1996 the next Gnus generation (aka. ``September Gnus'' (after 99
  15035. releases)) was released under the name ``Gnus 5.2'' (40 releases).
  15036. On July 28th 1996 work on Red Gnus was begun, and it was released on
  15037. January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases).
  15038. On September 13th 1997, Quassia Gnus was started and lasted 37 releases.
  15039. If was released as ``Gnus 5.6'' on March 8th 1998 (46 releases).
  15040. Gnus 5.6 begat Pterodactyl Gnus on August 29th 1998 and was released as
  15041. ``Gnus 5.8'' (after 99 releases and a CVS repository) on December 3rd
  15042. 1999.
  15043. If you happen upon a version of Gnus that has a prefixed name --
  15044. ``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'' --
  15045. don't panic. Don't let it know that you're frightened. Back away.
  15046. Slowly. Whatever you do, don't run. Walk away, calmly, until you're
  15047. out of its reach. Find a proper released version of Gnus and snuggle up
  15048. to that instead.
  15049. @node Other Gnus Versions
  15050. @subsection Other Gnus Versions
  15051. @cindex Semi-gnus
  15052. In addition to the versions of Gnus which have had their releases
  15053. coordinated by Lars, one major development has been Semi-gnus from
  15054. Japan. It's based on a library called @sc{semi}, which provides
  15055. @sc{mime} capabilities.
  15056. These Gnusae are based mainly on Gnus 5.6 and Pterodactyl Gnus.
  15057. Collectively, they are called ``Semi-gnus'', and different strains are
  15058. called T-gnus, ET-gnus, Nana-gnus and Chaos. These provide powerful
  15059. @sc{mime} and multilingualization things, especially important for
  15060. Japanese users.
  15061. @node Why?
  15062. @subsection Why?
  15063. What's the point of Gnus?
  15064. I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep''
  15065. newsreader, that lets you do anything you can think of. That was my
  15066. original motivation, but while working on Gnus, it has become clear to
  15067. me that this generation of newsreaders really belong in the stone age.
  15068. Newsreaders haven't developed much since the infancy of the net. If the
  15069. volume continues to rise with the current rate of increase, all current
  15070. newsreaders will be pretty much useless. How do you deal with
  15071. newsgroups that have thousands of new articles each day? How do you
  15072. keep track of millions of people who post?
  15073. Gnus offers no real solutions to these questions, but I would very much
  15074. like to see Gnus being used as a testing ground for new methods of
  15075. reading and fetching news. Expanding on @sc{Umeda}-san's wise decision
  15076. to separate the newsreader from the back ends, Gnus now offers a simple
  15077. interface for anybody who wants to write new back ends for fetching mail
  15078. and news from different sources. I have added hooks for customizations
  15079. everywhere I could imagine it being useful. By doing so, I'm inviting
  15080. every one of you to explore and invent.
  15081. May Gnus never be complete. @kbd{C-u 100 M-x all-hail-emacs} and
  15082. @kbd{C-u 100 M-x all-hail-xemacs}.
  15083. @node Compatibility
  15084. @subsection Compatibility
  15085. @cindex compatibility
  15086. Gnus was designed to be fully compatible with @sc{gnus}. Almost all key
  15087. bindings have been kept. More key bindings have been added, of course,
  15088. but only in one or two obscure cases have old bindings been changed.
  15089. Our motto is:
  15090. @quotation
  15091. @cartouche
  15092. @center In a cloud bones of steel.
  15093. @end cartouche
  15094. @end quotation
  15095. All commands have kept their names. Some internal functions have changed
  15096. their names.
  15097. The @code{gnus-uu} package has changed drastically. @xref{Decoding
  15098. Articles}.
  15099. One major compatibility question is the presence of several summary
  15100. buffers. All variables relevant while reading a group are
  15101. buffer-local to the summary buffer they belong in. Although many
  15102. important variables have their values copied into their global
  15103. counterparts whenever a command is executed in the summary buffer, this
  15104. change might lead to incorrect values being used unless you are careful.
  15105. All code that relies on knowledge of @sc{gnus} internals will probably
  15106. fail. To take two examples: Sorting @code{gnus-newsrc-alist} (or
  15107. changing it in any way, as a matter of fact) is strictly verboten. Gnus
  15108. maintains a hash table that points to the entries in this alist (which
  15109. speeds up many functions), and changing the alist directly will lead to
  15110. peculiar results.
  15111. @cindex hilit19
  15112. @cindex highlighting
  15113. Old hilit19 code does not work at all. In fact, you should probably
  15114. remove all hilit code from all Gnus hooks
  15115. (@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}).
  15116. Gnus provides various integrated functions for highlighting. These are
  15117. faster and more accurate. To make life easier for everybody, Gnus will
  15118. by default remove all hilit calls from all hilit hooks. Uncleanliness!
  15119. Away!
  15120. Packages like @code{expire-kill} will no longer work. As a matter of
  15121. fact, you should probably remove all old @sc{gnus} packages (and other
  15122. code) when you start using Gnus. More likely than not, Gnus already
  15123. does what you have written code to make @sc{gnus} do. (Snicker.)
  15124. Even though old methods of doing things are still supported, only the
  15125. new methods are documented in this manual. If you detect a new method of
  15126. doing something while reading this manual, that does not mean you have
  15127. to stop doing it the old way.
  15128. Gnus understands all @sc{gnus} startup files.
  15129. @kindex M-x gnus-bug
  15130. @findex gnus-bug
  15131. @cindex reporting bugs
  15132. @cindex bugs
  15133. Overall, a casual user who hasn't written much code that depends on
  15134. @sc{gnus} internals should suffer no problems. If problems occur,
  15135. please let me know by issuing that magic command @kbd{M-x gnus-bug}.
  15136. @vindex gnus-bug-create-help-buffer
  15137. If you are in the habit of sending bug reports @emph{very} often, you
  15138. may find the helpful help buffer annoying after a while. If so, set
  15139. @code{gnus-bug-create-help-buffer} to @code{nil} to avoid having it pop
  15140. up at you.
  15141. @node Conformity
  15142. @subsection Conformity
  15143. No rebels without a clue here, ma'am. We conform to all standards known
  15144. to (wo)man. Except for those standards and/or conventions we disagree
  15145. with, of course.
  15146. @table @strong
  15147. @item RFC 822
  15148. @cindex RFC 822
  15149. There are no known breaches of this standard.
  15150. @item RFC 1036
  15151. @cindex RFC 1036
  15152. There are no known breaches of this standard, either.
  15153. @item Son-of-RFC 1036
  15154. @cindex Son-of-RFC 1036
  15155. We do have some breaches to this one.
  15156. @table @emph
  15157. @item X-Newsreader
  15158. @itemx User-Agent
  15159. These are considered to be ``vanity headers'', while I consider them
  15160. to be consumer information. After seeing so many badly formatted
  15161. articles coming from @code{tin} and @code{Netscape} I know not to use
  15162. either of those for posting articles. I would not have known that if
  15163. it wasn't for the @code{X-Newsreader} header.
  15164. @end table
  15165. @item USEFOR
  15166. @cindex USEFOR
  15167. USEFOR is an IETF working group writing a successor to RFC 1036, based
  15168. on Son-of-RFC 1036. They have produced a number of drafts proposing
  15169. various changes to the format of news articles. The Gnus towers will
  15170. look into implementing the changes when the draft is accepted as an RFC.
  15171. @end table
  15172. If you ever notice Gnus acting non-compliant with regards to the texts
  15173. mentioned above, don't hesitate to drop a note to Gnus Towers and let us
  15174. know.
  15175. @node Emacsen
  15176. @subsection Emacsen
  15177. @cindex Emacsen
  15178. @cindex XEmacs
  15179. @cindex Mule
  15180. @cindex Emacs
  15181. Gnus should work on :
  15182. @itemize @bullet
  15183. @item
  15184. Emacs 20.3 and up.
  15185. @item
  15186. XEmacs 20.4 and up.
  15187. @end itemize
  15188. This Gnus version will absolutely not work on any Emacsen older than
  15189. that. Not reliably, at least. Older versions of Gnus may work on older
  15190. Emacs versions.
  15191. There are some vague differences between Gnus on the various
  15192. platforms---XEmacs features more graphics (a logo and a toolbar)---but
  15193. other than that, things should look pretty much the same under all
  15194. Emacsen.
  15195. @node Gnus Development
  15196. @subsection Gnus Development
  15197. Gnus is developed in a two-phased cycle. The first phase involves much
  15198. discussion on the @samp{ding@@gnus.org} mailing list, where people
  15199. propose changes and new features, post patches and new back ends. This
  15200. phase is called the @dfn{alpha} phase, since the Gnusae released in this
  15201. phase are @dfn{alpha releases}, or (perhaps more commonly in other
  15202. circles) @dfn{snapshots}. During this phase, Gnus is assumed to be
  15203. unstable and should not be used by casual users. Gnus alpha releases
  15204. have names like ``Red Gnus'' and ``Quassia Gnus''.
  15205. After futzing around for 50-100 alpha releases, Gnus is declared
  15206. @dfn{frozen}, and only bug fixes are applied. Gnus loses the prefix,
  15207. and is called things like ``Gnus 5.6.32'' instead. Normal people are
  15208. supposed to be able to use these, and these are mostly discussed on the
  15209. @samp{gnu.emacs.gnus} newsgroup.
  15210. @cindex Incoming*
  15211. @vindex mail-source-delete-incoming
  15212. Some variable defaults differ between alpha Gnusae and released Gnusae.
  15213. In particular, @code{mail-source-delete-incoming} defaults to @code{nil} in
  15214. alpha Gnusae and @code{t} in released Gnusae. This is to prevent
  15215. lossage of mail if an alpha release hiccups while handling the mail.
  15216. The division of discussion between the ding mailing list and the Gnus
  15217. newsgroup is not purely based on publicity concerns. It's true that
  15218. having people write about the horrible things that an alpha Gnus release
  15219. can do (sometimes) in a public forum may scare people off, but more
  15220. importantly, talking about new experimental features that have been
  15221. introduced may confuse casual users. New features are frequently
  15222. introduced, fiddled with, and judged to be found wanting, and then
  15223. either discarded or totally rewritten. People reading the mailing list
  15224. usually keep up with these rapid changes, while people on the newsgroup
  15225. can't be assumed to do so.
  15226. @node Contributors
  15227. @subsection Contributors
  15228. @cindex contributors
  15229. The new Gnus version couldn't have been done without the help of all the
  15230. people on the (ding) mailing list. Every day for over a year I have
  15231. gotten billions of nice bug reports from them, filling me with joy,
  15232. every single one of them. Smooches. The people on the list have been
  15233. tried beyond endurance, what with my ``oh, that's a neat idea <type
  15234. type>, yup, I'll release it right away <ship off> no wait, that doesn't
  15235. work at all <type type>, yup, I'll ship that one off right away <ship
  15236. off> no, wait, that absolutely does not work'' policy for releases.
  15237. Micro$oft---bah. Amateurs. I'm @emph{much} worse. (Or is that
  15238. ``worser''? ``much worser''? ``worsest''?)
  15239. I would like to take this opportunity to thank the Academy for... oops,
  15240. wrong show.
  15241. @itemize @bullet
  15242. @item
  15243. Masanobu @sc{Umeda}---the writer of the original @sc{gnus}.
  15244. @item
  15245. Shenghuo Zhu---uudecode.el, mm-uu.el, rfc1843.el, webmail.el,
  15246. nnwarchive and many, many other things connected with @sc{mime} and
  15247. other types of en/decoding, as well as general bug fixing, new
  15248. functionality and stuff.
  15249. @item
  15250. Per Abrahamsen---custom, scoring, highlighting and @sc{soup} code (as
  15251. well as numerous other things).
  15252. @item
  15253. Luis Fernandes---design and graphics.
  15254. @item
  15255. Justin Sheehy--the FAQ maintainer.
  15256. @item
  15257. Erik Naggum---help, ideas, support, code and stuff.
  15258. @item
  15259. Wes Hardaker---@file{gnus-picon.el} and the manual section on
  15260. @dfn{picons} (@pxref{Picons}).
  15261. @item
  15262. Kim-Minh Kaplan---further work on the picon code.
  15263. @item
  15264. Brad Miller---@file{gnus-gl.el} and the GroupLens manual section
  15265. (@pxref{GroupLens}).
  15266. @item
  15267. Sudish Joseph---innumerable bug fixes.
  15268. @item
  15269. Ilja Weis---@file{gnus-topic.el}.
  15270. @item
  15271. Steven L. Baur---lots and lots and lots of bugs detections and fixes.
  15272. @item
  15273. Vladimir Alexiev---the refcard and reference booklets.
  15274. @item
  15275. Felix Lee & Jamie Zawinski---I stole some pieces from the XGnus
  15276. distribution by Felix Lee and JWZ.
  15277. @item
  15278. Scott Byer---@file{nnfolder.el} enhancements & rewrite.
  15279. @item
  15280. Peter Mutsaers---orphan article scoring code.
  15281. @item
  15282. Ken Raeburn---POP mail support.
  15283. @item
  15284. Hallvard B Furuseth---various bits and pieces, especially dealing with
  15285. .newsrc files.
  15286. @item
  15287. Brian Edmonds---@file{gnus-bbdb.el}.
  15288. @item
  15289. David Moore---rewrite of @file{nnvirtual.el} and many other things.
  15290. @item
  15291. Kevin Davidson---came up with the name @dfn{ding}, so blame him.
  15292. @item
  15293. François Pinard---many, many interesting and thorough bug reports, as
  15294. well as autoconf support.
  15295. @end itemize
  15296. This manual was proof-read by Adrian Aichner, with Ricardo Nassif, Mark
  15297. Borges, and Jost Krieger proof-reading parts of the manual.
  15298. The following people have contributed many patches and suggestions:
  15299. Christopher Davis,
  15300. Andrew Eskilsson,
  15301. Kai Grossjohann,
  15302. David Kågedal,
  15303. Richard Pieri,
  15304. Fabrice Popineau,
  15305. Daniel Quinlan,
  15306. Jason L. Tibbitts, III,
  15307. and
  15308. Jack Vinson.
  15309. Also thanks to the following for patches and stuff:
  15310. Jari Aalto,
  15311. Adrian Aichner,
  15312. Vladimir Alexiev,
  15313. Russ Allbery,
  15314. Peter Arius,
  15315. Matt Armstrong,
  15316. Marc Auslander,
  15317. Miles Bader,
  15318. Alexei V. Barantsev,
  15319. Frank Bennett,
  15320. Robert Bihlmeyer,
  15321. Chris Bone,
  15322. Mark Borges,
  15323. Mark Boyns,
  15324. Lance A. Brown,
  15325. Rob Browning,
  15326. Kees de Bruin,
  15327. Martin Buchholz,
  15328. Joe Buehler,
  15329. Kevin Buhr,
  15330. Alastair Burt,
  15331. Joao Cachopo,
  15332. Zlatko Calusic,
  15333. Massimo Campostrini,
  15334. Castor,
  15335. David Charlap,
  15336. Dan Christensen,
  15337. Kevin Christian,
  15338. Jae-you Chung, @c ?
  15339. James H. Cloos, Jr.,
  15340. Laura Conrad,
  15341. Michael R. Cook,
  15342. Glenn Coombs,
  15343. Andrew J. Cosgriff,
  15344. Neil Crellin,
  15345. Frank D. Cringle,
  15346. Geoffrey T. Dairiki,
  15347. Andre Deparade,
  15348. Ulrik Dickow,
  15349. Dave Disser,
  15350. Rui-Tao Dong, @c ?
  15351. Joev Dubach,
  15352. Michael Welsh Duggan,
  15353. Dave Edmondson,
  15354. Paul Eggert,
  15355. Mark W. Eichin,
  15356. Karl Eichwalder,
  15357. Enami Tsugutomo, @c Enami
  15358. Michael Ernst,
  15359. Luc Van Eycken,
  15360. Sam Falkner,
  15361. Nelson Jose dos Santos Ferreira,
  15362. Sigbjorn Finne,
  15363. Sven Fischer,
  15364. Paul Fisher,
  15365. Decklin Foster,
  15366. Gary D. Foster,
  15367. Paul Franklin,
  15368. Guy Geens,
  15369. Arne Georg Gleditsch,
  15370. David S. Goldberg,
  15371. Michelangelo Grigni,
  15372. Dale Hagglund,
  15373. D. Hall,
  15374. Magnus Hammerin,
  15375. Kenichi Handa, @c Handa
  15376. Raja R. Harinath,
  15377. Yoshiki Hayashi, @c ?
  15378. P. E. Jareth Hein,
  15379. Hisashige Kenji, @c Hisashige
  15380. Scott Hofmann,
  15381. Marc Horowitz,
  15382. Gunnar Horrigmo,
  15383. Richard Hoskins,
  15384. Brad Howes,
  15385. Miguel de Icaza,
  15386. François Felix Ingrand,
  15387. Tatsuya Ichikawa, @c ?
  15388. Ishikawa Ichiro, @c Ishikawa
  15389. Lee Iverson,
  15390. Iwamuro Motonori, @c Iwamuro
  15391. Rajappa Iyer,
  15392. Andreas Jaeger,
  15393. Adam P. Jenkins,
  15394. Randell Jesup,
  15395. Fred Johansen,
  15396. Gareth Jones,
  15397. Simon Josefsson,
  15398. Greg Klanderman,
  15399. Karl Kleinpaste,
  15400. Michael Klingbeil,
  15401. Peter Skov Knudsen,
  15402. Shuhei Kobayashi, @c Kobayashi
  15403. Petr Konecny,
  15404. Koseki Yoshinori, @c Koseki
  15405. Thor Kristoffersen,
  15406. Jens Lautenbacher,
  15407. Martin Larose,
  15408. Seokchan Lee, @c Lee
  15409. Joerg Lenneis,
  15410. Carsten Leonhardt,
  15411. James LewisMoss,
  15412. Christian Limpach,
  15413. Markus Linnala,
  15414. Dave Love,
  15415. Mike McEwan,
  15416. Tonny Madsen,
  15417. Shlomo Mahlab,
  15418. Nat Makarevitch,
  15419. Istvan Marko,
  15420. David Martin,
  15421. Jason R. Mastaler,
  15422. Gordon Matzigkeit,
  15423. Timo Metzemakers,
  15424. Richard Mlynarik,
  15425. Lantz Moore,
  15426. Morioka Tomohiko, @c Morioka
  15427. Erik Toubro Nielsen,
  15428. Hrvoje Niksic,
  15429. Andy Norman,
  15430. Fred Oberhauser,
  15431. C. R. Oldham,
  15432. Alexandre Oliva,
  15433. Ken Olstad,
  15434. Masaharu Onishi, @c Onishi
  15435. Hideki Ono, @c Ono
  15436. Ettore Perazzoli,
  15437. William Perry,
  15438. Stephen Peters,
  15439. Jens-Ulrik Holger Petersen,
  15440. Ulrich Pfeifer,
  15441. Matt Pharr,
  15442. Andy Piper,
  15443. John McClary Prevost,
  15444. Bill Pringlemeir,
  15445. Mike Pullen,
  15446. Jim Radford,
  15447. Colin Rafferty,
  15448. Lasse Rasinen,
  15449. Lars Balker Rasmussen,
  15450. Joe Reiss,
  15451. Renaud Rioboo,
  15452. Roland B. Roberts,
  15453. Bart Robinson,
  15454. Christian von Roques,
  15455. Markus Rost,
  15456. Jason Rumney,
  15457. Wolfgang Rupprecht,
  15458. Jay Sachs,
  15459. Dewey M. Sasser,
  15460. Conrad Sauerwald,
  15461. Loren Schall,
  15462. Dan Schmidt,
  15463. Ralph Schleicher,
  15464. Philippe Schnoebelen,
  15465. Andreas Schwab,
  15466. Randal L. Schwartz,
  15467. Danny Siu,
  15468. Matt Simmons,
  15469. Paul D. Smith,
  15470. Jeff Sparkes,
  15471. Toby Speight,
  15472. Michael Sperber,
  15473. Darren Stalder,
  15474. Richard Stallman,
  15475. Greg Stark,
  15476. Sam Steingold,
  15477. Paul Stevenson,
  15478. Jonas Steverud,
  15479. Paul Stodghill,
  15480. Kiyokazu Suto, @c Suto
  15481. Kurt Swanson,
  15482. Samuel Tardieu,
  15483. Teddy,
  15484. Chuck Thompson,
  15485. Tozawa Akihiko, @c Tozawa
  15486. Philippe Troin,
  15487. James Troup,
  15488. Trung Tran-Duc,
  15489. Jack Twilley,
  15490. Aaron M. Ucko,
  15491. Aki Vehtari,
  15492. Didier Verna,
  15493. Vladimir Volovich,
  15494. Jan Vroonhof,
  15495. Stefan Waldherr,
  15496. Pete Ware,
  15497. Barry A. Warsaw,
  15498. Christoph Wedler,
  15499. Joe Wells,
  15500. Lee Willis,
  15501. Katsumi Yamaoka @c Yamaoka
  15502. and
  15503. Lloyd Zusman.
  15504. For a full overview of what each person has done, the ChangeLogs
  15505. included in the Gnus alpha distributions should give ample reading
  15506. (550kB and counting).
  15507. Apologies to everybody that I've forgotten, of which there are many, I'm
  15508. sure.
  15509. Gee, that's quite a list of people. I guess that must mean that there
  15510. actually are people who are using Gnus. Who'd'a thunk it!
  15511. @node New Features
  15512. @subsection New Features
  15513. @cindex new features
  15514. @menu
  15515. * ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.
  15516. * September Gnus:: The Thing Formally Known As Gnus 5.2/5.3.
  15517. * Red Gnus:: Third time best---Gnus 5.4/5.5.
  15518. * Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.
  15519. * Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.
  15520. @end menu
  15521. These lists are, of course, just @emph{short} overviews of the
  15522. @emph{most} important new features. No, really. There are tons more.
  15523. Yes, we have feeping creaturism in full effect.
  15524. @node ding Gnus
  15525. @subsubsection (ding) Gnus
  15526. New features in Gnus 5.0/5.1:
  15527. @itemize @bullet
  15528. @item
  15529. The look of all buffers can be changed by setting format-like variables
  15530. (@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}).
  15531. @item
  15532. Local spool and several @sc{nntp} servers can be used at once
  15533. (@pxref{Select Methods}).
  15534. @item
  15535. You can combine groups into virtual groups (@pxref{Virtual Groups}).
  15536. @item
  15537. You can read a number of different mail formats (@pxref{Getting Mail}).
  15538. All the mail back ends implement a convenient mail expiry scheme
  15539. (@pxref{Expiring Mail}).
  15540. @item
  15541. Gnus can use various strategies for gathering threads that have lost
  15542. their roots (thereby gathering loose sub-threads into one thread) or it
  15543. can go back and retrieve enough headers to build a complete thread
  15544. (@pxref{Customizing Threading}).
  15545. @item
  15546. Killed groups can be displayed in the group buffer, and you can read
  15547. them as well (@pxref{Listing Groups}).
  15548. @item
  15549. Gnus can do partial group updates---you do not have to retrieve the
  15550. entire active file just to check for new articles in a few groups
  15551. (@pxref{The Active File}).
  15552. @item
  15553. Gnus implements a sliding scale of subscribedness to groups
  15554. (@pxref{Group Levels}).
  15555. @item
  15556. You can score articles according to any number of criteria
  15557. (@pxref{Scoring}). You can even get Gnus to find out how to score
  15558. articles for you (@pxref{Adaptive Scoring}).
  15559. @item
  15560. Gnus maintains a dribble buffer that is auto-saved the normal Emacs
  15561. manner, so it should be difficult to lose much data on what you have
  15562. read if your machine should go down (@pxref{Auto Save}).
  15563. @item
  15564. Gnus now has its own startup file (@file{.gnus}) to avoid cluttering up
  15565. the @file{.emacs} file.
  15566. @item
  15567. You can set the process mark on both groups and articles and perform
  15568. operations on all the marked items (@pxref{Process/Prefix}).
  15569. @item
  15570. You can grep through a subset of groups and create a group from the
  15571. results (@pxref{Kibozed Groups}).
  15572. @item
  15573. You can list subsets of groups according to, well, anything
  15574. (@pxref{Listing Groups}).
  15575. @item
  15576. You can browse foreign servers and subscribe to groups from those
  15577. servers (@pxref{Browse Foreign Server}).
  15578. @item
  15579. Gnus can fetch articles, asynchronously, on a second connection to the
  15580. server (@pxref{Asynchronous Fetching}).
  15581. @item
  15582. You can cache articles locally (@pxref{Article Caching}).
  15583. @item
  15584. The uudecode functions have been expanded and generalized
  15585. (@pxref{Decoding Articles}).
  15586. @item
  15587. You can still post uuencoded articles, which was a little-known feature
  15588. of @sc{gnus}' past (@pxref{Uuencoding and Posting}).
  15589. @item
  15590. Fetching parents (and other articles) now actually works without
  15591. glitches (@pxref{Finding the Parent}).
  15592. @item
  15593. Gnus can fetch FAQs and group descriptions (@pxref{Group Information}).
  15594. @item
  15595. Digests (and other files) can be used as the basis for groups
  15596. (@pxref{Document Groups}).
  15597. @item
  15598. Articles can be highlighted and customized (@pxref{Customizing
  15599. Articles}).
  15600. @item
  15601. URLs and other external references can be buttonized (@pxref{Article
  15602. Buttons}).
  15603. @item
  15604. You can do lots of strange stuff with the Gnus window & frame
  15605. configuration (@pxref{Windows Configuration}).
  15606. @item
  15607. You can click on buttons instead of using the keyboard
  15608. (@pxref{Buttons}).
  15609. @end itemize
  15610. @node September Gnus
  15611. @subsubsection September Gnus
  15612. @iftex
  15613. @iflatex
  15614. \gnusfig{-28cm}{0cm}{\epsfig{figure=tmp/september.ps,height=20cm}}
  15615. @end iflatex
  15616. @end iftex
  15617. New features in Gnus 5.2/5.3:
  15618. @itemize @bullet
  15619. @item
  15620. A new message composition mode is used. All old customization variables
  15621. for @code{mail-mode}, @code{rnews-reply-mode} and @code{gnus-msg} are
  15622. now obsolete.
  15623. @item
  15624. Gnus is now able to generate @dfn{sparse} threads---threads where
  15625. missing articles are represented by empty nodes (@pxref{Customizing
  15626. Threading}).
  15627. @lisp
  15628. (setq gnus-build-sparse-threads 'some)
  15629. @end lisp
  15630. @item
  15631. Outgoing articles are stored on a special archive server
  15632. (@pxref{Archived Messages}).
  15633. @item
  15634. Partial thread regeneration now happens when articles are
  15635. referred.
  15636. @item
  15637. Gnus can make use of GroupLens predictions (@pxref{GroupLens}).
  15638. @item
  15639. Picons (personal icons) can be displayed under XEmacs (@pxref{Picons}).
  15640. @item
  15641. A @code{trn}-like tree buffer can be displayed (@pxref{Tree Display}).
  15642. @lisp
  15643. (setq gnus-use-trees t)
  15644. @end lisp
  15645. @item
  15646. An @code{nn}-like pick-and-read minor mode is available for the summary
  15647. buffers (@pxref{Pick and Read}).
  15648. @lisp
  15649. (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
  15650. @end lisp
  15651. @item
  15652. In binary groups you can use a special binary minor mode (@pxref{Binary
  15653. Groups}).
  15654. @item
  15655. Groups can be grouped in a folding topic hierarchy (@pxref{Group
  15656. Topics}).
  15657. @lisp
  15658. (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
  15659. @end lisp
  15660. @item
  15661. Gnus can re-send and bounce mail (@pxref{Summary Mail Commands}).
  15662. @item
  15663. Groups can now have a score, and bubbling based on entry frequency
  15664. is possible (@pxref{Group Score}).
  15665. @lisp
  15666. (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)
  15667. @end lisp
  15668. @item
  15669. Groups can be process-marked, and commands can be performed on
  15670. groups of groups (@pxref{Marking Groups}).
  15671. @item
  15672. Caching is possible in virtual groups.
  15673. @item
  15674. @code{nndoc} now understands all kinds of digests, mail boxes, rnews
  15675. news batches, ClariNet briefs collections, and just about everything
  15676. else (@pxref{Document Groups}).
  15677. @item
  15678. Gnus has a new back end (@code{nnsoup}) to create/read SOUP packets
  15679. (@pxref{SOUP}).
  15680. @item
  15681. The Gnus cache is much faster.
  15682. @item
  15683. Groups can be sorted according to many criteria (@pxref{Sorting
  15684. Groups}).
  15685. @item
  15686. New group parameters have been introduced to set list-addresses and
  15687. expiry times (@pxref{Group Parameters}).
  15688. @item
  15689. All formatting specs allow specifying faces to be used
  15690. (@pxref{Formatting Fonts}).
  15691. @item
  15692. There are several more commands for setting/removing/acting on process
  15693. marked articles on the @kbd{M P} submap (@pxref{Setting Process Marks}).
  15694. @item
  15695. The summary buffer can be limited to show parts of the available
  15696. articles based on a wide range of criteria. These commands have been
  15697. bound to keys on the @kbd{/} submap (@pxref{Limiting}).
  15698. @item
  15699. Articles can be made persistent with the @kbd{*} command
  15700. (@pxref{Persistent Articles}).
  15701. @item
  15702. All functions for hiding article elements are now toggles.
  15703. @item
  15704. Article headers can be buttonized (@pxref{Article Washing}).
  15705. @item
  15706. All mail back ends support fetching articles by @code{Message-ID}.
  15707. @item
  15708. Duplicate mail can now be treated properly (@pxref{Duplicates}).
  15709. @item
  15710. All summary mode commands are available directly from the article
  15711. buffer (@pxref{Article Keymap}).
  15712. @item
  15713. Frames can be part of @code{gnus-buffer-configuration} (@pxref{Windows
  15714. Configuration}).
  15715. @item
  15716. Mail can be re-scanned by a daemonic process (@pxref{Daemons}).
  15717. @iftex
  15718. @iflatex
  15719. \marginpar[\mbox{}\hfill\epsfig{figure=tmp/fseptember.ps,height=5cm}]{\epsfig{figure=tmp/fseptember.ps,height=5cm}}
  15720. @end iflatex
  15721. @end iftex
  15722. @item
  15723. Gnus can make use of NoCeM files to weed out spam (@pxref{NoCeM}).
  15724. @lisp
  15725. (setq gnus-use-nocem t)
  15726. @end lisp
  15727. @item
  15728. Groups can be made permanently visible (@pxref{Listing Groups}).
  15729. @lisp
  15730. (setq gnus-permanently-visible-groups "^nnml:")
  15731. @end lisp
  15732. @item
  15733. Many new hooks have been introduced to make customizing easier.
  15734. @item
  15735. Gnus respects the @code{Mail-Copies-To} header.
  15736. @item
  15737. Threads can be gathered by looking at the @code{References} header
  15738. (@pxref{Customizing Threading}).
  15739. @lisp
  15740. (setq gnus-summary-thread-gathering-function
  15741. 'gnus-gather-threads-by-references)
  15742. @end lisp
  15743. @item
  15744. Read articles can be stored in a special backlog buffer to avoid
  15745. refetching (@pxref{Article Backlog}).
  15746. @lisp
  15747. (setq gnus-keep-backlog 50)
  15748. @end lisp
  15749. @item
  15750. A clean copy of the current article is always stored in a separate
  15751. buffer to allow easier treatment.
  15752. @item
  15753. Gnus can suggest where to save articles (@pxref{Saving Articles}).
  15754. @item
  15755. Gnus doesn't have to do as much prompting when saving (@pxref{Saving
  15756. Articles}).
  15757. @lisp
  15758. (setq gnus-prompt-before-saving t)
  15759. @end lisp
  15760. @item
  15761. @code{gnus-uu} can view decoded files asynchronously while fetching
  15762. articles (@pxref{Other Decode Variables}).
  15763. @lisp
  15764. (setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view)
  15765. @end lisp
  15766. @item
  15767. Filling in the article buffer now works properly on cited text
  15768. (@pxref{Article Washing}).
  15769. @item
  15770. Hiding cited text adds buttons to toggle hiding, and how much
  15771. cited text to hide is now customizable (@pxref{Article Hiding}).
  15772. @lisp
  15773. (setq gnus-cited-lines-visible 2)
  15774. @end lisp
  15775. @item
  15776. Boring headers can be hidden (@pxref{Article Hiding}).
  15777. @item
  15778. Default scoring values can now be set from the menu bar.
  15779. @item
  15780. Further syntax checking of outgoing articles have been added.
  15781. @end itemize
  15782. @node Red Gnus
  15783. @subsubsection Red Gnus
  15784. New features in Gnus 5.4/5.5:
  15785. @iftex
  15786. @iflatex
  15787. \gnusfig{-5.5cm}{-4cm}{\epsfig{figure=tmp/red.ps,height=20cm}}
  15788. @end iflatex
  15789. @end iftex
  15790. @itemize @bullet
  15791. @item
  15792. @file{nntp.el} has been totally rewritten in an asynchronous fashion.
  15793. @item
  15794. Article prefetching functionality has been moved up into
  15795. Gnus (@pxref{Asynchronous Fetching}).
  15796. @item
  15797. Scoring can now be performed with logical operators like @code{and},
  15798. @code{or}, @code{not}, and parent redirection (@pxref{Advanced
  15799. Scoring}).
  15800. @item
  15801. Article washing status can be displayed in the
  15802. article mode line (@pxref{Misc Article}).
  15803. @item
  15804. @file{gnus.el} has been split into many smaller files.
  15805. @item
  15806. Suppression of duplicate articles based on Message-ID can be done
  15807. (@pxref{Duplicate Suppression}).
  15808. @lisp
  15809. (setq gnus-suppress-duplicates t)
  15810. @end lisp
  15811. @item
  15812. New variables for specifying what score and adapt files are to be
  15813. considered home score and adapt files (@pxref{Home Score File}) have
  15814. been added.
  15815. @item
  15816. @code{nndoc} was rewritten to be easily extendable (@pxref{Document
  15817. Server Internals}).
  15818. @item
  15819. Groups can inherit group parameters from parent topics (@pxref{Topic
  15820. Parameters}).
  15821. @item
  15822. Article editing has been revamped and is now actually usable.
  15823. @item
  15824. Signatures can be recognized in more intelligent fashions
  15825. (@pxref{Article Signature}).
  15826. @item
  15827. Summary pick mode has been made to look more @code{nn}-like. Line
  15828. numbers are displayed and the @kbd{.} command can be used to pick
  15829. articles (@code{Pick and Read}).
  15830. @item
  15831. Commands for moving the @file{.newsrc.eld} from one server to
  15832. another have been added (@pxref{Changing Servers}).
  15833. @item
  15834. There's a way now to specify that ``uninteresting'' fields be suppressed
  15835. when generating lines in buffers (@pxref{Advanced Formatting}).
  15836. @item
  15837. Several commands in the group buffer can be undone with @kbd{C-M-_}
  15838. (@pxref{Undo}).
  15839. @item
  15840. Scoring can be done on words using the new score type @code{w}
  15841. (@pxref{Score File Format}).
  15842. @item
  15843. Adaptive scoring can be done on a Subject word-by-word basis
  15844. (@pxref{Adaptive Scoring}).
  15845. @lisp
  15846. (setq gnus-use-adaptive-scoring '(word))
  15847. @end lisp
  15848. @item
  15849. Scores can be decayed (@pxref{Score Decays}).
  15850. @lisp
  15851. (setq gnus-decay-scores t)
  15852. @end lisp
  15853. @item
  15854. Scoring can be performed using a regexp on the Date header. The Date is
  15855. normalized to compact ISO 8601 format first (@pxref{Score File Format}).
  15856. @item
  15857. A new command has been added to remove all data on articles from
  15858. the native server (@pxref{Changing Servers}).
  15859. @item
  15860. A new command for reading collections of documents
  15861. (@code{nndoc} with @code{nnvirtual} on top) has been added---@kbd{C-M-d}
  15862. (@pxref{Really Various Summary Commands}).
  15863. @item
  15864. Process mark sets can be pushed and popped (@pxref{Setting Process
  15865. Marks}).
  15866. @item
  15867. A new mail-to-news back end makes it possible to post even when the @sc{nntp}
  15868. server doesn't allow posting (@pxref{Mail-To-News Gateways}).
  15869. @item
  15870. A new back end for reading searches from Web search engines
  15871. (@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) has been added
  15872. (@pxref{Web Searches}).
  15873. @item
  15874. Groups inside topics can now be sorted using the standard sorting
  15875. functions, and each topic can be sorted independently (@pxref{Topic
  15876. Sorting}).
  15877. @item
  15878. Subsets of the groups can be sorted independently (@code{Sorting
  15879. Groups}).
  15880. @item
  15881. Cached articles can be pulled into the groups (@pxref{Summary Generation
  15882. Commands}).
  15883. @iftex
  15884. @iflatex
  15885. \marginpar[\mbox{}\hfill\epsfig{figure=tmp/fred.ps,width=3cm}]{\epsfig{figure=tmp/fred.ps,width=3cm}}
  15886. @end iflatex
  15887. @end iftex
  15888. @item
  15889. Score files are now applied in a more reliable order (@pxref{Score
  15890. Variables}).
  15891. @item
  15892. Reports on where mail messages end up can be generated (@pxref{Splitting
  15893. Mail}).
  15894. @item
  15895. More hooks and functions have been added to remove junk from incoming
  15896. mail before saving the mail (@pxref{Washing Mail}).
  15897. @item
  15898. Emphasized text can be properly fontisized:
  15899. @end itemize
  15900. @node Quassia Gnus
  15901. @subsubsection Quassia Gnus
  15902. New features in Gnus 5.6:
  15903. @itemize @bullet
  15904. @item
  15905. New functionality for using Gnus as an offline newsreader has been
  15906. added. A plethora of new commands and modes have been added. See
  15907. @pxref{Gnus Unplugged} for the full story.
  15908. @item
  15909. The @code{nndraft} back end has returned, but works differently than
  15910. before. All Message buffers are now also articles in the @code{nndraft}
  15911. group, which is created automatically.
  15912. @item
  15913. @code{gnus-alter-header-function} can now be used to alter header
  15914. values.
  15915. @item
  15916. @code{gnus-summary-goto-article} now accept Message-ID's.
  15917. @item
  15918. A new Message command for deleting text in the body of a message
  15919. outside the region: @kbd{C-c C-v}.
  15920. @item
  15921. You can now post to component group in @code{nnvirtual} groups with
  15922. @kbd{C-u C-c C-c}.
  15923. @item
  15924. @code{nntp-rlogin-program}---new variable to ease customization.
  15925. @item
  15926. @code{C-u C-c C-c} in @code{gnus-article-edit-mode} will now inhibit
  15927. re-highlighting of the article buffer.
  15928. @item
  15929. New element in @code{gnus-boring-article-headers}---@code{long-to}.
  15930. @item
  15931. @kbd{M-i} symbolic prefix command. See the section "Symbolic
  15932. Prefixes" in the Gnus manual for details.
  15933. @item
  15934. @kbd{L} and @kbd{I} in the summary buffer now take the symbolic prefix
  15935. @kbd{a} to add the score rule to the "all.SCORE" file.
  15936. @item
  15937. @code{gnus-simplify-subject-functions} variable to allow greater
  15938. control over simplification.
  15939. @item
  15940. @kbd{A T}---new command for fetching the current thread.
  15941. @item
  15942. @kbd{/ T}---new command for including the current thread in the
  15943. limit.
  15944. @item
  15945. @kbd{M-@key{RET}} is a new Message command for breaking cited text.
  15946. @item
  15947. @samp{\\1}-expressions are now valid in @code{nnmail-split-methods}.
  15948. @item
  15949. The @code{custom-face-lookup} function has been removed.
  15950. If you used this function in your initialization files, you must
  15951. rewrite them to use @code{face-spec-set} instead.
  15952. @item
  15953. Canceling now uses the current select method. Symbolic prefix
  15954. @kbd{a} forces normal posting method.
  15955. @item
  15956. New command to translate M******** sm*rtq**t*s into proper
  15957. text---@kbd{W d}.
  15958. @item
  15959. For easier debugging of @code{nntp}, you can set
  15960. @code{nntp-record-commands} to a non-@code{nil} value.
  15961. @item
  15962. @code{nntp} now uses @file{~/.authinfo}, a @file{.netrc}-like file, for
  15963. controlling where and how to send @sc{authinfo} to @sc{nntp} servers.
  15964. @item
  15965. A command for editing group parameters from the summary buffer
  15966. has been added.
  15967. @item
  15968. A history of where mails have been split is available.
  15969. @item
  15970. A new article date command has been added---@code{article-date-iso8601}.
  15971. @item
  15972. Subjects can be simplified when threading by setting
  15973. @code{gnus-score-thread-simplify}.
  15974. @item
  15975. A new function for citing in Message has been
  15976. added---@code{message-cite-original-without-signature}.
  15977. @item
  15978. @code{article-strip-all-blank-lines}---new article command.
  15979. @item
  15980. A new Message command to kill to the end of the article has
  15981. been added.
  15982. @item
  15983. A minimum adaptive score can be specified by using the
  15984. @code{gnus-adaptive-word-minimum} variable.
  15985. @item
  15986. The "lapsed date" article header can be kept continually
  15987. updated by the @code{gnus-start-date-timer} command.
  15988. @item
  15989. Web listserv archives can be read with the @code{nnlistserv} back end.
  15990. @item
  15991. Old dejanews archives can now be read by @code{nnweb}.
  15992. @end itemize
  15993. @node Pterodactyl Gnus
  15994. @subsubsection Pterodactyl Gnus
  15995. New features in Gnus 5.8:
  15996. @itemize @bullet
  15997. @item The mail-fetching functions have changed. See the manual for the
  15998. many details. In particular, all procmail fetching variables are gone.
  15999. If you used procmail like in
  16000. @lisp
  16001. (setq nnmail-use-procmail t)
  16002. (setq nnmail-spool-file 'procmail)
  16003. (setq nnmail-procmail-directory "~/mail/incoming/")
  16004. (setq nnmail-procmail-suffix "\\.in")
  16005. @end lisp
  16006. this now has changed to
  16007. @lisp
  16008. (setq mail-sources
  16009. '((directory :path "~/mail/incoming/"
  16010. :suffix ".in")))
  16011. @end lisp
  16012. More information is available in the info doc at Select Methods ->
  16013. Getting Mail -> Mail Sources
  16014. @item Gnus is now a MIME-capable reader. This affects many parts of
  16015. Gnus, and adds a slew of new commands. See the manual for details.
  16016. @item Gnus has also been multilingualized. This also affects too
  16017. many parts of Gnus to summarize here, and adds many new variables.
  16018. @item @code{gnus-auto-select-first} can now be a function to be
  16019. called to position point.
  16020. @item The user can now decide which extra headers should be included in
  16021. summary buffers and NOV files.
  16022. @item @code{gnus-article-display-hook} has been removed. Instead, a number
  16023. of variables starting with @code{gnus-treat-} have been added.
  16024. @item The Gnus posting styles have been redone again and now works in a
  16025. subtly different manner.
  16026. @item New web-based back ends have been added: @code{nnslashdot},
  16027. @code{nnwarchive} and @code{nnultimate}. nnweb has been revamped,
  16028. again, to keep up with ever-changing layouts.
  16029. @item Gnus can now read IMAP mail via @code{nnimap}.
  16030. @end itemize
  16031. @iftex
  16032. @page
  16033. @node The Manual
  16034. @section The Manual
  16035. @cindex colophon
  16036. @cindex manual
  16037. This manual was generated from a TeXinfo file and then run through
  16038. either @code{texi2dvi}
  16039. @iflatex
  16040. or my own home-brewed TeXinfo to \LaTeX\ transformer,
  16041. and then run through @code{latex} and @code{dvips}
  16042. @end iflatex
  16043. to get what you hold in your hands now.
  16044. The following conventions have been used:
  16045. @enumerate
  16046. @item
  16047. This is a @samp{string}
  16048. @item
  16049. This is a @kbd{keystroke}
  16050. @item
  16051. This is a @file{file}
  16052. @item
  16053. This is a @code{symbol}
  16054. @end enumerate
  16055. So if I were to say ``set @code{flargnoze} to @samp{yes}'', that would
  16056. mean:
  16057. @lisp
  16058. (setq flargnoze "yes")
  16059. @end lisp
  16060. If I say ``set @code{flumphel} to @code{yes}'', that would mean:
  16061. @lisp
  16062. (setq flumphel 'yes)
  16063. @end lisp
  16064. @samp{yes} and @code{yes} are two @emph{very} different things---don't
  16065. ever get them confused.
  16066. @iflatex
  16067. @c @head
  16068. Of course, everything in this manual is of vital interest, so you should
  16069. read it all. Several times. However, if you feel like skimming the
  16070. manual, look for that gnu head you should see in the margin over
  16071. there---it means that what's being discussed is of more importance than
  16072. the rest of the stuff. (On the other hand, if everything is infinitely
  16073. important, how can anything be more important than that? Just one more
  16074. of the mysteries of this world, I guess.)
  16075. @end iflatex
  16076. @end iftex
  16077. @node On Writing Manuals
  16078. @section On Writing Manuals
  16079. I guess most manuals are written after-the-fact; documenting a program
  16080. that's already there. This is not how this manual is written. When
  16081. implementing something, I write the manual entry for that something
  16082. straight away. I then see that it's difficult to explain the
  16083. functionality, so I write how it's supposed to be, and then I change the
  16084. implementation. Writing the documentation and writing the code goes
  16085. hand in hand.
  16086. This, of course, means that this manual has no, or little, flow. It
  16087. documents absolutely everything in Gnus, but often not where you're
  16088. looking for it. It is a reference manual, and not a guide to how to get
  16089. started with Gnus.
  16090. That would be a totally different book, that should be written using the
  16091. reference manual as source material. It would look quite differently.
  16092. @page
  16093. @node Terminology
  16094. @section Terminology
  16095. @cindex terminology
  16096. @table @dfn
  16097. @item news
  16098. @cindex news
  16099. This is what you are supposed to use this thing for---reading news.
  16100. News is generally fetched from a nearby @sc{nntp} server, and is
  16101. generally publicly available to everybody. If you post news, the entire
  16102. world is likely to read just what you have written, and they'll all
  16103. snigger mischievously. Behind your back.
  16104. @item mail
  16105. @cindex mail
  16106. Everything that's delivered to you personally is mail. Some news/mail
  16107. readers (like Gnus) blur the distinction between mail and news, but
  16108. there is a difference. Mail is private. News is public. Mailing is
  16109. not posting, and replying is not following up.
  16110. @item reply
  16111. @cindex reply
  16112. Send a mail to the person who has written what you are reading.
  16113. @item follow up
  16114. @cindex follow up
  16115. Post an article to the current newsgroup responding to the article you
  16116. are reading.
  16117. @item back end
  16118. @cindex back end
  16119. Gnus gets fed articles from a number of back ends, both news and mail
  16120. back ends. Gnus does not handle the underlying media, so to speak---this
  16121. is all done by the back ends.
  16122. @item native
  16123. @cindex native
  16124. Gnus will always use one method (and back end) as the @dfn{native}, or
  16125. default, way of getting news.
  16126. @item foreign
  16127. @cindex foreign
  16128. You can also have any number of foreign groups active at the same time.
  16129. These are groups that use non-native non-secondary back ends for getting
  16130. news.
  16131. @item secondary
  16132. @cindex secondary
  16133. Secondary back ends are somewhere half-way between being native and being
  16134. foreign, but they mostly act like they are native.
  16135. @item article
  16136. @cindex article
  16137. A message that has been posted as news.
  16138. @item mail message
  16139. @cindex mail message
  16140. A message that has been mailed.
  16141. @item message
  16142. @cindex message
  16143. A mail message or news article
  16144. @item head
  16145. @cindex head
  16146. The top part of a message, where administrative information (etc.) is
  16147. put.
  16148. @item body
  16149. @cindex body
  16150. The rest of an article. Everything not in the head is in the
  16151. body.
  16152. @item header
  16153. @cindex header
  16154. A line from the head of an article.
  16155. @item headers
  16156. @cindex headers
  16157. A collection of such lines, or a collection of heads. Or even a
  16158. collection of @sc{nov} lines.
  16159. @item @sc{nov}
  16160. @cindex nov
  16161. When Gnus enters a group, it asks the back end for the headers of all
  16162. unread articles in the group. Most servers support the News OverView
  16163. format, which is more compact and much faster to read and parse than the
  16164. normal @sc{head} format.
  16165. @item level
  16166. @cindex levels
  16167. Each group is subscribed at some @dfn{level} or other (1-9). The ones
  16168. that have a lower level are ``more'' subscribed than the groups with a
  16169. higher level. In fact, groups on levels 1-5 are considered
  16170. @dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9
  16171. are @dfn{killed}. Commands for listing groups and scanning for new
  16172. articles will all use the numeric prefix as @dfn{working level}.
  16173. @item killed groups
  16174. @cindex killed groups
  16175. No information on killed groups is stored or updated, which makes killed
  16176. groups much easier to handle than subscribed groups.
  16177. @item zombie groups
  16178. @cindex zombie groups
  16179. Just like killed groups, only slightly less dead.
  16180. @item active file
  16181. @cindex active file
  16182. The news server has to keep track of what articles it carries, and what
  16183. groups exist. All this information in stored in the active file, which
  16184. is rather large, as you might surmise.
  16185. @item bogus groups
  16186. @cindex bogus groups
  16187. A group that exists in the @file{.newsrc} file, but isn't known to the
  16188. server (i.e., it isn't in the active file), is a @emph{bogus group}.
  16189. This means that the group probably doesn't exist (any more).
  16190. @item activating
  16191. @cindex activating groups
  16192. The act of asking the server for info on a group and computing the
  16193. number of unread articles is called @dfn{activating the group}.
  16194. Un-activated groups are listed with @samp{*} in the group buffer.
  16195. @item server
  16196. @cindex server
  16197. A machine one can connect to and get news (or mail) from.
  16198. @item select method
  16199. @cindex select method
  16200. A structure that specifies the back end, the server and the virtual
  16201. server settings.
  16202. @item virtual server
  16203. @cindex virtual server
  16204. A named select method. Since a select method defines all there is to
  16205. know about connecting to a (physical) server, taking the thing as a
  16206. whole is a virtual server.
  16207. @item washing
  16208. @cindex washing
  16209. Taking a buffer and running it through a filter of some sort. The
  16210. result will (more often than not) be cleaner and more pleasing than the
  16211. original.
  16212. @item ephemeral groups
  16213. @cindex ephemeral groups
  16214. Most groups store data on what articles you have read. @dfn{Ephemeral}
  16215. groups are groups that will have no data stored---when you exit the
  16216. group, it'll disappear into the aether.
  16217. @item solid groups
  16218. @cindex solid groups
  16219. This is the opposite of ephemeral groups. All groups listed in the
  16220. group buffer are solid groups.
  16221. @item sparse articles
  16222. @cindex sparse articles
  16223. These are article placeholders shown in the summary buffer when
  16224. @code{gnus-build-sparse-threads} has been switched on.
  16225. @item threading
  16226. @cindex threading
  16227. To put responses to articles directly after the articles they respond
  16228. to---in a hierarchical fashion.
  16229. @item root
  16230. @cindex root
  16231. @cindex thread root
  16232. The first article in a thread is the root. It is the ancestor of all
  16233. articles in the thread.
  16234. @item parent
  16235. @cindex parent
  16236. An article that has responses.
  16237. @item child
  16238. @cindex child
  16239. An article that responds to a different article---its parent.
  16240. @item digest
  16241. @cindex digest
  16242. A collection of messages in one file. The most common digest format is
  16243. specified by RFC 1153.
  16244. @end table
  16245. @page
  16246. @node Customization
  16247. @section Customization
  16248. @cindex general customization
  16249. All variables are properly documented elsewhere in this manual. This
  16250. section is designed to give general pointers on how to customize Gnus
  16251. for some quite common situations.
  16252. @menu
  16253. * Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
  16254. * Slow Terminal Connection:: You run a remote Emacs.
  16255. * Little Disk Space:: You feel that having large setup files is icky.
  16256. * Slow Machine:: You feel like buying a faster machine.
  16257. @end menu
  16258. @node Slow/Expensive Connection
  16259. @subsection Slow/Expensive @sc{nntp} Connection
  16260. If you run Emacs on a machine locally, and get your news from a machine
  16261. over some very thin strings, you want to cut down on the amount of data
  16262. Gnus has to get from the @sc{nntp} server.
  16263. @table @code
  16264. @item gnus-read-active-file
  16265. Set this to @code{nil}, which will inhibit Gnus from requesting the
  16266. entire active file from the server. This file is often very large. You
  16267. also have to set @code{gnus-check-new-newsgroups} and
  16268. @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus
  16269. doesn't suddenly decide to fetch the active file anyway.
  16270. @item gnus-nov-is-evil
  16271. This one has to be @code{nil}. If not, grabbing article headers from
  16272. the @sc{nntp} server will not be very fast. Not all @sc{nntp} servers
  16273. support @sc{xover}; Gnus will detect this by itself.
  16274. @end table
  16275. @node Slow Terminal Connection
  16276. @subsection Slow Terminal Connection
  16277. Let's say you use your home computer for dialing up the system that runs
  16278. Emacs and Gnus. If your modem is slow, you want to reduce (as much as
  16279. possible) the amount of data sent over the wires.
  16280. @table @code
  16281. @item gnus-auto-center-summary
  16282. Set this to @code{nil} to inhibit Gnus from re-centering the summary
  16283. buffer all the time. If it is @code{vertical}, do only vertical
  16284. re-centering. If it is neither @code{nil} nor @code{vertical}, do both
  16285. horizontal and vertical recentering.
  16286. @item gnus-visible-headers
  16287. Cut down on the headers included in the articles to the
  16288. minimum. You can, in fact, make do without them altogether---most of the
  16289. useful data is in the summary buffer, anyway. Set this variable to
  16290. @samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need.
  16291. Set this hook to all the available hiding commands:
  16292. @lisp
  16293. (setq gnus-treat-hide-headers 'head
  16294. gnus-treat-hide-signature t
  16295. gnus-treat-hide-citation t)
  16296. @end lisp
  16297. @item gnus-use-full-window
  16298. By setting this to @code{nil}, you can make all the windows smaller.
  16299. While this doesn't really cut down much generally, it means that you
  16300. have to see smaller portions of articles before deciding that you didn't
  16301. want to read them anyway.
  16302. @item gnus-thread-hide-subtree
  16303. If this is non-@code{nil}, all threads in the summary buffer will be
  16304. hidden initially.
  16305. @item gnus-updated-mode-lines
  16306. If this is @code{nil}, Gnus will not put information in the buffer mode
  16307. lines, which might save some time.
  16308. @end table
  16309. @node Little Disk Space
  16310. @subsection Little Disk Space
  16311. @cindex disk space
  16312. The startup files can get rather large, so you may want to cut their
  16313. sizes a bit if you are running out of space.
  16314. @table @code
  16315. @item gnus-save-newsrc-file
  16316. If this is @code{nil}, Gnus will never save @file{.newsrc}---it will
  16317. only save @file{.newsrc.eld}. This means that you will not be able to
  16318. use any other newsreaders than Gnus. This variable is @code{t} by
  16319. default.
  16320. @item gnus-read-newsrc-file
  16321. If this is @code{nil}, Gnus will never read @file{.newsrc}---it will
  16322. only read @file{.newsrc.eld}. This means that you will not be able to
  16323. use any other newsreaders than Gnus. This variable is @code{t} by
  16324. default.
  16325. @item gnus-save-killed-list
  16326. If this is @code{nil}, Gnus will not save the list of dead groups. You
  16327. should also set @code{gnus-check-new-newsgroups} to @code{ask-server}
  16328. and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this
  16329. variable to @code{nil}. This variable is @code{t} by default.
  16330. @end table
  16331. @node Slow Machine
  16332. @subsection Slow Machine
  16333. @cindex slow machine
  16334. If you have a slow machine, or are just really impatient, there are a
  16335. few things you can do to make Gnus run faster.
  16336. Set @code{gnus-check-new-newsgroups} and
  16337. @code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster.
  16338. Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and
  16339. @code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the
  16340. summary buffer faster.
  16341. @page
  16342. @node Troubleshooting
  16343. @section Troubleshooting
  16344. @cindex troubleshooting
  16345. Gnus works @emph{so} well straight out of the box---I can't imagine any
  16346. problems, really.
  16347. Ahem.
  16348. @enumerate
  16349. @item
  16350. Make sure your computer is switched on.
  16351. @item
  16352. Make sure that you really load the current Gnus version. If you have
  16353. been running @sc{gnus}, you need to exit Emacs and start it up again before
  16354. Gnus will work.
  16355. @item
  16356. Try doing an @kbd{M-x gnus-version}. If you get something that looks
  16357. like @samp{Gnus v5.46; nntp 4.0} you have the right files loaded. If,
  16358. on the other hand, you get something like @samp{NNTP 3.x} or @samp{nntp
  16359. flee}, you have some old @file{.el} files lying around. Delete these.
  16360. @item
  16361. Read the help group (@kbd{G h} in the group buffer) for a FAQ and a
  16362. how-to.
  16363. @item
  16364. @vindex max-lisp-eval-depth
  16365. Gnus works on many recursive structures, and in some extreme (and very
  16366. rare) cases Gnus may recurse down ``too deeply'' and Emacs will beep at
  16367. you. If this happens to you, set @code{max-lisp-eval-depth} to 500 or
  16368. something like that.
  16369. @end enumerate
  16370. If all else fails, report the problem as a bug.
  16371. @cindex bugs
  16372. @cindex reporting bugs
  16373. @kindex M-x gnus-bug
  16374. @findex gnus-bug
  16375. If you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug}
  16376. command. @kbd{M-x set-variable @key{RET} debug-on-error @key{RET} t @key{RET}}, and send
  16377. me the backtrace. I will fix bugs, but I can only fix them if you send
  16378. me a precise description as to how to reproduce the bug.
  16379. You really can never be too detailed in a bug report. Always use the
  16380. @kbd{M-x gnus-bug} command when you make bug reports, even if it creates
  16381. a 10Kb mail each time you use it, and even if you have sent me your
  16382. environment 500 times before. I don't care. I want the full info each
  16383. time.
  16384. It is also important to remember that I have no memory whatsoever. If
  16385. you send a bug report, and I send you a reply, and then you just send
  16386. back ``No, it's not! Moron!'', I will have no idea what you are
  16387. insulting me about. Always over-explain everything. It's much easier
  16388. for all of us---if I don't have all the information I need, I will just
  16389. mail you and ask for more info, and everything takes more time.
  16390. If the problem you're seeing is very visual, and you can't quite explain
  16391. it, copy the Emacs window to a file (with @code{xwd}, for instance), put
  16392. it somewhere it can be reached, and include the URL of the picture in
  16393. the bug report.
  16394. If you just need help, you are better off asking on
  16395. @samp{gnu.emacs.gnus}. I'm not very helpful.
  16396. @cindex gnu.emacs.gnus
  16397. @cindex ding mailing list
  16398. You can also ask on the ding mailing list---@samp{ding@@gnus.org}.
  16399. Write to @samp{ding-request@@gnus.org} to subscribe.
  16400. @page
  16401. @node Gnus Reference Guide
  16402. @section Gnus Reference Guide
  16403. It is my hope that other people will figure out smart stuff that Gnus
  16404. can do, and that other people will write those smart things as well. To
  16405. facilitate that I thought it would be a good idea to describe the inner
  16406. workings of Gnus. And some of the not-so-inner workings, while I'm at
  16407. it.
  16408. You can never expect the internals of a program not to change, but I
  16409. will be defining (in some details) the interface between Gnus and its
  16410. back ends (this is written in stone), the format of the score files
  16411. (ditto), data structures (some are less likely to change than others)
  16412. and general methods of operation.
  16413. @menu
  16414. * Gnus Utility Functions:: Common functions and variable to use.
  16415. * Back End Interface:: How Gnus communicates with the servers.
  16416. * Score File Syntax:: A BNF definition of the score file standard.
  16417. * Headers:: How Gnus stores headers internally.
  16418. * Ranges:: A handy format for storing mucho numbers.
  16419. * Group Info:: The group info format.
  16420. * Extended Interactive:: Symbolic prefixes and stuff.
  16421. * Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.
  16422. * Various File Formats:: Formats of files that Gnus use.
  16423. @end menu
  16424. @node Gnus Utility Functions
  16425. @subsection Gnus Utility Functions
  16426. @cindex Gnus utility functions
  16427. @cindex utility functions
  16428. @cindex functions
  16429. @cindex internal variables
  16430. When writing small functions to be run from hooks (and stuff), it's
  16431. vital to have access to the Gnus internal functions and variables.
  16432. Below is a list of the most common ones.
  16433. @table @code
  16434. @item gnus-newsgroup-name
  16435. @vindex gnus-newsgroup-name
  16436. This variable holds the name of the current newsgroup.
  16437. @item gnus-find-method-for-group
  16438. @findex gnus-find-method-for-group
  16439. A function that returns the select method for @var{group}.
  16440. @item gnus-group-real-name
  16441. @findex gnus-group-real-name
  16442. Takes a full (prefixed) Gnus group name, and returns the unprefixed
  16443. name.
  16444. @item gnus-group-prefixed-name
  16445. @findex gnus-group-prefixed-name
  16446. Takes an unprefixed group name and a select method, and returns the full
  16447. (prefixed) Gnus group name.
  16448. @item gnus-get-info
  16449. @findex gnus-get-info
  16450. Returns the group info list for @var{group}.
  16451. @item gnus-group-unread
  16452. @findex gnus-group-unread
  16453. The number of unread articles in @var{group}, or @code{t} if that is
  16454. unknown.
  16455. @item gnus-active
  16456. @findex gnus-active
  16457. The active entry for @var{group}.
  16458. @item gnus-set-active
  16459. @findex gnus-set-active
  16460. Set the active entry for @var{group}.
  16461. @item gnus-add-current-to-buffer-list
  16462. @findex gnus-add-current-to-buffer-list
  16463. Adds the current buffer to the list of buffers to be killed on Gnus
  16464. exit.
  16465. @item gnus-continuum-version
  16466. @findex gnus-continuum-version
  16467. Takes a Gnus version string as a parameter and returns a floating point
  16468. number. Earlier versions will always get a lower number than later
  16469. versions.
  16470. @item gnus-group-read-only-p
  16471. @findex gnus-group-read-only-p
  16472. Says whether @var{group} is read-only or not.
  16473. @item gnus-news-group-p
  16474. @findex gnus-news-group-p
  16475. Says whether @var{group} came from a news back end.
  16476. @item gnus-ephemeral-group-p
  16477. @findex gnus-ephemeral-group-p
  16478. Says whether @var{group} is ephemeral or not.
  16479. @item gnus-server-to-method
  16480. @findex gnus-server-to-method
  16481. Returns the select method corresponding to @var{server}.
  16482. @item gnus-server-equal
  16483. @findex gnus-server-equal
  16484. Says whether two virtual servers are equal.
  16485. @item gnus-group-native-p
  16486. @findex gnus-group-native-p
  16487. Says whether @var{group} is native or not.
  16488. @item gnus-group-secondary-p
  16489. @findex gnus-group-secondary-p
  16490. Says whether @var{group} is secondary or not.
  16491. @item gnus-group-foreign-p
  16492. @findex gnus-group-foreign-p
  16493. Says whether @var{group} is foreign or not.
  16494. @item group-group-find-parameter
  16495. @findex group-group-find-parameter
  16496. Returns the parameter list of @var{group}. If given a second parameter,
  16497. returns the value of that parameter for @var{group}.
  16498. @item gnus-group-set-parameter
  16499. @findex gnus-group-set-parameter
  16500. Takes three parameters; @var{group}, @var{parameter} and @var{value}.
  16501. @item gnus-narrow-to-body
  16502. @findex gnus-narrow-to-body
  16503. Narrows the current buffer to the body of the article.
  16504. @item gnus-check-backend-function
  16505. @findex gnus-check-backend-function
  16506. Takes two parameters, @var{function} and @var{group}. If the back end
  16507. @var{group} comes from supports @var{function}, return non-@code{nil}.
  16508. @lisp
  16509. (gnus-check-backend-function "request-scan" "nnml:misc")
  16510. @result{} t
  16511. @end lisp
  16512. @item gnus-read-method
  16513. @findex gnus-read-method
  16514. Prompts the user for a select method.
  16515. @end table
  16516. @node Back End Interface
  16517. @subsection Back End Interface
  16518. Gnus doesn't know anything about @sc{nntp}, spools, mail or virtual
  16519. groups. It only knows how to talk to @dfn{virtual servers}. A virtual
  16520. server is a @dfn{back end} and some @dfn{back end variables}. As examples
  16521. of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}. As
  16522. examples of the latter we have @code{nntp-port-number} and
  16523. @code{nnmbox-directory}.
  16524. When Gnus asks for information from a back end---say @code{nntp}---on
  16525. something, it will normally include a virtual server name in the
  16526. function parameters. (If not, the back end should use the ``current''
  16527. virtual server.) For instance, @code{nntp-request-list} takes a virtual
  16528. server as its only (optional) parameter. If this virtual server hasn't
  16529. been opened, the function should fail.
  16530. Note that a virtual server name has no relation to some physical server
  16531. name. Take this example:
  16532. @lisp
  16533. (nntp "odd-one"
  16534. (nntp-address "ifi.uio.no")
  16535. (nntp-port-number 4324))
  16536. @end lisp
  16537. Here the virtual server name is @samp{odd-one} while the name of
  16538. the physical server is @samp{ifi.uio.no}.
  16539. The back ends should be able to switch between several virtual servers.
  16540. The standard back ends implement this by keeping an alist of virtual
  16541. server environments that they pull down/push up when needed.
  16542. There are two groups of interface functions: @dfn{required functions},
  16543. which must be present, and @dfn{optional functions}, which Gnus will
  16544. always check for presence before attempting to call 'em.
  16545. All these functions are expected to return data in the buffer
  16546. @code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat
  16547. unfortunately named, but we'll have to live with it. When I talk about
  16548. @dfn{resulting data}, I always refer to the data in that buffer. When I
  16549. talk about @dfn{return value}, I talk about the function value returned by
  16550. the function call. Functions that fail should return @code{nil} as the
  16551. return value.
  16552. Some back ends could be said to be @dfn{server-forming} back ends, and
  16553. some might be said not to be. The latter are back ends that generally
  16554. only operate on one group at a time, and have no concept of ``server''
  16555. -- they have a group, and they deliver info on that group and nothing
  16556. more.
  16557. In the examples and definitions I will refer to the imaginary back end
  16558. @code{nnchoke}.
  16559. @cindex @code{nnchoke}
  16560. @menu
  16561. * Required Back End Functions:: Functions that must be implemented.
  16562. * Optional Back End Functions:: Functions that need not be implemented.
  16563. * Error Messaging:: How to get messages and report errors.
  16564. * Writing New Back Ends:: Extending old back ends.
  16565. * Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end.
  16566. * Mail-like Back Ends:: Some tips on mail back ends.
  16567. @end menu
  16568. @node Required Back End Functions
  16569. @subsubsection Required Back End Functions
  16570. @table @code
  16571. @item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD)
  16572. @var{articles} is either a range of article numbers or a list of
  16573. @code{Message-ID}s. Current back ends do not fully support either---only
  16574. sequences (lists) of article numbers, and most back ends do not support
  16575. retrieval of @code{Message-ID}s. But they should try for both.
  16576. The result data should either be HEADs or NOV lines, and the result
  16577. value should either be @code{headers} or @code{nov} to reflect this.
  16578. This might later be expanded to @code{various}, which will be a mixture
  16579. of HEADs and NOV lines, but this is currently not supported by Gnus.
  16580. If @var{fetch-old} is non-@code{nil} it says to try fetching "extra
  16581. headers", in some meaning of the word. This is generally done by
  16582. fetching (at most) @var{fetch-old} extra headers less than the smallest
  16583. article number in @code{articles}, and filling the gaps as well. The
  16584. presence of this parameter can be ignored if the back end finds it
  16585. cumbersome to follow the request. If this is non-@code{nil} and not a
  16586. number, do maximum fetches.
  16587. Here's an example HEAD:
  16588. @example
  16589. 221 1056 Article retrieved.
  16590. Path: ifi.uio.no!sturles
  16591. From: sturles@@ifi.uio.no (Sturle Sunde)
  16592. Newsgroups: ifi.discussion
  16593. Subject: Re: Something very droll
  16594. Date: 27 Oct 1994 14:02:57 +0100
  16595. Organization: Dept. of Informatics, University of Oslo, Norway
  16596. Lines: 26
  16597. Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no>
  16598. References: <38jdmq$4qu@@visbur.ifi.uio.no>
  16599. NNTP-Posting-Host: holmenkollen.ifi.uio.no
  16600. .
  16601. @end example
  16602. So a @code{headers} return value would imply that there's a number of
  16603. these in the data buffer.
  16604. Here's a BNF definition of such a buffer:
  16605. @example
  16606. headers = *head
  16607. head = error / valid-head
  16608. error-message = [ "4" / "5" ] 2number " " <error message> eol
  16609. valid-head = valid-message *header "." eol
  16610. valid-message = "221 " <number> " Article retrieved." eol
  16611. header = <text> eol
  16612. @end example
  16613. If the return value is @code{nov}, the data buffer should contain
  16614. @dfn{network overview database} lines. These are basically fields
  16615. separated by tabs.
  16616. @example
  16617. nov-buffer = *nov-line
  16618. nov-line = 8*9 [ field <TAB> ] eol
  16619. field = <text except TAB>
  16620. @end example
  16621. For a closer look at what should be in those fields,
  16622. @pxref{Headers}.
  16623. @item (nnchoke-open-server SERVER &optional DEFINITIONS)
  16624. @var{server} is here the virtual server name. @var{definitions} is a
  16625. list of @code{(VARIABLE VALUE)} pairs that define this virtual server.
  16626. If the server can't be opened, no error should be signaled. The back end
  16627. may then choose to refuse further attempts at connecting to this
  16628. server. In fact, it should do so.
  16629. If the server is opened already, this function should return a
  16630. non-@code{nil} value. There should be no data returned.
  16631. @item (nnchoke-close-server &optional SERVER)
  16632. Close connection to @var{server} and free all resources connected
  16633. to it. Return @code{nil} if the server couldn't be closed for some
  16634. reason.
  16635. There should be no data returned.
  16636. @item (nnchoke-request-close)
  16637. Close connection to all servers and free all resources that the back end
  16638. have reserved. All buffers that have been created by that back end
  16639. should be killed. (Not the @code{nntp-server-buffer}, though.) This
  16640. function is generally only called when Gnus is shutting down.
  16641. There should be no data returned.
  16642. @item (nnchoke-server-opened &optional SERVER)
  16643. If @var{server} is the current virtual server, and the connection to the
  16644. physical server is alive, then this function should return a
  16645. non-@code{nil} vlue. This function should under no circumstances
  16646. attempt to reconnect to a server we have lost connection to.
  16647. There should be no data returned.
  16648. @item (nnchoke-status-message &optional SERVER)
  16649. This function should return the last error message from @var{server}.
  16650. There should be no data returned.
  16651. @item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER)
  16652. The result data from this function should be the article specified by
  16653. @var{article}. This might either be a @code{Message-ID} or a number.
  16654. It is optional whether to implement retrieval by @code{Message-ID}, but
  16655. it would be nice if that were possible.
  16656. If @var{to-buffer} is non-@code{nil}, the result data should be returned
  16657. in this buffer instead of the normal data buffer. This is to make it
  16658. possible to avoid copying large amounts of data from one buffer to
  16659. another, while Gnus mainly requests articles to be inserted directly
  16660. into its article buffer.
  16661. If it is at all possible, this function should return a cons cell where
  16662. the @code{car} is the group name the article was fetched from, and the @code{cdr} is
  16663. the article number. This will enable Gnus to find out what the real
  16664. group and article numbers are when fetching articles by
  16665. @code{Message-ID}. If this isn't possible, @code{t} should be returned
  16666. on successful article retrieval.
  16667. @item (nnchoke-request-group GROUP &optional SERVER FAST)
  16668. Get data on @var{group}. This function also has the side effect of
  16669. making @var{group} the current group.
  16670. If @var{fast}, don't bother to return useful data, just make @var{group}
  16671. the current group.
  16672. Here's an example of some result data and a definition of the same:
  16673. @example
  16674. 211 56 1000 1059 ifi.discussion
  16675. @end example
  16676. The first number is the status, which should be 211. Next is the
  16677. total number of articles in the group, the lowest article number, the
  16678. highest article number, and finally the group name. Note that the total
  16679. number of articles may be less than one might think while just
  16680. considering the highest and lowest article numbers, but some articles
  16681. may have been canceled. Gnus just discards the total-number, so
  16682. whether one should take the bother to generate it properly (if that is a
  16683. problem) is left as an exercise to the reader.
  16684. @example
  16685. group-status = [ error / info ] eol
  16686. error = [ "4" / "5" ] 2<number> " " <Error message>
  16687. info = "211 " 3* [ <number> " " ] <string>
  16688. @end example
  16689. @item (nnchoke-close-group GROUP &optional SERVER)
  16690. Close @var{group} and free any resources connected to it. This will be
  16691. a no-op on most back ends.
  16692. There should be no data returned.
  16693. @item (nnchoke-request-list &optional SERVER)
  16694. Return a list of all groups available on @var{server}. And that means
  16695. @emph{all}.
  16696. Here's an example from a server that only carries two groups:
  16697. @example
  16698. ifi.test 0000002200 0000002000 y
  16699. ifi.discussion 3324 3300 n
  16700. @end example
  16701. On each line we have a group name, then the highest article number in
  16702. that group, the lowest article number, and finally a flag.
  16703. @example
  16704. active-file = *active-line
  16705. active-line = name " " <number> " " <number> " " flags eol
  16706. name = <string>
  16707. flags = "n" / "y" / "m" / "x" / "j" / "=" name
  16708. @end example
  16709. The flag says whether the group is read-only (@samp{n}), is moderated
  16710. (@samp{m}), is dead (@samp{x}), is aliased to some other group
  16711. (@samp{=other-group}) or none of the above (@samp{y}).
  16712. @item (nnchoke-request-post &optional SERVER)
  16713. This function should post the current buffer. It might return whether
  16714. the posting was successful or not, but that's not required. If, for
  16715. instance, the posting is done asynchronously, it has generally not been
  16716. completed by the time this function concludes. In that case, this
  16717. function should set up some kind of sentinel to beep the user loud and
  16718. clear if the posting could not be completed.
  16719. There should be no result data from this function.
  16720. @end table
  16721. @node Optional Back End Functions
  16722. @subsubsection Optional Back End Functions
  16723. @table @code
  16724. @item (nnchoke-retrieve-groups GROUPS &optional SERVER)
  16725. @var{groups} is a list of groups, and this function should request data
  16726. on all those groups. How it does it is of no concern to Gnus, but it
  16727. should attempt to do this in a speedy fashion.
  16728. The return value of this function can be either @code{active} or
  16729. @code{group}, which says what the format of the result data is. The
  16730. former is in the same format as the data from
  16731. @code{nnchoke-request-list}, while the latter is a buffer full of lines
  16732. in the same format as @code{nnchoke-request-group} gives.
  16733. @example
  16734. group-buffer = *active-line / *group-status
  16735. @end example
  16736. @item (nnchoke-request-update-info GROUP INFO &optional SERVER)
  16737. A Gnus group info (@pxref{Group Info}) is handed to the back end for
  16738. alterations. This comes in handy if the back end really carries all the
  16739. information (as is the case with virtual and imap groups). This
  16740. function should destructively alter the info to suit its needs, and
  16741. should return the (altered) group info.
  16742. There should be no result data from this function.
  16743. @item (nnchoke-request-type GROUP &optional ARTICLE)
  16744. When the user issues commands for ``sending news'' (@kbd{F} in the
  16745. summary buffer, for instance), Gnus has to know whether the article the
  16746. user is following up on is news or mail. This function should return
  16747. @code{news} if @var{article} in @var{group} is news, @code{mail} if it
  16748. is mail and @code{unknown} if the type can't be decided. (The
  16749. @var{article} parameter is necessary in @code{nnvirtual} groups which
  16750. might very well combine mail groups and news groups.) Both @var{group}
  16751. and @var{article} may be @code{nil}.
  16752. There should be no result data from this function.
  16753. @item (nnchoke-request-set-mark GROUP ACTION &optional SERVER)
  16754. Set/remove/add marks on articles. Normally Gnus handles the article
  16755. marks (such as read, ticked, expired etc) internally, and store them in
  16756. @code{~/.newsrc.eld}. Some back ends (such as @sc{imap}) however carry
  16757. all information about the articles on the server, so Gnus need to
  16758. propagate the mark information to the server.
  16759. ACTION is a list of mark setting requests, having this format:
  16760. @example
  16761. (RANGE ACTION MARK)
  16762. @end example
  16763. Range is a range of articles you wish to update marks on. Action is
  16764. @code{set}, @code{add} or @code{del}, respectively used for removing all
  16765. existing marks and setting them as specified, adding (preserving the
  16766. marks not mentioned) mark and removing (preserving the marks not
  16767. mentioned) marks. Mark is a list of marks; where each mark is a symbol.
  16768. Currently used marks are @code{read}, @code{tick}, @code{reply},
  16769. @code{expire}, @code{killed}, @code{dormant}, @code{save},
  16770. @code{download} and @code{unsend}, but your back end should, if possible,
  16771. not limit itself to these.
  16772. Given contradictory actions, the last action in the list should be the
  16773. effective one. That is, if your action contains a request to add the
  16774. @code{tick} mark on article 1 and, later in the list, a request to
  16775. remove the mark on the same article, the mark should in fact be removed.
  16776. An example action list:
  16777. @example
  16778. (((5 12 30) 'del '(tick))
  16779. ((10 . 90) 'add '(read expire))
  16780. ((92 94) 'del '(read)))
  16781. @end example
  16782. The function should return a range of articles it wasn't able to set the
  16783. mark on (currently not used for anything).
  16784. There should be no result data from this function.
  16785. @item (nnchoke-request-update-mark GROUP ARTICLE MARK)
  16786. If the user tries to set a mark that the back end doesn't like, this
  16787. function may change the mark. Gnus will use whatever this function
  16788. returns as the mark for @var{article} instead of the original
  16789. @var{mark}. If the back end doesn't care, it must return the original
  16790. @var{mark}, and not @code{nil} or any other type of garbage.
  16791. The only use for this I can see is what @code{nnvirtual} does with
  16792. it---if a component group is auto-expirable, marking an article as read
  16793. in the virtual group should result in the article being marked as
  16794. expirable.
  16795. There should be no result data from this function.
  16796. @item (nnchoke-request-scan &optional GROUP SERVER)
  16797. This function may be called at any time (by Gnus or anything else) to
  16798. request that the back end check for incoming articles, in one way or
  16799. another. A mail back end will typically read the spool file or query the
  16800. POP server when this function is invoked. The @var{group} doesn't have
  16801. to be heeded---if the back end decides that it is too much work just
  16802. scanning for a single group, it may do a total scan of all groups. It
  16803. would be nice, however, to keep things local if that's practical.
  16804. There should be no result data from this function.
  16805. @item (nnchoke-request-group-description GROUP &optional SERVER)
  16806. The result data from this function should be a description of
  16807. @var{group}.
  16808. @example
  16809. description-line = name <TAB> description eol
  16810. name = <string>
  16811. description = <text>
  16812. @end example
  16813. @item (nnchoke-request-list-newsgroups &optional SERVER)
  16814. The result data from this function should be the description of all
  16815. groups available on the server.
  16816. @example
  16817. description-buffer = *description-line
  16818. @end example
  16819. @item (nnchoke-request-newgroups DATE &optional SERVER)
  16820. The result data from this function should be all groups that were
  16821. created after @samp{date}, which is in normal human-readable date
  16822. format. The data should be in the active buffer format.
  16823. @item (nnchoke-request-create-group GROUP &optional SERVER)
  16824. This function should create an empty group with name @var{group}.
  16825. There should be no return data.
  16826. @item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE)
  16827. This function should run the expiry process on all articles in the
  16828. @var{articles} range (which is currently a simple list of article
  16829. numbers.) It is left up to the back end to decide how old articles
  16830. should be before they are removed by this function. If @var{force} is
  16831. non-@code{nil}, all @var{articles} should be deleted, no matter how new
  16832. they are.
  16833. This function should return a list of articles that it did not/was not
  16834. able to delete.
  16835. There should be no result data returned.
  16836. @item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM
  16837. &optional LAST)
  16838. This function should move @var{article} (which is a number) from
  16839. @var{group} by calling @var{accept-form}.
  16840. This function should ready the article in question for moving by
  16841. removing any header lines it has added to the article, and generally
  16842. should ``tidy up'' the article. Then it should @code{eval}
  16843. @var{accept-form} in the buffer where the ``tidy'' article is. This
  16844. will do the actual copying. If this @code{eval} returns a
  16845. non-@code{nil} value, the article should be removed.
  16846. If @var{last} is @code{nil}, that means that there is a high likelihood
  16847. that there will be more requests issued shortly, so that allows some
  16848. optimizations.
  16849. The function should return a cons where the @code{car} is the group name and
  16850. the @code{cdr} is the article number that the article was entered as.
  16851. There should be no data returned.
  16852. @item (nnchoke-request-accept-article GROUP &optional SERVER LAST)
  16853. This function takes the current buffer and inserts it into @var{group}.
  16854. If @var{last} in @code{nil}, that means that there will be more calls to
  16855. this function in short order.
  16856. The function should return a cons where the @code{car} is the group name and
  16857. the @code{cdr} is the article number that the article was entered as.
  16858. There should be no data returned.
  16859. @item (nnchoke-request-replace-article ARTICLE GROUP BUFFER)
  16860. This function should remove @var{article} (which is a number) from
  16861. @var{group} and insert @var{buffer} there instead.
  16862. There should be no data returned.
  16863. @item (nnchoke-request-delete-group GROUP FORCE &optional SERVER)
  16864. This function should delete @var{group}. If @var{force}, it should
  16865. really delete all the articles in the group, and then delete the group
  16866. itself. (If there is such a thing as ``the group itself''.)
  16867. There should be no data returned.
  16868. @item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER)
  16869. This function should rename @var{group} into @var{new-name}. All
  16870. articles in @var{group} should move to @var{new-name}.
  16871. There should be no data returned.
  16872. @end table
  16873. @node Error Messaging
  16874. @subsubsection Error Messaging
  16875. @findex nnheader-report
  16876. @findex nnheader-get-report
  16877. The back ends should use the function @code{nnheader-report} to report
  16878. error conditions---they should not raise errors when they aren't able to
  16879. perform a request. The first argument to this function is the back end
  16880. symbol, and the rest are interpreted as arguments to @code{format} if
  16881. there are multiple of them, or just a string if there is one of them.
  16882. This function must always returns @code{nil}.
  16883. @lisp
  16884. (nnheader-report 'nnchoke "You did something totally bogus")
  16885. (nnheader-report 'nnchoke "Could not request group %s" group)
  16886. @end lisp
  16887. Gnus, in turn, will call @code{nnheader-get-report} when it gets a
  16888. @code{nil} back from a server, and this function returns the most
  16889. recently reported message for the back end in question. This function
  16890. takes one argument---the server symbol.
  16891. Internally, these functions access @var{back-end}@code{-status-string},
  16892. so the @code{nnchoke} back end will have its error message stored in
  16893. @code{nnchoke-status-string}.
  16894. @node Writing New Back Ends
  16895. @subsubsection Writing New Back Ends
  16896. Many back ends are quite similar. @code{nnml} is just like
  16897. @code{nnspool}, but it allows you to edit the articles on the server.
  16898. @code{nnmh} is just like @code{nnml}, but it doesn't use an active file,
  16899. and it doesn't maintain overview databases. @code{nndir} is just like
  16900. @code{nnml}, but it has no concept of ``groups'', and it doesn't allow
  16901. editing articles.
  16902. It would make sense if it were possible to ``inherit'' functions from
  16903. back ends when writing new back ends. And, indeed, you can do that if you
  16904. want to. (You don't have to if you don't want to, of course.)
  16905. All the back ends declare their public variables and functions by using a
  16906. package called @code{nnoo}.
  16907. To inherit functions from other back ends (and allow other back ends to
  16908. inherit functions from the current back end), you should use the
  16909. following macros:
  16910. @table @code
  16911. @item nnoo-declare
  16912. This macro declares the first parameter to be a child of the subsequent
  16913. parameters. For instance:
  16914. @lisp
  16915. (nnoo-declare nndir
  16916. nnml nnmh)
  16917. @end lisp
  16918. @code{nndir} has declared here that it intends to inherit functions from
  16919. both @code{nnml} and @code{nnmh}.
  16920. @item defvoo
  16921. This macro is equivalent to @code{defvar}, but registers the variable as
  16922. a public server variable. Most state-oriented variables should be
  16923. declared with @code{defvoo} instead of @code{defvar}.
  16924. In addition to the normal @code{defvar} parameters, it takes a list of
  16925. variables in the parent back ends to map the variable to when executing
  16926. a function in those back ends.
  16927. @lisp
  16928. (defvoo nndir-directory nil
  16929. "Where nndir will look for groups."
  16930. nnml-current-directory nnmh-current-directory)
  16931. @end lisp
  16932. This means that @code{nnml-current-directory} will be set to
  16933. @code{nndir-directory} when an @code{nnml} function is called on behalf
  16934. of @code{nndir}. (The same with @code{nnmh}.)
  16935. @item nnoo-define-basics
  16936. This macro defines some common functions that almost all back ends should
  16937. have.
  16938. @example
  16939. (nnoo-define-basics nndir)
  16940. @end example
  16941. @item deffoo
  16942. This macro is just like @code{defun} and takes the same parameters. In
  16943. addition to doing the normal @code{defun} things, it registers the
  16944. function as being public so that other back ends can inherit it.
  16945. @item nnoo-map-functions
  16946. This macro allows mapping of functions from the current back end to
  16947. functions from the parent back ends.
  16948. @example
  16949. (nnoo-map-functions nndir
  16950. (nnml-retrieve-headers 0 nndir-current-group 0 0)
  16951. (nnmh-request-article 0 nndir-current-group 0 0))
  16952. @end example
  16953. This means that when @code{nndir-retrieve-headers} is called, the first,
  16954. third, and fourth parameters will be passed on to
  16955. @code{nnml-retrieve-headers}, while the second parameter is set to the
  16956. value of @code{nndir-current-group}.
  16957. @item nnoo-import
  16958. This macro allows importing functions from back ends. It should be the
  16959. last thing in the source file, since it will only define functions that
  16960. haven't already been defined.
  16961. @example
  16962. (nnoo-import nndir
  16963. (nnmh
  16964. nnmh-request-list
  16965. nnmh-request-newgroups)
  16966. (nnml))
  16967. @end example
  16968. This means that calls to @code{nndir-request-list} should just be passed
  16969. on to @code{nnmh-request-list}, while all public functions from
  16970. @code{nnml} that haven't been defined in @code{nndir} yet should be
  16971. defined now.
  16972. @end table
  16973. Below is a slightly shortened version of the @code{nndir} back end.
  16974. @lisp
  16975. ;;; nndir.el --- single directory newsgroup access for Gnus
  16976. ;; Copyright (C) 1995,96 Free Software Foundation, Inc.
  16977. ;;; Code:
  16978. (require 'nnheader)
  16979. (require 'nnmh)
  16980. (require 'nnml)
  16981. (require 'nnoo)
  16982. (eval-when-compile (require 'cl))
  16983. (nnoo-declare nndir
  16984. nnml nnmh)
  16985. (defvoo nndir-directory nil
  16986. "Where nndir will look for groups."
  16987. nnml-current-directory nnmh-current-directory)
  16988. (defvoo nndir-nov-is-evil nil
  16989. "*Non-nil means that nndir will never retrieve NOV headers."
  16990. nnml-nov-is-evil)
  16991. (defvoo nndir-current-group ""
  16992. nil
  16993. nnml-current-group nnmh-current-group)
  16994. (defvoo nndir-top-directory nil nil nnml-directory nnmh-directory)
  16995. (defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail)
  16996. (defvoo nndir-status-string "" nil nnmh-status-string)
  16997. (defconst nndir-version "nndir 1.0")
  16998. ;;; Interface functions.
  16999. (nnoo-define-basics nndir)
  17000. (deffoo nndir-open-server (server &optional defs)
  17001. (setq nndir-directory
  17002. (or (cadr (assq 'nndir-directory defs))
  17003. server))
  17004. (unless (assq 'nndir-directory defs)
  17005. (push `(nndir-directory ,server) defs))
  17006. (push `(nndir-current-group
  17007. ,(file-name-nondirectory
  17008. (directory-file-name nndir-directory)))
  17009. defs)
  17010. (push `(nndir-top-directory
  17011. ,(file-name-directory (directory-file-name nndir-directory)))
  17012. defs)
  17013. (nnoo-change-server 'nndir server defs))
  17014. (nnoo-map-functions nndir
  17015. (nnml-retrieve-headers 0 nndir-current-group 0 0)
  17016. (nnmh-request-article 0 nndir-current-group 0 0)
  17017. (nnmh-request-group nndir-current-group 0 0)
  17018. (nnmh-close-group nndir-current-group 0))
  17019. (nnoo-import nndir
  17020. (nnmh
  17021. nnmh-status-message
  17022. nnmh-request-list
  17023. nnmh-request-newgroups))
  17024. (provide 'nndir)
  17025. @end lisp
  17026. @node Hooking New Back Ends Into Gnus
  17027. @subsubsection Hooking New Back Ends Into Gnus
  17028. @vindex gnus-valid-select-methods
  17029. Having Gnus start using your new back end is rather easy---you just
  17030. declare it with the @code{gnus-declare-backend} functions. This will
  17031. enter the back end into the @code{gnus-valid-select-methods} variable.
  17032. @code{gnus-declare-backend} takes two parameters---the back end name and
  17033. an arbitrary number of @dfn{abilities}.
  17034. Here's an example:
  17035. @lisp
  17036. (gnus-declare-backend "nnchoke" 'mail 'respool 'address)
  17037. @end lisp
  17038. The abilities can be:
  17039. @table @code
  17040. @item mail
  17041. This is a mailish back end---followups should (probably) go via mail.
  17042. @item post
  17043. This is a newsish back end---followups should (probably) go via news.
  17044. @item post-mail
  17045. This back end supports both mail and news.
  17046. @item none
  17047. This is neither a post nor mail back end---it's something completely
  17048. different.
  17049. @item respool
  17050. It supports respooling---or rather, it is able to modify its source
  17051. articles and groups.
  17052. @item address
  17053. The name of the server should be in the virtual server name. This is
  17054. true for almost all back ends.
  17055. @item prompt-address
  17056. The user should be prompted for an address when doing commands like
  17057. @kbd{B} in the group buffer. This is true for back ends like
  17058. @code{nntp}, but not @code{nnmbox}, for instance.
  17059. @end table
  17060. @node Mail-like Back Ends
  17061. @subsubsection Mail-like Back Ends
  17062. One of the things that separate the mail back ends from the rest of the
  17063. back ends is the heavy dependence by the mail back ends on common
  17064. functions in @file{nnmail.el}. For instance, here's the definition of
  17065. @code{nnml-request-scan}:
  17066. @lisp
  17067. (deffoo nnml-request-scan (&optional group server)
  17068. (setq nnml-article-file-alist nil)
  17069. (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))
  17070. @end lisp
  17071. It simply calls @code{nnmail-get-new-mail} with a few parameters,
  17072. and @code{nnmail} takes care of all the moving and splitting of the
  17073. mail.
  17074. This function takes four parameters.
  17075. @table @var
  17076. @item method
  17077. This should be a symbol to designate which back end is responsible for
  17078. the call.
  17079. @item exit-function
  17080. This function should be called after the splitting has been performed.
  17081. @item temp-directory
  17082. Where the temporary files should be stored.
  17083. @item group
  17084. This optional argument should be a group name if the splitting is to be
  17085. performed for one group only.
  17086. @end table
  17087. @code{nnmail-get-new-mail} will call @var{back-end}@code{-save-mail} to
  17088. save each article. @var{back-end}@code{-active-number} will be called to
  17089. find the article number assigned to this article.
  17090. The function also uses the following variables:
  17091. @var{back-end}@code{-get-new-mail} (to see whether to get new mail for
  17092. this back end); and @var{back-end}@code{-group-alist} and
  17093. @var{back-end}@code{-active-file} to generate the new active file.
  17094. @var{back-end}@code{-group-alist} should be a group-active alist, like
  17095. this:
  17096. @example
  17097. (("a-group" (1 . 10))
  17098. ("some-group" (34 . 39)))
  17099. @end example
  17100. @node Score File Syntax
  17101. @subsection Score File Syntax
  17102. Score files are meant to be easily parseable, but yet extremely
  17103. mallable. It was decided that something that had the same read syntax
  17104. as an Emacs Lisp list would fit that spec.
  17105. Here's a typical score file:
  17106. @lisp
  17107. (("summary"
  17108. ("win95" -10000 nil s)
  17109. ("Gnus"))
  17110. ("from"
  17111. ("Lars" -1000))
  17112. (mark -100))
  17113. @end lisp
  17114. BNF definition of a score file:
  17115. @example
  17116. score-file = "" / "(" *element ")"
  17117. element = rule / atom
  17118. rule = string-rule / number-rule / date-rule
  17119. string-rule = "(" quote string-header quote space *string-match ")"
  17120. number-rule = "(" quote number-header quote space *number-match ")"
  17121. date-rule = "(" quote date-header quote space *date-match ")"
  17122. quote = <ascii 34>
  17123. string-header = "subject" / "from" / "references" / "message-id" /
  17124. "xref" / "body" / "head" / "all" / "followup"
  17125. number-header = "lines" / "chars"
  17126. date-header = "date"
  17127. string-match = "(" quote <string> quote [ "" / [ space score [ "" /
  17128. space date [ "" / [ space string-match-t ] ] ] ] ] ")"
  17129. score = "nil" / <integer>
  17130. date = "nil" / <natural number>
  17131. string-match-t = "nil" / "s" / "substring" / "S" / "Substring" /
  17132. "r" / "regex" / "R" / "Regex" /
  17133. "e" / "exact" / "E" / "Exact" /
  17134. "f" / "fuzzy" / "F" / "Fuzzy"
  17135. number-match = "(" <integer> [ "" / [ space score [ "" /
  17136. space date [ "" / [ space number-match-t ] ] ] ] ] ")"
  17137. number-match-t = "nil" / "=" / "<" / ">" / ">=" / "<="
  17138. date-match = "(" quote <string> quote [ "" / [ space score [ "" /
  17139. space date [ "" / [ space date-match-t ] ] ] ] ")"
  17140. date-match-t = "nil" / "at" / "before" / "after"
  17141. atom = "(" [ required-atom / optional-atom ] ")"
  17142. required-atom = mark / expunge / mark-and-expunge / files /
  17143. exclude-files / read-only / touched
  17144. optional-atom = adapt / local / eval
  17145. mark = "mark" space nil-or-number
  17146. nil-or-number = "nil" / <integer>
  17147. expunge = "expunge" space nil-or-number
  17148. mark-and-expunge = "mark-and-expunge" space nil-or-number
  17149. files = "files" *[ space <string> ]
  17150. exclude-files = "exclude-files" *[ space <string> ]
  17151. read-only = "read-only" [ space "nil" / space "t" ]
  17152. adapt = "adapt" [ space "ignore" / space "t" / space adapt-rule ]
  17153. adapt-rule = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"
  17154. local = "local" *[ space "(" <string> space <form> ")" ]
  17155. eval = "eval" space <form>
  17156. space = *[ " " / <TAB> / <NEWLINE> ]
  17157. @end example
  17158. Any unrecognized elements in a score file should be ignored, but not
  17159. discarded.
  17160. As you can see, white space is needed, but the type and amount of white
  17161. space is irrelevant. This means that formatting of the score file is
  17162. left up to the programmer---if it's simpler to just spew it all out on
  17163. one looong line, then that's ok.
  17164. The meaning of the various atoms are explained elsewhere in this
  17165. manual (@pxref{Score File Format}).
  17166. @node Headers
  17167. @subsection Headers
  17168. Internally Gnus uses a format for storing article headers that
  17169. corresponds to the @sc{nov} format in a mysterious fashion. One could
  17170. almost suspect that the author looked at the @sc{nov} specification and
  17171. just shamelessly @emph{stole} the entire thing, and one would be right.
  17172. @dfn{Header} is a severely overloaded term. ``Header'' is used in
  17173. RFC 1036 to talk about lines in the head of an article (e.g.,
  17174. @code{From}). It is used by many people as a synonym for
  17175. ``head''---``the header and the body''. (That should be avoided, in my
  17176. opinion.) And Gnus uses a format internally that it calls ``header'',
  17177. which is what I'm talking about here. This is a 9-element vector,
  17178. basically, with each header (ouch) having one slot.
  17179. These slots are, in order: @code{number}, @code{subject}, @code{from},
  17180. @code{date}, @code{id}, @code{references}, @code{chars}, @code{lines},
  17181. @code{xref}, and @code{extra}. There are macros for accessing and
  17182. setting these slots---they all have predictable names beginning with
  17183. @code{mail-header-} and @code{mail-header-set-}, respectively.
  17184. All these slots contain strings, except the @code{extra} slot, which
  17185. contains an alist of header/value pairs (@pxref{To From Newsgroups}).
  17186. @node Ranges
  17187. @subsection Ranges
  17188. @sc{gnus} introduced a concept that I found so useful that I've started
  17189. using it a lot and have elaborated on it greatly.
  17190. The question is simple: If you have a large amount of objects that are
  17191. identified by numbers (say, articles, to take a @emph{wild} example)
  17192. that you want to qualify as being ``included'', a normal sequence isn't
  17193. very useful. (A 200,000 length sequence is a bit long-winded.)
  17194. The solution is as simple as the question: You just collapse the
  17195. sequence.
  17196. @example
  17197. (1 2 3 4 5 6 10 11 12)
  17198. @end example
  17199. is transformed into
  17200. @example
  17201. ((1 . 6) (10 . 12))
  17202. @end example
  17203. To avoid having those nasty @samp{(13 . 13)} elements to denote a
  17204. lonesome object, a @samp{13} is a valid element:
  17205. @example
  17206. ((1 . 6) 7 (10 . 12))
  17207. @end example
  17208. This means that comparing two ranges to find out whether they are equal
  17209. is slightly tricky:
  17210. @example
  17211. ((1 . 5) 7 8 (10 . 12))
  17212. @end example
  17213. and
  17214. @example
  17215. ((1 . 5) (7 . 8) (10 . 12))
  17216. @end example
  17217. are equal. In fact, any non-descending list is a range:
  17218. @example
  17219. (1 2 3 4 5)
  17220. @end example
  17221. is a perfectly valid range, although a pretty long-winded one. This is
  17222. also valid:
  17223. @example
  17224. (1 . 5)
  17225. @end example
  17226. and is equal to the previous range.
  17227. Here's a BNF definition of ranges. Of course, one must remember the
  17228. semantic requirement that the numbers are non-descending. (Any number
  17229. of repetition of the same number is allowed, but apt to disappear in
  17230. range handling.)
  17231. @example
  17232. range = simple-range / normal-range
  17233. simple-range = "(" number " . " number ")"
  17234. normal-range = "(" start-contents ")"
  17235. contents = "" / simple-range *[ " " contents ] /
  17236. number *[ " " contents ]
  17237. @end example
  17238. Gnus currently uses ranges to keep track of read articles and article
  17239. marks. I plan on implementing a number of range operators in C if The
  17240. Powers That Be are willing to let me. (I haven't asked yet, because I
  17241. need to do some more thinking on what operators I need to make life
  17242. totally range-based without ever having to convert back to normal
  17243. sequences.)
  17244. @node Group Info
  17245. @subsection Group Info
  17246. Gnus stores all permanent info on groups in a @dfn{group info} list.
  17247. This list is from three to six elements (or more) long and exhaustively
  17248. describes the group.
  17249. Here are two example group infos; one is a very simple group while the
  17250. second is a more complex one:
  17251. @example
  17252. ("no.group" 5 ((1 . 54324)))
  17253. ("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
  17254. ((tick (15 . 19)) (replied 3 6 (19 . 3)))
  17255. (nnml "")
  17256. ((auto-expire . t) (to-address . "ding@@gnus.org")))
  17257. @end example
  17258. The first element is the @dfn{group name}---as Gnus knows the group,
  17259. anyway. The second element is the @dfn{subscription level}, which
  17260. normally is a small integer. (It can also be the @dfn{rank}, which is a
  17261. cons cell where the @code{car} is the level and the @code{cdr} is the
  17262. score.) The third element is a list of ranges of read articles. The
  17263. fourth element is a list of lists of article marks of various kinds.
  17264. The fifth element is the select method (or virtual server, if you like).
  17265. The sixth element is a list of @dfn{group parameters}, which is what
  17266. this section is about.
  17267. Any of the last three elements may be missing if they are not required.
  17268. In fact, the vast majority of groups will normally only have the first
  17269. three elements, which saves quite a lot of cons cells.
  17270. Here's a BNF definition of the group info format:
  17271. @example
  17272. info = "(" group space ralevel space read
  17273. [ "" / [ space marks-list [ "" / [ space method [ "" /
  17274. space parameters ] ] ] ] ] ")"
  17275. group = quote <string> quote
  17276. ralevel = rank / level
  17277. level = <integer in the range of 1 to inf>
  17278. rank = "(" level "." score ")"
  17279. score = <integer in the range of 1 to inf>
  17280. read = range
  17281. marks-lists = nil / "(" *marks ")"
  17282. marks = "(" <string> range ")"
  17283. method = "(" <string> *elisp-forms ")"
  17284. parameters = "(" *elisp-forms ")"
  17285. @end example
  17286. Actually that @samp{marks} rule is a fib. A @samp{marks} is a
  17287. @samp{<string>} consed on to a @samp{range}, but that's a bitch to say
  17288. in pseudo-BNF.
  17289. If you have a Gnus info and want to access the elements, Gnus offers a
  17290. series of macros for getting/setting these elements.
  17291. @table @code
  17292. @item gnus-info-group
  17293. @itemx gnus-info-set-group
  17294. @findex gnus-info-group
  17295. @findex gnus-info-set-group
  17296. Get/set the group name.
  17297. @item gnus-info-rank
  17298. @itemx gnus-info-set-rank
  17299. @findex gnus-info-rank
  17300. @findex gnus-info-set-rank
  17301. Get/set the group rank (@pxref{Group Score}).
  17302. @item gnus-info-level
  17303. @itemx gnus-info-set-level
  17304. @findex gnus-info-level
  17305. @findex gnus-info-set-level
  17306. Get/set the group level.
  17307. @item gnus-info-score
  17308. @itemx gnus-info-set-score
  17309. @findex gnus-info-score
  17310. @findex gnus-info-set-score
  17311. Get/set the group score (@pxref{Group Score}).
  17312. @item gnus-info-read
  17313. @itemx gnus-info-set-read
  17314. @findex gnus-info-read
  17315. @findex gnus-info-set-read
  17316. Get/set the ranges of read articles.
  17317. @item gnus-info-marks
  17318. @itemx gnus-info-set-marks
  17319. @findex gnus-info-marks
  17320. @findex gnus-info-set-marks
  17321. Get/set the lists of ranges of marked articles.
  17322. @item gnus-info-method
  17323. @itemx gnus-info-set-method
  17324. @findex gnus-info-method
  17325. @findex gnus-info-set-method
  17326. Get/set the group select method.
  17327. @item gnus-info-params
  17328. @itemx gnus-info-set-params
  17329. @findex gnus-info-params
  17330. @findex gnus-info-set-params
  17331. Get/set the group parameters.
  17332. @end table
  17333. All the getter functions take one parameter---the info list. The setter
  17334. functions take two parameters---the info list and the new value.
  17335. The last three elements in the group info aren't mandatory, so it may be
  17336. necessary to extend the group info before setting the element. If this
  17337. is necessary, you can just pass on a non-@code{nil} third parameter to
  17338. the three final setter functions to have this happen automatically.
  17339. @node Extended Interactive
  17340. @subsection Extended Interactive
  17341. @cindex interactive
  17342. @findex gnus-interactive
  17343. Gnus extends the standard Emacs @code{interactive} specification
  17344. slightly to allow easy use of the symbolic prefix (@pxref{Symbolic
  17345. Prefixes}). Here's an example of how this is used:
  17346. @lisp
  17347. (defun gnus-summary-increase-score (&optional score symp)
  17348. (interactive (gnus-interactive "P\ny"))
  17349. ...
  17350. )
  17351. @end lisp
  17352. The best thing to do would have been to implement
  17353. @code{gnus-interactive} as a macro which would have returned an
  17354. @code{interactive} form, but this isn't possible since Emacs checks
  17355. whether a function is interactive or not by simply doing an @code{assq}
  17356. on the lambda form. So, instead we have @code{gnus-interactive}
  17357. function that takes a string and returns values that are usable to
  17358. @code{interactive}.
  17359. This function accepts (almost) all normal @code{interactive} specs, but
  17360. adds a few more.
  17361. @table @samp
  17362. @item y
  17363. @vindex gnus-current-prefix-symbol
  17364. The current symbolic prefix---the @code{gnus-current-prefix-symbol}
  17365. variable.
  17366. @item Y
  17367. @vindex gnus-current-prefix-symbols
  17368. A list of the current symbolic prefixes---the
  17369. @code{gnus-current-prefix-symbol} variable.
  17370. @item A
  17371. The current article number---the @code{gnus-summary-article-number}
  17372. function.
  17373. @item H
  17374. The current article header---the @code{gnus-summary-article-header}
  17375. function.
  17376. @item g
  17377. The current group name---the @code{gnus-group-group-name}
  17378. function.
  17379. @end table
  17380. @node Emacs/XEmacs Code
  17381. @subsection Emacs/XEmacs Code
  17382. @cindex XEmacs
  17383. @cindex Emacsen
  17384. While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the
  17385. platforms must be the primary one. I chose Emacs. Not because I don't
  17386. like XEmacs or Mule, but because it comes first alphabetically.
  17387. This means that Gnus will byte-compile under Emacs with nary a warning,
  17388. while XEmacs will pump out gigabytes of warnings while byte-compiling.
  17389. As I use byte-compilation warnings to help me root out trivial errors in
  17390. Gnus, that's very useful.
  17391. I've also consistently used Emacs function interfaces, but have used
  17392. Gnusey aliases for the functions. To take an example: Emacs defines a
  17393. @code{run-at-time} function while XEmacs defines a @code{start-itimer}
  17394. function. I then define a function called @code{gnus-run-at-time} that
  17395. takes the same parameters as the Emacs @code{run-at-time}. When running
  17396. Gnus under Emacs, the former function is just an alias for the latter.
  17397. However, when running under XEmacs, the former is an alias for the
  17398. following function:
  17399. @lisp
  17400. (defun gnus-xmas-run-at-time (time repeat function &rest args)
  17401. (start-itimer
  17402. "gnus-run-at-time"
  17403. `(lambda ()
  17404. (,function ,@@args))
  17405. time repeat))
  17406. @end lisp
  17407. This sort of thing has been done for bunches of functions. Gnus does
  17408. not redefine any native Emacs functions while running under XEmacs---it
  17409. does this @code{defalias} thing with Gnus equivalents instead. Cleaner
  17410. all over.
  17411. In the cases where the XEmacs function interface was obviously cleaner,
  17412. I used it instead. For example @code{gnus-region-active-p} is an alias
  17413. for @code{region-active-p} in XEmacs, whereas in Emacs it is a function.
  17414. Of course, I could have chosen XEmacs as my native platform and done
  17415. mapping functions the other way around. But I didn't. The performance
  17416. hit these indirections impose on Gnus under XEmacs should be slight.
  17417. @node Various File Formats
  17418. @subsection Various File Formats
  17419. @menu
  17420. * Active File Format:: Information on articles and groups available.
  17421. * Newsgroups File Format:: Group descriptions.
  17422. @end menu
  17423. @node Active File Format
  17424. @subsubsection Active File Format
  17425. The active file lists all groups available on the server in
  17426. question. It also lists the highest and lowest current article numbers
  17427. in each group.
  17428. Here's an excerpt from a typical active file:
  17429. @example
  17430. soc.motss 296030 293865 y
  17431. alt.binaries.pictures.fractals 3922 3913 n
  17432. comp.sources.unix 1605 1593 m
  17433. comp.binaries.ibm.pc 5097 5089 y
  17434. no.general 1000 900 y
  17435. @end example
  17436. Here's a pseudo-BNF definition of this file:
  17437. @example
  17438. active = *group-line
  17439. group-line = group spc high-number spc low-number spc flag <NEWLINE>
  17440. group = <non-white-space string>
  17441. spc = " "
  17442. high-number = <non-negative integer>
  17443. low-number = <positive integer>
  17444. flag = "y" / "n" / "m" / "j" / "x" / "=" group
  17445. @end example
  17446. For a full description of this file, see the manual pages for
  17447. @samp{innd}, in particular @samp{active(5)}.
  17448. @node Newsgroups File Format
  17449. @subsubsection Newsgroups File Format
  17450. The newsgroups file lists groups along with their descriptions. Not all
  17451. groups on the server have to be listed, and not all groups in the file
  17452. have to exist on the server. The file is meant purely as information to
  17453. the user.
  17454. The format is quite simple; a group name, a tab, and the description.
  17455. Here's the definition:
  17456. @example
  17457. newsgroups = *line
  17458. line = group tab description <NEWLINE>
  17459. group = <non-white-space string>
  17460. tab = <TAB>
  17461. description = <string>
  17462. @end example
  17463. @page
  17464. @node Emacs for Heathens
  17465. @section Emacs for Heathens
  17466. Believe it or not, but some people who use Gnus haven't really used
  17467. Emacs much before they embarked on their journey on the Gnus Love Boat.
  17468. If you are one of those unfortunates whom ``@kbd{C-M-a}'', ``kill the
  17469. region'', and ``set @code{gnus-flargblossen} to an alist where the key
  17470. is a regexp that is used for matching on the group name'' are magical
  17471. phrases with little or no meaning, then this appendix is for you. If
  17472. you are already familiar with Emacs, just ignore this and go fondle your
  17473. cat instead.
  17474. @menu
  17475. * Keystrokes:: Entering text and executing commands.
  17476. * Emacs Lisp:: The built-in Emacs programming language.
  17477. @end menu
  17478. @node Keystrokes
  17479. @subsection Keystrokes
  17480. @itemize @bullet
  17481. @item
  17482. Q: What is an experienced Emacs user?
  17483. @item
  17484. A: A person who wishes that the terminal had pedals.
  17485. @end itemize
  17486. Yes, when you use Emacs, you are apt to use the control key, the shift
  17487. key and the meta key a lot. This is very annoying to some people
  17488. (notably @code{vi}le users), and the rest of us just love the hell out
  17489. of it. Just give up and submit. Emacs really does stand for
  17490. ``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you
  17491. may have heard from other disreputable sources (like the Emacs author).
  17492. The shift keys are normally located near your pinky fingers, and are
  17493. normally used to get capital letters and stuff. You probably use it all
  17494. the time. The control key is normally marked ``CTRL'' or something like
  17495. that. The meta key is, funnily enough, never marked as such on any
  17496. keyboard. The one I'm currently at has a key that's marked ``Alt'',
  17497. which is the meta key on this keyboard. It's usually located somewhere
  17498. to the left hand side of the keyboard, usually on the bottom row.
  17499. Now, us Emacs people don't say ``press the meta-control-m key'',
  17500. because that's just too inconvenient. We say ``press the @kbd{C-M-m}
  17501. key''. @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the
  17502. prefix that means ``control''. So ``press @kbd{C-k}'' means ``press
  17503. down the control key, and hold it down while you press @kbd{k}''.
  17504. ``Press @kbd{C-M-k}'' means ``press down and hold down the meta key and
  17505. the control key and then press @kbd{k}''. Simple, ay?
  17506. This is somewhat complicated by the fact that not all keyboards have a
  17507. meta key. In that case you can use the ``escape'' key. Then @kbd{M-k}
  17508. means ``press escape, release escape, press @kbd{k}''. That's much more
  17509. work than if you have a meta key, so if that's the case, I respectfully
  17510. suggest you get a real keyboard with a meta key. You can't live without
  17511. it.
  17512. @node Emacs Lisp
  17513. @subsection Emacs Lisp
  17514. Emacs is the King of Editors because it's really a Lisp interpreter.
  17515. Each and every key you tap runs some Emacs Lisp code snippet, and since
  17516. Emacs Lisp is an interpreted language, that means that you can configure
  17517. any key to run any arbitrary code. You just, like, do it.
  17518. Gnus is written in Emacs Lisp, and is run as a bunch of interpreted
  17519. functions. (These are byte-compiled for speed, but it's still
  17520. interpreted.) If you decide that you don't like the way Gnus does
  17521. certain things, it's trivial to have it do something a different way.
  17522. (Well, at least if you know how to write Lisp code.) However, that's
  17523. beyond the scope of this manual, so we are simply going to talk about
  17524. some common constructs that you normally use in your @file{.emacs} file
  17525. to customize Gnus.
  17526. If you want to set the variable @code{gnus-florgbnize} to four (4), you
  17527. write the following:
  17528. @lisp
  17529. (setq gnus-florgbnize 4)
  17530. @end lisp
  17531. This function (really ``special form'') @code{setq} is the one that can
  17532. set a variable to some value. This is really all you need to know. Now
  17533. you can go and fill your @code{.emacs} file with lots of these to change
  17534. how Gnus works.
  17535. If you have put that thing in your @code{.emacs} file, it will be read
  17536. and @code{eval}ed (which is lisp-ese for ``run'') the next time you
  17537. start Emacs. If you want to change the variable right away, simply say
  17538. @kbd{C-x C-e} after the closing parenthesis. That will @code{eval} the
  17539. previous ``form'', which is a simple @code{setq} statement here.
  17540. Go ahead---just try it, if you're located at your Emacs. After you
  17541. @kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which
  17542. is the return value of the form you @code{eval}ed.
  17543. Some pitfalls:
  17544. If the manual says ``set @code{gnus-read-active-file} to @code{some}'',
  17545. that means:
  17546. @lisp
  17547. (setq gnus-read-active-file 'some)
  17548. @end lisp
  17549. On the other hand, if the manual says ``set @code{gnus-nntp-server} to
  17550. @samp{nntp.ifi.uio.no}'', that means:
  17551. @lisp
  17552. (setq gnus-nntp-server "nntp.ifi.uio.no")
  17553. @end lisp
  17554. So be careful not to mix up strings (the latter) with symbols (the
  17555. former). The manual is unambiguous, but it can be confusing.
  17556. @page
  17557. @include gnus-faq.texi
  17558. @node Index
  17559. @chapter Index
  17560. @printindex cp
  17561. @node Key Index
  17562. @chapter Key Index
  17563. @printindex ky
  17564. @summarycontents
  17565. @contents
  17566. @bye
  17567. @iftex
  17568. @iflatex
  17569. \end{document}
  17570. @end iflatex
  17571. @end iftex
  17572. @c End: