1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232 |
- \input texinfo @c -*-texinfo-*- -*- coding: iso-latin-1 -*-
- @setfilename ../info/gnus
- @settitle Gnus Manual
- @synindex fn cp
- @synindex vr cp
- @synindex pg cp
- @dircategory Emacs
- @direntry
- * Gnus: (gnus). The newsreader Gnus.
- @end direntry
- @iftex
- @finalout
- @end iftex
- @setchapternewpage odd
- @iftex
- @iflatex
- \documentclass[twoside,a4paper,openright,11pt]{book}
- \usepackage[latin1]{inputenc}
- \usepackage{pagestyle}
- \usepackage{epsfig}
- \usepackage{bembo}
- \usepackage{pixidx}
- \makeindex
- \begin{document}
- \newcommand{\gnuschaptername}{}
- \newcommand{\gnussectionname}{}
- \newcommand{\gnusbackslash}{/}
- \newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
- \newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
- \newcommand{\gnuskindex}[1]{\index{#1}}
- \newcommand{\gnusindex}[1]{\index{#1}}
- \newcommand{\gnustt}[1]{{\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}}
- \newcommand{\gnuscode}[1]{\gnustt{#1}}
- \newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}''}
- \newcommand{\gnuslisp}[1]{\gnustt{#1}}
- \newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
- \newcommand{\gnusfile}[1]{`\gnustt{#1}'}
- \newcommand{\gnusdfn}[1]{\textit{#1}}
- \newcommand{\gnusi}[1]{\textit{#1}}
- \newcommand{\gnusstrong}[1]{\textbf{#1}}
- \newcommand{\gnusemph}[1]{\textit{#1}}
- \newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}}
- \newcommand{\gnussc}[1]{\textsc{#1}}
- \newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
- \newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
- \newcommand{\gnusresult}[1]{\gnustt{=> #1}}
- \newcommand{\gnusbullet}{{${\bullet}$}}
- \newcommand{\gnusdollar}{\$}
- \newcommand{\gnusampersand}{\&}
- \newcommand{\gnuspercent}{\%}
- \newcommand{\gnushash}{\#}
- \newcommand{\gnushat}{\symbol{"5E}}
- \newcommand{\gnusunderline}{\symbol{"5F}}
- \newcommand{\gnusnot}{$\neg$}
- \newcommand{\gnustilde}{\symbol{"7E}}
- \newcommand{\gnusless}{{$<$}}
- \newcommand{\gnusgreater}{{$>$}}
- \newcommand{\gnusbraceleft}{{$>$}}
- \newcommand{\gnusbraceright}{{$>$}}
- \newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head.eps,height=1cm}}}
- \newcommand{\gnusinteresting}{
- \marginpar[\mbox{}\hfill\gnushead]{\gnushead}
- }
- \newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
- \newcommand{\gnuspagechapter}[1]{
- {\mbox{}}
- }
- \newdimen{\gnusdimen}
- \gnusdimen 0pt
- \newcommand{\gnuschapter}[2]{
- \gnuscleardoublepage
- \ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi
- \chapter{#2}
- \renewcommand{\gnussectionname}{}
- \renewcommand{\gnuschaptername}{#2}
- \thispagestyle{empty}
- \hspace*{-2cm}
- \begin{picture}(500,500)(0,0)
- \put(480,350){\makebox(0,0)[tr]{#1}}
- \put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}
- \end{picture}
- \clearpage
- }
- \newcommand{\gnusfigure}[3]{
- \begin{figure}
- \mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2)
- #3
- \end{picture}
- \caption{#1}
- \end{figure}
- }
- \newcommand{\gnusicon}[1]{
- \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}}}
- }
- \newcommand{\gnuspicon}[1]{
- \margindex{\epsfig{figure=#1,width=2cm}}
- }
- \newcommand{\gnusxface}[2]{
- \margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}}
- }
- \newcommand{\gnussmiley}[2]{
- \margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}}
- }
- \newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}
- \newcommand{\gnussection}[1]{
- \renewcommand{\gnussectionname}{#1}
- \section{#1}
- }
- \newenvironment{codelist}%
- {\begin{list}{}{
- }
- }{\end{list}}
- \newenvironment{kbdlist}%
- {\begin{list}{}{
- \labelwidth=0cm
- }
- }{\end{list}}
- \newenvironment{dfnlist}%
- {\begin{list}{}{
- }
- }{\end{list}}
- \newenvironment{stronglist}%
- {\begin{list}{}{
- }
- }{\end{list}}
- \newenvironment{samplist}%
- {\begin{list}{}{
- }
- }{\end{list}}
- \newenvironment{varlist}%
- {\begin{list}{}{
- }
- }{\end{list}}
- \newenvironment{emphlist}%
- {\begin{list}{}{
- }
- }{\end{list}}
- \newlength\gnusheadtextwidth
- \setlength{\gnusheadtextwidth}{\headtextwidth}
- \addtolength{\gnusheadtextwidth}{1cm}
- \newpagestyle{gnuspreamble}%
- {
- {
- \ifodd\count0
- {
- \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}
- }
- \else
- {
- \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}
- }
- }
- \fi
- }
- }
- {
- \ifodd\count0
- \mbox{} \hfill
- \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
- \else
- \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
- \hfill \mbox{}
- \fi
- }
- \newpagestyle{gnusindex}%
- {
- {
- \ifodd\count0
- {
- \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}
- }
- \else
- {
- \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
- }
- \fi
- }
- }
- {
- \ifodd\count0
- \mbox{} \hfill
- \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
- \else
- \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
- \hfill \mbox{}
- \fi
- }
- \newpagestyle{gnus}%
- {
- {
- \ifodd\count0
- {
- \makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}}
- }
- \else
- {
- \makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}
- }
- \fi
- }
- }
- {
- \ifodd\count0
- \mbox{} \hfill
- \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
- \else
- \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}}
- \hfill \mbox{}
- \fi
- }
- \pagenumbering{roman}
- \pagestyle{gnuspreamble}
- @end iflatex
- @end iftex
- @iftex
- @iflatex
- \begin{titlepage}
- {
- %\addtolength{\oddsidemargin}{-5cm}
- %\addtolength{\evensidemargin}{-5cm}
- \parindent=0cm
- \addtolength{\textheight}{2cm}
- \gnustitle{\gnustitlename}\\
- \rule{15cm}{1mm}\\
- \vfill
- \hspace*{0cm}\epsfig{figure=ps/gnus-big-logo.eps,height=15cm}
- \vfill
- \rule{15cm}{1mm}\\
- \gnusauthor{by Lars Magne Ingebrigtsen}
- \newpage
- }
- \mbox{}
- \vfill
- \thispagestyle{empty}
- Copyright \copyright{} 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1 or
- any later version published by the Free Software Foundation; with no
- Invariant Sections, with the Front-Cover texts being ``A GNU
- Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
- license is included in the section entitled ``GNU Free Documentation
- License'' in the Emacs manual.
- (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
- this GNU Manual, like GNU software. Copies published by the Free
- Software Foundation raise funds for GNU development.''
- This document is part of a collection distributed under the GNU Free
- Documentation License. If you want to distribute this document
- separately from the collection, you can do so by adding a copy of the
- license to the document, as described in section 6 of the license.
- \newpage
- \end{titlepage}
- @end iflatex
- @end iftex
- @ifnottex
- This file documents Gnus, the GNU Emacs newsreader.
- Copyright (C) 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1 or
- any later version published by the Free Software Foundation; with the
- Invariant Sections being none, with the Front-Cover texts being ``A GNU
- Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
- license is included in the section entitled ``GNU Free Documentation
- License'' in the Emacs manual.
- (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
- this GNU Manual, like GNU software. Copies published by the Free
- Software Foundation raise funds for GNU development.''
- This document is part of a collection distributed under the GNU Free
- Documentation License. If you want to distribute this document
- separately from the collection, you can do so by adding a copy of the
- license to the document, as described in section 6 of the license.
- @end ifnottex
- @tex
- @titlepage
- @title Gnus Manual
- @author by Lars Magne Ingebrigtsen
- @page
- @vskip 0pt plus 1filll
- Copyright @copyright{} 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1 or
- any later version published by the Free Software Foundation; with no
- Invariant Sections, with the Front-Cover texts being ``A GNU
- Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
- license is included in the section entitled ``GNU Free Documentation
- License'' in the Emacs manual.
- (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
- this GNU Manual, like GNU software. Copies published by the Free
- Software Foundation raise funds for GNU development.''
- This document is part of a collection distributed under the GNU Free
- Documentation License. If you want to distribute this document
- separately from the collection, you can do so by adding a copy of the
- license to the document, as described in section 6 of the license.
- @end titlepage
- @page
- @end tex
- @node Top
- @top The Gnus Newsreader
- @ifinfo
- You can read news (and mail) from within Emacs by using Gnus. The news
- can be gotten by any nefarious means you can think of---@sc{nntp}, local
- spool or your mbox file. All at the same time, if you want to push your
- luck.
- This manual corresponds to Gnus 5.9.0.
- @end ifinfo
- @iftex
- @iflatex
- \tableofcontents
- \gnuscleardoublepage
- @end iflatex
- Gnus is the advanced, self-documenting, customizable, extensible
- unreal-time newsreader for GNU Emacs.
- Oops. That sounds oddly familiar, so let's start over again to avoid
- being accused of plagiarism:
- Gnus is a message-reading laboratory. It will let you look at just
- about anything as if it were a newsgroup. You can read mail with it,
- you can browse directories with it, you can @code{ftp} with it---you
- can even read news with it!
- Gnus tries to empower people who read news the same way Emacs empowers
- people who edit text. Gnus sets no limits to what the user should be
- allowed to do. Users are encouraged to extend Gnus to make it behave
- like they want it to behave. A program should not control people;
- people should be empowered to do what they want by using (or abusing)
- the program.
- @end iftex
- @menu
- * Starting Up:: Finding news can be a pain.
- * The Group Buffer:: Selecting, subscribing and killing groups.
- * The Summary Buffer:: Reading, saving and posting articles.
- * The Article Buffer:: Displaying and handling articles.
- * Composing Messages:: Information on sending mail and news.
- * Select Methods:: Gnus reads all messages from various select methods.
- * Scoring:: Assigning values to articles.
- * Various:: General purpose settings.
- * The End:: Farewell and goodbye.
- * Appendices:: Terminology, Emacs intro, FAQ, History, Internals.
- * Index:: Variable, function and concept index.
- * Key Index:: Key Index.
- @detailmenu
- --- The Detailed Node Listing ---
- Starting Gnus
- * Finding the News:: Choosing a method for getting news.
- * The First Time:: What does Gnus do the first time you start it?
- * The Server is Down:: How can I read my mail then?
- * Slave Gnusae:: You can have more than one Gnus active at a time.
- * Fetching a Group:: Starting Gnus just to read a group.
- * New Groups:: What is Gnus supposed to do with new groups?
- * Startup Files:: Those pesky startup files---@file{.newsrc}.
- * Auto Save:: Recovering from a crash.
- * The Active File:: Reading the active file over a slow line Takes Time.
- * Changing Servers:: You may want to move from one server to another.
- * Startup Variables:: Other variables you might change.
- New Groups
- * Checking New Groups:: Determining what groups are new.
- * Subscription Methods:: What Gnus should do with new groups.
- * Filtering New Groups:: Making Gnus ignore certain new groups.
- The Group Buffer
- * Group Buffer Format:: Information listed and how you can change it.
- * Group Maneuvering:: Commands for moving in the group buffer.
- * Selecting a Group:: Actually reading news.
- * Group Data:: Changing the info for a group.
- * Subscription Commands:: Unsubscribing, killing, subscribing.
- * Group Levels:: Levels? What are those, then?
- * Group Score:: A mechanism for finding out what groups you like.
- * Marking Groups:: You can mark groups for later processing.
- * Foreign Groups:: Creating and editing groups.
- * Group Parameters:: Each group may have different parameters set.
- * Listing Groups:: Gnus can list various subsets of the groups.
- * Sorting Groups:: Re-arrange the group order.
- * Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
- * Browse Foreign Server:: You can browse a server. See what it has to offer.
- * Exiting Gnus:: Stop reading news and get some work done.
- * Group Topics:: A folding group mode divided into topics.
- * Misc Group Stuff:: Other stuff that you can to do.
- Group Buffer Format
- * Group Line Specification:: Deciding how the group buffer is to look.
- * Group Modeline Specification:: The group buffer modeline.
- * Group Highlighting:: Having nice colors in the group buffer.
- Group Topics
- * Topic Variables:: How to customize the topics the Lisp Way.
- * Topic Commands:: Interactive E-Z commands.
- * Topic Sorting:: Sorting each topic individually.
- * Topic Topology:: A map of the world.
- * Topic Parameters:: Parameters that apply to all groups in a topic.
- Misc Group Stuff
- * Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
- * Group Information:: Information and help on groups and Gnus.
- * Group Timestamp:: Making Gnus keep track of when you last read a group.
- * File Commands:: Reading and writing the Gnus files.
- The Summary Buffer
- * Summary Buffer Format:: Deciding how the summary buffer is to look.
- * Summary Maneuvering:: Moving around the summary buffer.
- * Choosing Articles:: Reading articles.
- * Paging the Article:: Scrolling the current article.
- * Reply Followup and Post:: Posting articles.
- * Marking Articles:: Marking articles as read, expirable, etc.
- * Limiting:: You can limit the summary buffer.
- * Threading:: How threads are made.
- * Sorting:: How articles and threads are sorted.
- * Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
- * Article Caching:: You may store articles in a cache.
- * Persistent Articles:: Making articles expiry-resistant.
- * Article Backlog:: Having already read articles hang around.
- * Saving Articles:: Ways of customizing article saving.
- * Decoding Articles:: Gnus can treat series of (uu)encoded articles.
- * Article Treatment:: The article buffer can be mangled at will.
- * MIME Commands:: Doing MIMEy things with the articles.
- * Charsets:: Character set issues.
- * Article Commands:: Doing various things with the article buffer.
- * Summary Sorting:: Sorting the summary buffer in various ways.
- * Finding the Parent:: No child support? Get the parent.
- * Alternative Approaches:: Reading using non-default summaries.
- * Tree Display:: A more visual display of threads.
- * Mail Group Commands:: Some commands can only be used in mail groups.
- * Various Summary Stuff:: What didn't fit anywhere else.
- * Exiting the Summary Buffer:: Returning to the Group buffer.
- * Crosspost Handling:: How crossposted articles are dealt with.
- * Duplicate Suppression:: An alternative when crosspost handling fails.
- Summary Buffer Format
- * Summary Buffer Lines:: You can specify how summary lines should look.
- * To From Newsgroups:: How to not display your own name.
- * Summary Buffer Mode Line:: You can say how the mode line should look.
- * Summary Highlighting:: Making the summary buffer all pretty and nice.
- Choosing Articles
- * Choosing Commands:: Commands for choosing articles.
- * Choosing Variables:: Variables that influence these commands.
- Reply, Followup and Post
- * Summary Mail Commands:: Sending mail.
- * Summary Post Commands:: Sending news.
- * Summary Message Commands:: Other Message-related commands.
- * Canceling and Superseding:: ``Whoops, I shouldn't have called him that.''
- Marking Articles
- * Unread Articles:: Marks for unread articles.
- * Read Articles:: Marks for read articles.
- * Other Marks:: Marks that do not affect readedness.
- * Setting Marks:: How to set and remove marks.
- * Generic Marking Commands:: How to customize the marking.
- * Setting Process Marks:: How to mark articles for later processing.
- Threading
- * Customizing Threading:: Variables you can change to affect the threading.
- * Thread Commands:: Thread based commands in the summary buffer.
- Customizing Threading
- * Loose Threads:: How Gnus gathers loose threads into bigger threads.
- * Filling In Threads:: Making the threads displayed look fuller.
- * More Threading:: Even more variables for fiddling with threads.
- * Low-Level Threading:: You thought it was over... but you were wrong!
- Decoding Articles
- * Uuencoded Articles:: Uudecode articles.
- * Shell Archives:: Unshar articles.
- * PostScript Files:: Split PostScript.
- * Other Files:: Plain save and binhex.
- * Decoding Variables:: Variables for a happy decoding.
- * Viewing Files:: You want to look at the result of the decoding?
- Decoding Variables
- * Rule Variables:: Variables that say how a file is to be viewed.
- * Other Decode Variables:: Other decode variables.
- * Uuencoding and Posting:: Variables for customizing uuencoding.
- Article Treatment
- * Article Highlighting:: You want to make the article look like fruit salad.
- * Article Fontisizing:: Making emphasized text look nice.
- * Article Hiding:: You also want to make certain info go away.
- * Article Washing:: Lots of way-neat functions to make life better.
- * Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
- * Article Date:: Grumble, UT!
- * Article Signature:: What is a signature?
- * Article Miscellania:: Various other stuff.
- Alternative Approaches
- * Pick and Read:: First mark articles and then read them.
- * Binary Groups:: Auto-decode all articles.
- Various Summary Stuff
- * Summary Group Information:: Information oriented commands.
- * Searching for Articles:: Multiple article commands.
- * Summary Generation Commands:: (Re)generating the summary buffer.
- * Really Various Summary Commands:: Those pesky non-conformant commands.
- The Article Buffer
- * Hiding Headers:: Deciding what headers should be displayed.
- * Using MIME:: Pushing articles through @sc{mime} before reading them.
- * Customizing Articles:: Tailoring the look of the articles.
- * Article Keymap:: Keystrokes available in the article buffer.
- * Misc Article:: Other stuff.
- Composing Messages
- * Mail:: Mailing and replying.
- * Posting Server:: What server should you post via?
- * Mail and Post:: Mailing and posting at the same time.
- * Archived Messages:: Where Gnus stores the messages you've sent.
- * Posting Styles:: An easier way to specify who you are.
- * Drafts:: Postponing messages and rejected messages.
- * Rejected Articles:: What happens if the server doesn't like your article?
- Select Methods
- * The Server Buffer:: Making and editing virtual servers.
- * Getting News:: Reading USENET news with Gnus.
- * Getting Mail:: Reading your personal mail with Gnus.
- * Browsing the Web:: Getting messages from a plethora of Web sources.
- * Other Sources:: Reading directories, files, SOUP packets.
- * Combined Groups:: Combining groups into one group.
- * Gnus Unplugged:: Reading news and mail offline.
- The Server Buffer
- * Server Buffer Format:: You can customize the look of this buffer.
- * Server Commands:: Commands to manipulate servers.
- * Example Methods:: Examples server specifications.
- * Creating a Virtual Server:: An example session.
- * Server Variables:: Which variables to set.
- * Servers and Methods:: You can use server names as select methods.
- * Unavailable Servers:: Some servers you try to contact may be down.
- Getting News
- * NNTP:: Reading news from an @sc{nntp} server.
- * News Spool:: Reading news from the local spool.
- Getting Mail
- * Mail in a Newsreader:: Important introductory notes.
- * Getting Started Reading Mail:: A simple cookbook example.
- * Splitting Mail:: How to create mail groups.
- * Mail Sources:: How to tell Gnus where to get mail from.
- * Mail Back End Variables:: Variables for customizing mail handling.
- * Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
- * Group Mail Splitting:: Use group customize to drive mail splitting.
- * Incorporating Old Mail:: What about the old mail you have?
- * Expiring Mail:: Getting rid of unwanted mail.
- * Washing Mail:: Removing cruft from the mail you get.
- * Duplicates:: Dealing with duplicated mail.
- * Not Reading Mail:: Using mail back ends for reading other files.
- * Choosing a Mail Back End:: Gnus can read a variety of mail formats.
- Mail Sources
- * Mail Source Specifiers:: How to specify what a mail source is.
- * Mail Source Customization:: Some variables that influence things.
- * Fetching Mail:: Using the mail source specifiers.
- Choosing a Mail Back End
- * Unix Mail Box:: Using the (quite) standard Un*x mbox.
- * Rmail Babyl:: Emacs programs use the rmail babyl format.
- * Mail Spool:: Store your mail in a private spool?
- * MH Spool:: An mhspool-like back end.
- * Mail Folders:: Having one file for each group.
- * Comparing Mail Back Ends:: An in-depth looks at pros and cons.
- Browsing the Web
- * Web Searches:: Creating groups from articles that match a string.
- * Slashdot:: Reading the Slashdot comments.
- * Ultimate:: The Ultimate Bulletin Board systems.
- * Web Archive:: Reading mailing list archived on web.
- Other Sources
- * Directory Groups:: You can read a directory as if it was a newsgroup.
- * Anything Groups:: Dired? Who needs dired?
- * Document Groups:: Single files can be the basis of a group.
- * SOUP:: Reading @sc{soup} packets ``offline''.
- * Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
- * IMAP:: Using Gnus as a @sc{imap} client.
- Document Groups
- * Document Server Internals:: How to add your own document types.
- SOUP
- * SOUP Commands:: Commands for creating and sending @sc{soup} packets
- * SOUP Groups:: A back end for reading @sc{soup} packets.
- * SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.
- @sc{imap}
- * Splitting in IMAP:: Splitting mail with nnimap.
- * Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.
- * Expunging mailboxes:: Equivalent of a "compress mailbox" button.
- Combined Groups
- * Virtual Groups:: Combining articles from many groups.
- * Kibozed Groups:: Looking through parts of the newsfeed for articles.
- Gnus Unplugged
- * Agent Basics:: How it all is supposed to work.
- * Agent Categories:: How to tell the Gnus Agent what to download.
- * Agent Commands:: New commands for all the buffers.
- * Agent Expiry:: How to make old articles go away.
- * Agent and IMAP:: How to use the Agent with IMAP.
- * Outgoing Messages:: What happens when you post/mail something?
- * Agent Variables:: Customizing is fun.
- * Example Setup:: An example @file{.gnus.el} file for offline people.
- * Batching Agents:: How to fetch news from a @code{cron} job.
- * Agent Caveats:: What you think it'll do and what it does.
- Agent Categories
- * Category Syntax:: What a category looks like.
- * The Category Buffer:: A buffer for maintaining categories.
- * Category Variables:: Customize'r'Us.
- Agent Commands
- * Group Agent Commands::
- * Summary Agent Commands::
- * Server Agent Commands::
- Scoring
- * Summary Score Commands:: Adding score entries for the current group.
- * Group Score Commands:: General score commands.
- * Score Variables:: Customize your scoring. (My, what terminology).
- * Score File Format:: What a score file may contain.
- * Score File Editing:: You can edit score files by hand as well.
- * Adaptive Scoring:: Big Sister Gnus knows what you read.
- * Home Score File:: How to say where new score entries are to go.
- * Followups To Yourself:: Having Gnus notice when people answer you.
- * Scoring Tips:: How to score effectively.
- * Reverse Scoring:: That problem child of old is not problem.
- * Global Score Files:: Earth-spanning, ear-splitting score files.
- * Kill Files:: They are still here, but they can be ignored.
- * Converting Kill Files:: Translating kill files to score files.
- * GroupLens:: Getting predictions on what you like to read.
- * Advanced Scoring:: Using logical expressions to build score rules.
- * Score Decays:: It can be useful to let scores wither away.
- GroupLens
- * Using GroupLens:: How to make Gnus use GroupLens.
- * Rating Articles:: Letting GroupLens know how you rate articles.
- * Displaying Predictions:: Displaying predictions given by GroupLens.
- * GroupLens Variables:: Customizing GroupLens.
- Advanced Scoring
- * Advanced Scoring Syntax:: A definition.
- * Advanced Scoring Examples:: What they look like.
- * Advanced Scoring Tips:: Getting the most out of it.
- Various
- * Process/Prefix:: A convention used by many treatment commands.
- * Interactive:: Making Gnus ask you many questions.
- * Symbolic Prefixes:: How to supply some Gnus functions with options.
- * Formatting Variables:: You can specify what buffers should look like.
- * Windows Configuration:: Configuring the Gnus buffer windows.
- * Faces and Fonts:: How to change how faces look.
- * Compilation:: How to speed Gnus up.
- * Mode Lines:: Displaying information in the mode lines.
- * Highlighting and Menus:: Making buffers look all nice and cozy.
- * Buttons:: Get tendinitis in ten easy steps!
- * Daemons:: Gnus can do things behind your back.
- * NoCeM:: How to avoid spam and other fatty foods.
- * Undo:: Some actions can be undone.
- * Moderation:: What to do if you're a moderator.
- * XEmacs Enhancements:: There are more pictures and stuff under XEmacs.
- * Fuzzy Matching:: What's the big fuzz?
- * Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email.
- * Various Various:: Things that are really various.
- Formatting Variables
- * Formatting Basics:: A formatting variable is basically a format string.
- * Mode Line Formatting:: Some rules about mode line formatting variables.
- * Advanced Formatting:: Modifying output in various ways.
- * User-Defined Specs:: Having Gnus call your own functions.
- * Formatting Fonts:: Making the formatting look colorful and nice.
- XEmacs Enhancements
- * Picons:: How to display pictures of what your reading.
- * Smileys:: Show all those happy faces the way they were meant to be shown.
- * Toolbar:: Click'n'drool.
- * XVarious:: Other XEmacsy Gnusey variables.
- Picons
- * Picon Basics:: What are picons and How do I get them.
- * Picon Requirements:: Don't go further if you aren't using XEmacs.
- * Easy Picons:: Displaying Picons---the easy way.
- * Hard Picons:: The way you should do it. You'll learn something.
- * Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with.
- Appendices
- * History:: How Gnus got where it is today.
- * On Writing Manuals:: Why this is not a beginner's guide.
- * Terminology:: We use really difficult, like, words here.
- * Customization:: Tailoring Gnus to your needs.
- * Troubleshooting:: What you might try if things do not work.
- * Gnus Reference Guide:: Rilly, rilly technical stuff.
- * Emacs for Heathens:: A short introduction to Emacsian terms.
- * Frequently Asked Questions:: A question-and-answer session.
- History
- * Gnus Versions:: What Gnus versions have been released.
- * Other Gnus Versions:: Other Gnus versions that also have been released.
- * Why?:: What's the point of Gnus?
- * Compatibility:: Just how compatible is Gnus with @sc{gnus}?
- * Conformity:: Gnus tries to conform to all standards.
- * Emacsen:: Gnus can be run on a few modern Emacsen.
- * Gnus Development:: How Gnus is developed.
- * Contributors:: Oodles of people.
- * New Features:: Pointers to some of the new stuff in Gnus.
- New Features
- * ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.
- * September Gnus:: The Thing Formally Known As Gnus 5.2/5.3.
- * Red Gnus:: Third time best---Gnus 5.4/5.5.
- * Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.
- * Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.
- Customization
- * Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
- * Slow Terminal Connection:: You run a remote Emacs.
- * Little Disk Space:: You feel that having large setup files is icky.
- * Slow Machine:: You feel like buying a faster machine.
- Gnus Reference Guide
- * Gnus Utility Functions:: Common functions and variable to use.
- * Back End Interface:: How Gnus communicates with the servers.
- * Score File Syntax:: A BNF definition of the score file standard.
- * Headers:: How Gnus stores headers internally.
- * Ranges:: A handy format for storing mucho numbers.
- * Group Info:: The group info format.
- * Extended Interactive:: Symbolic prefixes and stuff.
- * Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.
- * Various File Formats:: Formats of files that Gnus use.
- Back End Interface
- * Required Back End Functions:: Functions that must be implemented.
- * Optional Back End Functions:: Functions that need not be implemented.
- * Error Messaging:: How to get messages and report errors.
- * Writing New Back Ends:: Extending old back ends.
- * Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end.
- * Mail-like Back Ends:: Some tips on mail back ends.
- Various File Formats
- * Active File Format:: Information on articles and groups available.
- * Newsgroups File Format:: Group descriptions.
- Emacs for Heathens
- * Keystrokes:: Entering text and executing commands.
- * Emacs Lisp:: The built-in Emacs programming language.
- @end detailmenu
- @end menu
- @node Starting Up
- @chapter Starting Gnus
- @cindex starting up
- @kindex M-x gnus
- @findex gnus
- If your system administrator has set things up properly, starting Gnus
- and reading news is extremely easy---you just type @kbd{M-x gnus} in
- your Emacs.
- @findex gnus-other-frame
- @kindex M-x gnus-other-frame
- If you want to start Gnus in a different frame, you can use the command
- @kbd{M-x gnus-other-frame} instead.
- If things do not go smoothly at startup, you have to twiddle some
- variables in your @file{~/.gnus} file. This file is similar to
- @file{~/.emacs}, but is read when gnus starts.
- If you puzzle at any terms used in this manual, please refer to the
- terminology section (@pxref{Terminology}).
- @menu
- * Finding the News:: Choosing a method for getting news.
- * The First Time:: What does Gnus do the first time you start it?
- * The Server is Down:: How can I read my mail then?
- * Slave Gnusae:: You can have more than one Gnus active at a time.
- * Fetching a Group:: Starting Gnus just to read a group.
- * New Groups:: What is Gnus supposed to do with new groups?
- * Startup Files:: Those pesky startup files---@file{.newsrc}.
- * Auto Save:: Recovering from a crash.
- * The Active File:: Reading the active file over a slow line Takes Time.
- * Changing Servers:: You may want to move from one server to another.
- * Startup Variables:: Other variables you might change.
- @end menu
- @node Finding the News
- @section Finding the News
- @cindex finding news
- @vindex gnus-select-method
- @c @head
- The @code{gnus-select-method} variable says where Gnus should look for
- news. This variable should be a list where the first element says
- @dfn{how} and the second element says @dfn{where}. This method is your
- native method. All groups not fetched with this method are
- foreign groups.
- For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is where
- you want to get your daily dosage of news from, you'd say:
- @lisp
- (setq gnus-select-method '(nntp "news.somewhere.edu"))
- @end lisp
- If you want to read directly from the local spool, say:
- @lisp
- (setq gnus-select-method '(nnspool ""))
- @end lisp
- If you can use a local spool, you probably should, as it will almost
- certainly be much faster.
- @vindex gnus-nntpserver-file
- @cindex NNTPSERVER
- @cindex @sc{nntp} server
- If this variable is not set, Gnus will take a look at the
- @code{NNTPSERVER} environment variable. If that variable isn't set,
- Gnus will see whether @code{gnus-nntpserver-file}
- (@file{/etc/nntpserver} by default) has any opinions on the matter. If
- that fails as well, Gnus will try to use the machine running Emacs as an @sc{nntp} server. That's a long shot, though.
- @vindex gnus-nntp-server
- If @code{gnus-nntp-server} is set, this variable will override
- @code{gnus-select-method}. You should therefore set
- @code{gnus-nntp-server} to @code{nil}, which is what it is by default.
- @vindex gnus-secondary-servers
- @vindex gnus-nntp-server
- You can also make Gnus prompt you interactively for the name of an
- @sc{nntp} server. If you give a non-numerical prefix to @code{gnus}
- (i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
- in the @code{gnus-secondary-servers} list (if any). You can also just
- type in the name of any server you feel like visiting. (Note that this
- will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x
- gnus} later in the same Emacs session, Gnus will contact the same
- server.)
- @findex gnus-group-browse-foreign-server
- @kindex B @r{(Group)}
- However, if you use one @sc{nntp} server regularly and are just
- interested in a couple of groups from a different server, you would be
- better served by using the @kbd{B} command in the group buffer. It will
- let you have a look at what groups are available, and you can subscribe
- to any of the groups you want to. This also makes @file{.newsrc}
- maintenance much tidier. @xref{Foreign Groups}.
- @vindex gnus-secondary-select-methods
- @c @head
- A slightly different approach to foreign groups is to set the
- @code{gnus-secondary-select-methods} variable. The select methods
- listed in this variable are in many ways just as native as the
- @code{gnus-select-method} server. They will also be queried for active
- files during startup (if that's required), and new newsgroups that
- appear on these servers will be subscribed (or not) just as native
- groups are.
- For instance, if you use the @code{nnmbox} back end to read your mail,
- you would typically set this variable to
- @lisp
- (setq gnus-secondary-select-methods '((nnmbox "")))
- @end lisp
- @node The First Time
- @section The First Time
- @cindex first time usage
- If no startup files exist, Gnus will try to determine what groups should
- be subscribed by default.
- @vindex gnus-default-subscribed-newsgroups
- If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
- will subscribe you to just those groups in that list, leaving the rest
- killed. Your system administrator should have set this variable to
- something useful.
- Since she hasn't, Gnus will just subscribe you to a few arbitrarily
- picked groups (i.e., @samp{*.newusers}). (@dfn{Arbitrary} is defined
- here as @dfn{whatever Lars thinks you should read}.)
- You'll also be subscribed to the Gnus documentation group, which should
- help you with most common problems.
- If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
- use the normal functions for handling new groups, and not do anything
- special.
- @node The Server is Down
- @section The Server is Down
- @cindex server errors
- If the default server is down, Gnus will understandably have some
- problems starting. However, if you have some mail groups in addition to
- the news groups, you may want to start Gnus anyway.
- Gnus, being the trusting sort of program, will ask whether to proceed
- without a native select method if that server can't be contacted. This
- will happen whether the server doesn't actually exist (i.e., you have
- given the wrong address) or the server has just momentarily taken ill
- for some reason or other. If you decide to continue and have no foreign
- groups, you'll find it difficult to actually do anything in the group
- buffer. But, hey, that's your problem. Blllrph!
- @findex gnus-no-server
- @kindex M-x gnus-no-server
- @c @head
- If you know that the server is definitely down, or you just want to read
- your mail without bothering with the server at all, you can use the
- @code{gnus-no-server} command to start Gnus. That might come in handy
- if you're in a hurry as well. This command will not attempt to contact
- your primary server---instead, it will just activate all groups on level
- 1 and 2. (You should preferably keep no native groups on those two
- levels.)
- @node Slave Gnusae
- @section Slave Gnusae
- @cindex slave
- You might want to run more than one Emacs with more than one Gnus at the
- same time. If you are using different @file{.newsrc} files (e.g., if you
- are using the two different Gnusae to read from two different servers),
- that is no problem whatsoever. You just do it.
- The problem appears when you want to run two Gnusae that use the same
- @code{.newsrc} file.
- To work around that problem some, we here at the Think-Tank at the Gnus
- Towers have come up with a new concept: @dfn{Masters} and
- @dfn{slaves}. (We have applied for a patent on this concept, and have
- taken out a copyright on those words. If you wish to use those words in
- conjunction with each other, you have to send $1 per usage instance to
- me. Usage of the patent (@dfn{Master/Slave Relationships In Computer
- Applications}) will be much more expensive, of course.)
- Anyway, you start one Gnus up the normal way with @kbd{M-x gnus} (or
- however you do it). Each subsequent slave Gnusae should be started with
- @kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc}
- files, but instead save @dfn{slave files} that contain information only
- on what groups have been read in the slave session. When a master Gnus
- starts, it will read (and delete) these slave files, incorporating all
- information from them. (The slave files will be read in the sequence
- they were created, so the latest changes will have precedence.)
- Information from the slave files has, of course, precedence over the
- information in the normal (i.e., master) @code{.newsrc} file.
- @node Fetching a Group
- @section Fetching a Group
- @cindex fetching a group
- @findex gnus-fetch-group
- It is sometimes convenient to be able to just say ``I want to read this
- group and I don't care whether Gnus has been started or not''. This is
- perhaps more useful for people who write code than for users, but the
- command @code{gnus-fetch-group} provides this functionality in any case.
- It takes the group name as a parameter.
- @node New Groups
- @section New Groups
- @cindex new groups
- @cindex subscription
- @vindex gnus-check-new-newsgroups
- If you are satisfied that you really never want to see any new groups,
- you can set @code{gnus-check-new-newsgroups} to @code{nil}. This will
- also save you some time at startup. Even if this variable is
- @code{nil}, you can always subscribe to the new groups just by pressing
- @kbd{U} in the group buffer (@pxref{Group Maintenance}). This variable
- is @code{ask-server} by default. If you set this variable to
- @code{always}, then Gnus will query the back ends for new groups even
- when you do the @kbd{g} command (@pxref{Scanning New Messages}).
- @menu
- * Checking New Groups:: Determining what groups are new.
- * Subscription Methods:: What Gnus should do with new groups.
- * Filtering New Groups:: Making Gnus ignore certain new groups.
- @end menu
- @node Checking New Groups
- @subsection Checking New Groups
- Gnus normally determines whether a group is new or not by comparing the
- list of groups from the active file(s) with the lists of subscribed and
- dead groups. This isn't a particularly fast method. If
- @code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
- server for new groups since the last time. This is both faster and
- cheaper. This also means that you can get rid of the list of killed
- groups altogether, so you may set @code{gnus-save-killed-list} to
- @code{nil}, which will save time both at startup, at exit, and all over.
- Saves disk space, too. Why isn't this the default, then?
- Unfortunately, not all servers support this command.
- I bet I know what you're thinking now: How do I find out whether my
- server supports @code{ask-server}? No? Good, because I don't have a
- fail-safe answer. I would suggest just setting this variable to
- @code{ask-server} and see whether any new groups appear within the next
- few days. If any do, then it works. If none do, then it doesn't
- work. I could write a function to make Gnus guess whether the server
- supports @code{ask-server}, but it would just be a guess. So I won't.
- You could @code{telnet} to the server and say @code{HELP} and see
- whether it lists @samp{NEWGROUPS} among the commands it understands. If
- it does, then it might work. (But there are servers that lists
- @samp{NEWGROUPS} without supporting the function properly.)
- This variable can also be a list of select methods. If so, Gnus will
- issue an @code{ask-server} command to each of the select methods, and
- subscribe them (or not) using the normal methods. This might be handy
- if you are monitoring a few servers for new groups. A side effect is
- that startup will take much longer, so you can meditate while waiting.
- Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
- @node Subscription Methods
- @subsection Subscription Methods
- @vindex gnus-subscribe-newsgroup-method
- What Gnus does when it encounters a new group is determined by the
- @code{gnus-subscribe-newsgroup-method} variable.
- This variable should contain a function. This function will be called
- with the name of the new group as the only parameter.
- Some handy pre-fab functions are:
- @table @code
- @item gnus-subscribe-zombies
- @vindex gnus-subscribe-zombies
- Make all new groups zombies. This is the default. You can browse the
- zombies later (with @kbd{A z}) and either kill them all off properly
- (with @kbd{S z}), or subscribe to them (with @kbd{u}).
- @item gnus-subscribe-randomly
- @vindex gnus-subscribe-randomly
- Subscribe all new groups in arbitrary order. This really means that all
- new groups will be added at ``the top'' of the group buffer.
- @item gnus-subscribe-alphabetically
- @vindex gnus-subscribe-alphabetically
- Subscribe all new groups in alphabetical order.
- @item gnus-subscribe-hierarchically
- @vindex gnus-subscribe-hierarchically
- Subscribe all new groups hierarchically. The difference between this
- function and @code{gnus-subscribe-alphabetically} is slight.
- @code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
- alphabetical fashion, while this function will enter groups into its
- hierarchy. So if you want to have the @samp{rec} hierarchy before the
- @samp{comp} hierarchy, this function will not mess that configuration
- up. Or something like that.
- @item gnus-subscribe-interactively
- @vindex gnus-subscribe-interactively
- Subscribe new groups interactively. This means that Gnus will ask
- you about @strong{all} new groups. The groups you choose to subscribe
- to will be subscribed hierarchically.
- @item gnus-subscribe-killed
- @vindex gnus-subscribe-killed
- Kill all new groups.
- @item gnus-subscribe-topics
- @vindex gnus-subscribe-topics
- Put the groups into the topic that has a matching @code{subscribe} topic
- parameter (@pxref{Topic Parameters}). For instance, a @code{subscribe}
- topic parameter that looks like
- @example
- "nnslashdot"
- @end example
- will mean that all groups that match that regex will be subscribed under
- that topic.
- If no topics match the groups, the groups will be subscribed in the
- top-level topic.
- @end table
- @vindex gnus-subscribe-hierarchical-interactive
- A closely related variable is
- @code{gnus-subscribe-hierarchical-interactive}. (That's quite a
- mouthful.) If this variable is non-@code{nil}, Gnus will ask you in a
- hierarchical fashion whether to subscribe to new groups or not. Gnus
- will ask you for each sub-hierarchy whether you want to descend the
- hierarchy or not.
- One common mistake is to set the variable a few paragraphs above
- (@code{gnus-subscribe-newsgroup-method}) to
- @code{gnus-subscribe-hierarchical-interactive}. This is an error. This
- will not work. This is ga-ga. So don't do it.
- @node Filtering New Groups
- @subsection Filtering New Groups
- A nice and portable way to control which new newsgroups should be
- subscribed (or ignored) is to put an @dfn{options} line at the start of
- the @file{.newsrc} file. Here's an example:
- @example
- options -n !alt.all !rec.all sci.all
- @end example
- @vindex gnus-subscribe-options-newsgroup-method
- This line obviously belongs to a serious-minded intellectual scientific
- person (or she may just be plain old boring), because it says that all
- groups that have names beginning with @samp{alt} and @samp{rec} should
- be ignored, and all groups with names beginning with @samp{sci} should
- be subscribed. Gnus will not use the normal subscription method for
- subscribing these groups.
- @code{gnus-subscribe-options-newsgroup-method} is used instead. This
- variable defaults to @code{gnus-subscribe-alphabetically}.
- @vindex gnus-options-not-subscribe
- @vindex gnus-options-subscribe
- If you don't want to mess with your @file{.newsrc} file, you can just
- set the two variables @code{gnus-options-subscribe} and
- @code{gnus-options-not-subscribe}. These two variables do exactly the
- same as the @file{.newsrc} @samp{options -n} trick. Both are regexps,
- and if the new group matches the former, it will be unconditionally
- subscribed, and if it matches the latter, it will be ignored.
- @vindex gnus-auto-subscribed-groups
- Yet another variable that meddles here is
- @code{gnus-auto-subscribed-groups}. It works exactly like
- @code{gnus-options-subscribe}, and is therefore really superfluous, but I
- thought it would be nice to have two of these. This variable is more
- meant for setting some ground rules, while the other variable is used
- more for user fiddling. By default this variable makes all new groups
- that come from mail back ends (@code{nnml}, @code{nnbabyl},
- @code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed. If you
- don't like that, just set this variable to @code{nil}.
- New groups that match this regexp are subscribed using
- @code{gnus-subscribe-options-newsgroup-method}.
- @node Changing Servers
- @section Changing Servers
- @cindex changing servers
- Sometimes it is necessary to move from one @sc{nntp} server to another.
- This happens very rarely, but perhaps you change jobs, or one server is
- very flaky and you want to use another.
- Changing the server is pretty easy, right? You just change
- @code{gnus-select-method} to point to the new server?
- @emph{Wrong!}
- Article numbers are not (in any way) kept synchronized between different
- @sc{nntp} servers, and the only way Gnus keeps track of what articles
- you have read is by keeping track of article numbers. So when you
- change @code{gnus-select-method}, your @file{.newsrc} file becomes
- worthless.
- Gnus provides a few functions to attempt to translate a @file{.newsrc}
- file from one server to another. They all have one thing in
- common---they take a looong time to run. You don't want to use these
- functions more than absolutely necessary.
- @kindex M-x gnus-change-server
- @findex gnus-change-server
- If you have access to both servers, Gnus can request the headers for all
- the articles you have read and compare @code{Message-ID}s and map the
- article numbers of the read articles and article marks. The @kbd{M-x
- gnus-change-server} command will do this for all your native groups. It
- will prompt for the method you want to move to.
- @kindex M-x gnus-group-move-group-to-server
- @findex gnus-group-move-group-to-server
- You can also move individual groups with the @kbd{M-x
- gnus-group-move-group-to-server} command. This is useful if you want to
- move a (foreign) group from one server to another.
- @kindex M-x gnus-group-clear-data-on-native-groups
- @findex gnus-group-clear-data-on-native-groups
- If you don't have access to both the old and new server, all your marks
- and read ranges have become worthless. You can use the @kbd{M-x
- gnus-group-clear-data-on-native-groups} command to clear out all data
- that you have on your native groups. Use with caution.
- After changing servers, you @strong{must} move the cache hierarchy away,
- since the cached articles will have wrong article numbers, which will
- affect which articles Gnus thinks are read.
- @node Startup Files
- @section Startup Files
- @cindex startup files
- @cindex .newsrc
- @cindex .newsrc.el
- @cindex .newsrc.eld
- Now, you all know about the @file{.newsrc} file. All subscription
- information is traditionally stored in this file.
- Things got a bit more complicated with @sc{gnus}. In addition to
- keeping the @file{.newsrc} file updated, it also used a file called
- @file{.newsrc.el} for storing all the information that didn't fit into
- the @file{.newsrc} file. (Actually, it also duplicated everything in
- the @file{.newsrc} file.) @sc{gnus} would read whichever one of these
- files was the most recently saved, which enabled people to swap between
- @sc{gnus} and other newsreaders.
- That was kinda silly, so Gnus went one better: In addition to the
- @file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
- @file{.newsrc.eld}. It will read whichever of these files that are most
- recent, but it will never write a @file{.newsrc.el} file. You should
- never delete the @file{.newsrc.eld} file---it contains much information
- not stored in the @file{.newsrc} file.
- @vindex gnus-save-newsrc-file
- @vindex gnus-read-newsrc-file
- You can turn off writing the @file{.newsrc} file by setting
- @code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
- the file and save some space, as well as exiting from Gnus faster.
- However, this will make it impossible to use other newsreaders than
- Gnus. But hey, who would want to, right? Similarly, setting
- @code{gnus-read-newsrc-file} to @code{nil} makes Gnus ignore the
- @file{.newsrc} file and any @file{.newsrc-SERVER} files, which is
- convenient if you have a tendency to use Netscape once in a while.
- @vindex gnus-save-killed-list
- If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
- will not save the list of killed groups to the startup file. This will
- save both time (when starting and quitting) and space (on disk). It
- will also mean that Gnus has no record of what groups are new or old,
- so the automatic new groups subscription methods become meaningless.
- You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
- @code{ask-server} if you set this variable to @code{nil} (@pxref{New
- Groups}). This variable can also be a regular expression. If that's
- the case, remove all groups that do not match this regexp before
- saving. This can be useful in certain obscure situations that involve
- several servers where not all servers support @code{ask-server}.
- @vindex gnus-startup-file
- The @code{gnus-startup-file} variable says where the startup files are.
- The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
- file being whatever that one is, with a @samp{.eld} appended.
- @vindex gnus-save-newsrc-hook
- @vindex gnus-save-quick-newsrc-hook
- @vindex gnus-save-standard-newsrc-hook
- @code{gnus-save-newsrc-hook} is called before saving any of the newsrc
- files, while @code{gnus-save-quick-newsrc-hook} is called just before
- saving the @file{.newsrc.eld} file, and
- @code{gnus-save-standard-newsrc-hook} is called just before saving the
- @file{.newsrc} file. The latter two are commonly used to turn version
- control on or off. Version control is on by default when saving the
- startup files. If you want to turn backup creation off, say something like:
- @lisp
- (defun turn-off-backup ()
- (set (make-local-variable 'backup-inhibited) t))
- (add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
- (add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
- @end lisp
- @vindex gnus-init-file
- When Gnus starts, it will read the @code{gnus-site-init-file}
- (@file{.../site-lisp/gnus} by default) and @code{gnus-init-file}
- (@file{~/.gnus} by default) files. These are normal Emacs Lisp files
- and can be used to avoid cluttering your @file{~/.emacs} and
- @file{site-init} files with Gnus stuff. Gnus will also check for files
- with the same names as these, but with @file{.elc} and @file{.el}
- suffixes. In other words, if you have set @code{gnus-init-file} to
- @file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
- and finally @file{~/.gnus} (in this order).
- @node Auto Save
- @section Auto Save
- @cindex dribble file
- @cindex auto-save
- Whenever you do something that changes the Gnus data (reading articles,
- catching up, killing/subscribing groups), the change is added to a
- special @dfn{dribble buffer}. This buffer is auto-saved the normal
- Emacs way. If your Emacs should crash before you have saved the
- @file{.newsrc} files, all changes you have made can be recovered from
- this file.
- If Gnus detects this file at startup, it will ask the user whether to
- read it. The auto save file is deleted whenever the real startup file is
- saved.
- @vindex gnus-use-dribble-file
- If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
- maintain a dribble buffer. The default is @code{t}.
- @vindex gnus-dribble-directory
- Gnus will put the dribble file(s) in @code{gnus-dribble-directory}. If
- this variable is @code{nil}, which it is by default, Gnus will dribble
- into the directory where the @file{.newsrc} file is located. (This is
- normally the user's home directory.) The dribble file will get the same
- file permissions as the @code{.newsrc} file.
- @vindex gnus-always-read-dribble-file
- If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will
- read the dribble file on startup without querying the user.
- @node The Active File
- @section The Active File
- @cindex active file
- @cindex ignored groups
- When Gnus starts, or indeed whenever it tries to determine whether new
- articles have arrived, it reads the active file. This is a very large
- file that lists all the active groups and articles on the server.
- @vindex gnus-ignored-newsgroups
- Before examining the active file, Gnus deletes all lines that match the
- regexp @code{gnus-ignored-newsgroups}. This is done primarily to reject
- any groups with bogus names, but you can use this variable to make Gnus
- ignore hierarchies you aren't ever interested in. However, this is not
- recommended. In fact, it's highly discouraged. Instead, @pxref{New
- Groups} for an overview of other variables that can be used instead.
- @c This variable is
- @c @code{nil} by default, and will slow down active file handling somewhat
- @c if you set it to anything else.
- @vindex gnus-read-active-file
- @c @head
- The active file can be rather Huge, so if you have a slow network, you
- can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
- reading the active file. This variable is @code{some} by default.
- Gnus will try to make do by getting information just on the groups that
- you actually subscribe to.
- Note that if you subscribe to lots and lots of groups, setting this
- variable to @code{nil} will probably make Gnus slower, not faster. At
- present, having this variable @code{nil} will slow Gnus down
- considerably, unless you read news over a 2400 baud modem.
- This variable can also have the value @code{some}. Gnus will then
- attempt to read active info only on the subscribed groups. On some
- servers this is quite fast (on sparkling, brand new INN servers that
- support the @code{LIST ACTIVE group} command), on others this isn't fast
- at all. In any case, @code{some} should be faster than @code{nil}, and
- is certainly faster than @code{t} over slow lines.
- Some news servers (old versions of Leafnode and old versions of INN, for
- instance) do not support the @code{LIST ACTIVE group}. For these
- servers, @code{nil} is probably the most efficient value for this
- variable.
- If this variable is @code{nil}, Gnus will ask for group info in total
- lock-step, which isn't very fast. If it is @code{some} and you use an
- @sc{nntp} server, Gnus will pump out commands as fast as it can, and
- read all the replies in one swoop. This will normally result in better
- performance, but if the server does not support the aforementioned
- @code{LIST ACTIVE group} command, this isn't very nice to the server.
- If you think that starting up Gnus takes too long, try all the three
- different values for this variable and see what works best for you.
- In any case, if you use @code{some} or @code{nil}, you should definitely
- kill all groups that you aren't interested in to speed things up.
- Note that this variable also affects active file retrieval from
- secondary select methods.
- @node Startup Variables
- @section Startup Variables
- @table @code
- @item gnus-load-hook
- @vindex gnus-load-hook
- A hook run while Gnus is being loaded. Note that this hook will
- normally be run just once in each Emacs session, no matter how many
- times you start Gnus.
- @item gnus-before-startup-hook
- @vindex gnus-before-startup-hook
- A hook run after starting up Gnus successfully.
- @item gnus-startup-hook
- @vindex gnus-startup-hook
- A hook run as the very last thing after starting up Gnus
- @item gnus-started-hook
- @vindex gnus-started-hook
- A hook that is run as the very last thing after starting up Gnus
- successfully.
- @item gnus-setup-news-hook
- @vindex gnus-setup-news-hook
- A hook that is run after reading the @file{.newsrc} file(s), but before
- generating the group buffer.
- @item gnus-check-bogus-newsgroups
- @vindex gnus-check-bogus-newsgroups
- If non-@code{nil}, Gnus will check for and delete all bogus groups at
- startup. A @dfn{bogus group} is a group that you have in your
- @file{.newsrc} file, but doesn't exist on the news server. Checking for
- bogus groups can take quite a while, so to save time and resources it's
- best to leave this option off, and do the checking for bogus groups once
- in a while from the group buffer instead (@pxref{Group Maintenance}).
- @item gnus-inhibit-startup-message
- @vindex gnus-inhibit-startup-message
- If non-@code{nil}, the startup message won't be displayed. That way,
- your boss might not notice as easily that you are reading news instead
- of doing your job. Note that this variable is used before
- @file{.gnus.el} is loaded, so it should be set in @code{.emacs} instead.
- @item gnus-no-groups-message
- @vindex gnus-no-groups-message
- Message displayed by Gnus when no groups are available.
- @item gnus-play-startup-jingle
- @vindex gnus-play-startup-jingle
- If non-@code{nil}, play the Gnus jingle at startup.
- @item gnus-startup-jingle
- @vindex gnus-startup-jingle
- Jingle to be played if the above variable is non-@code{nil}. The
- default is @samp{Tuxedomoon.Jingle4.au}.
- @end table
- @node The Group Buffer
- @chapter The Group Buffer
- @cindex group buffer
- The @dfn{group buffer} lists all (or parts) of the available groups. It
- is the first buffer shown when Gnus starts, and will never be killed as
- long as Gnus is active.
- @iftex
- @iflatex
- \gnusfigure{The Group Buffer}{320}{
- \put(75,50){\epsfig{figure=tmp/group.ps,height=9cm}}
- \put(120,37){\makebox(0,0)[t]{Buffer name}}
- \put(120,38){\vector(1,2){10}}
- \put(40,60){\makebox(0,0)[r]{Mode line}}
- \put(40,58){\vector(1,0){30}}
- \put(200,28){\makebox(0,0)[t]{Native select method}}
- \put(200,26){\vector(-1,2){15}}
- }
- @end iflatex
- @end iftex
- @menu
- * Group Buffer Format:: Information listed and how you can change it.
- * Group Maneuvering:: Commands for moving in the group buffer.
- * Selecting a Group:: Actually reading news.
- * Group Data:: Changing the info for a group.
- * Subscription Commands:: Unsubscribing, killing, subscribing.
- * Group Levels:: Levels? What are those, then?
- * Group Score:: A mechanism for finding out what groups you like.
- * Marking Groups:: You can mark groups for later processing.
- * Foreign Groups:: Creating and editing groups.
- * Group Parameters:: Each group may have different parameters set.
- * Listing Groups:: Gnus can list various subsets of the groups.
- * Sorting Groups:: Re-arrange the group order.
- * Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
- * Browse Foreign Server:: You can browse a server. See what it has to offer.
- * Exiting Gnus:: Stop reading news and get some work done.
- * Group Topics:: A folding group mode divided into topics.
- * Misc Group Stuff:: Other stuff that you can to do.
- @end menu
- @node Group Buffer Format
- @section Group Buffer Format
- @menu
- * Group Line Specification:: Deciding how the group buffer is to look.
- * Group Modeline Specification:: The group buffer modeline.
- * Group Highlighting:: Having nice colors in the group buffer.
- @end menu
- @node Group Line Specification
- @subsection Group Line Specification
- @cindex group buffer format
- The default format of the group buffer is nice and dull, but you can
- make it as exciting and ugly as you feel like.
- Here's a couple of example group lines:
- @example
- 25: news.announce.newusers
- * 0: alt.fan.andrea-dworkin
- @end example
- Quite simple, huh?
- You can see that there are 25 unread articles in
- @samp{news.announce.newusers}. There are no unread articles, but some
- ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
- asterisk at the beginning of the line?).
- @vindex gnus-group-line-format
- You can change that format to whatever you want by fiddling with the
- @code{gnus-group-line-format} variable. This variable works along the
- lines of a @code{format} specification, which is pretty much the same as
- a @code{printf} specifications, for those of you who use (feh!) C.
- @xref{Formatting Variables}.
- @samp{%M%S%5y: %(%g%)\n} is the value that produced those lines above.
- There should always be a colon on the line; the cursor always moves to
- the colon after performing an operation. Nothing else is required---not
- even the group name. All displayed text is just window dressing, and is
- never examined by Gnus. Gnus stores all real information it needs using
- text properties.
- (Note that if you make a really strange, wonderful, spreadsheet-like
- layout, everybody will believe you are hard at work with the accounting
- instead of wasting time reading news.)
- Here's a list of all available format characters:
- @table @samp
- @item M
- An asterisk if the group only has marked articles.
- @item S
- Whether the group is subscribed.
- @item L
- Level of subscribedness.
- @item N
- Number of unread articles.
- @item I
- Number of dormant articles.
- @item T
- Number of ticked articles.
- @item R
- Number of read articles.
- @item t
- Estimated total number of articles. (This is really @var{max-number}
- minus @var{min-number} plus 1.)
- @item y
- Number of unread, unticked, non-dormant articles.
- @item i
- Number of ticked and dormant articles.
- @item g
- Full group name.
- @item G
- Group name.
- @item D
- Newsgroup description.
- @item o
- @samp{m} if moderated.
- @item O
- @samp{(m)} if moderated.
- @item s
- Select method.
- @item n
- Select from where.
- @item z
- A string that looks like @samp{<%s:%n>} if a foreign select method is
- used.
- @item P
- Indentation based on the level of the topic (@pxref{Group Topics}).
- @item c
- @vindex gnus-group-uncollapsed-levels
- Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels}
- variable says how many levels to leave at the end of the group name.
- The default is 1---this will mean that group names like
- @samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}.
- @item m
- @vindex gnus-new-mail-mark
- @cindex %
- @samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
- the group lately.
- @item p
- @samp{#} (@code{gnus-process-mark}) if the group is process marked.
- @item d
- A string that says when you last read the group (@pxref{Group
- Timestamp}).
- @item u
- User defined specifier. The next character in the format string should
- be a letter. Gnus will call the function
- @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
- following @samp{%u}. The function will be passed a single dummy
- parameter as argument. The function should return a string, which will
- be inserted into the buffer just like information from any other
- specifier.
- @end table
- @cindex *
- All the ``number-of'' specs will be filled with an asterisk (@samp{*})
- if no info is available---for instance, if it is a non-activated foreign
- group, or a bogus native group.
- @node Group Modeline Specification
- @subsection Group Modeline Specification
- @cindex group modeline
- @vindex gnus-group-mode-line-format
- The mode line can be changed by setting
- @code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}). It
- doesn't understand that many format specifiers:
- @table @samp
- @item S
- The native news server.
- @item M
- The native select method.
- @end table
- @node Group Highlighting
- @subsection Group Highlighting
- @cindex highlighting
- @cindex group highlighting
- @vindex gnus-group-highlight
- Highlighting in the group buffer is controlled by the
- @code{gnus-group-highlight} variable. This is an alist with elements
- that look like @code{(@var{form} . @var{face})}. If @var{form} evaluates to
- something non-@code{nil}, the @var{face} will be used on the line.
- Here's an example value for this variable that might look nice if the
- background is dark:
- @lisp
- (cond (window-system
- (setq custom-background-mode 'light)
- (defface my-group-face-1
- '((t (:foreground "Red" :bold t))) "First group face")
- (defface my-group-face-2
- '((t (:foreground "DarkSeaGreen4" :bold t))) "Second group face")
- (defface my-group-face-3
- '((t (:foreground "Green4" :bold t))) "Third group face")
- (defface my-group-face-4
- '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
- (defface my-group-face-5
- '((t (:foreground "Blue" :bold t))) "Fifth group face")))
- (setq gnus-group-highlight
- '(((> unread 200) . my-group-face-1)
- ((and (< level 3) (zerop unread)) . my-group-face-2)
- ((< level 3) . my-group-face-3)
- ((zerop unread) . my-group-face-4)
- (t . my-group-face-5)))
- @end lisp
- Also @pxref{Faces and Fonts}.
- Variables that are dynamically bound when the forms are evaluated
- include:
- @table @code
- @item group
- The group name.
- @item unread
- The number of unread articles in the group.
- @item method
- The select method.
- @item mailp
- Whether the group is a mail group.
- @item level
- The level of the group.
- @item score
- The score of the group.
- @item ticked
- The number of ticked articles in the group.
- @item total
- The total number of articles in the group. Or rather, MAX-NUMBER minus
- MIN-NUMBER plus one.
- @item topic
- When using the topic minor mode, this variable is bound to the current
- topic being inserted.
- @end table
- When the forms are @code{eval}ed, point is at the beginning of the line
- of the group in question, so you can use many of the normal Gnus
- functions for snarfing info on the group.
- @vindex gnus-group-update-hook
- @findex gnus-group-highlight-line
- @code{gnus-group-update-hook} is called when a group line is changed.
- It will not be called when @code{gnus-visual} is @code{nil}. This hook
- calls @code{gnus-group-highlight-line} by default.
- @node Group Maneuvering
- @section Group Maneuvering
- @cindex group movement
- All movement commands understand the numeric prefix and will behave as
- expected, hopefully.
- @table @kbd
- @item n
- @kindex n @r{(Group)}
- @findex gnus-group-next-unread-group
- Go to the next group that has unread articles
- (@code{gnus-group-next-unread-group}).
- @item p
- @itemx @key{DEL}
- @kindex @key{DEL} @r{(Group)}
- @kindex p @r{(Group)}
- @findex gnus-group-prev-unread-group
- Go to the previous group that has unread articles
- (@code{gnus-group-prev-unread-group}).
- @item N
- @kindex N @r{(Group)}
- @findex gnus-group-next-group
- Go to the next group (@code{gnus-group-next-group}).
- @item P
- @kindex P @r{(Group)}
- @findex gnus-group-prev-group
- Go to the previous group (@code{gnus-group-prev-group}).
- @item M-n
- @kindex M-n @r{(Group)}
- @findex gnus-group-next-unread-group-same-level
- Go to the next unread group on the same (or lower) level
- (@code{gnus-group-next-unread-group-same-level}).
- @item M-p
- @kindex M-p @r{(Group)}
- @findex gnus-group-prev-unread-group-same-level
- Go to the previous unread group on the same (or lower) level
- (@code{gnus-group-prev-unread-group-same-level}).
- @end table
- Three commands for jumping to groups:
- @table @kbd
- @item j
- @kindex j @r{(Group)}
- @findex gnus-group-jump-to-group
- Jump to a group (and make it visible if it isn't already)
- (@code{gnus-group-jump-to-group}). Killed groups can be jumped to, just
- like living groups.
- @item ,
- @kindex , @r{(Group)}
- @findex gnus-group-best-unread-group
- Jump to the unread group with the lowest level
- (@code{gnus-group-best-unread-group}).
- @item .
- @kindex . @r{(Group)}
- @findex gnus-group-first-unread-group
- Jump to the first group with unread articles
- (@code{gnus-group-first-unread-group}).
- @end table
- @vindex gnus-group-goto-unread
- If @code{gnus-group-goto-unread} is @code{nil}, all the movement
- commands will move to the next group, not the next unread group. Even
- the commands that say they move to the next unread group. The default
- is @code{t}.
- @node Selecting a Group
- @section Selecting a Group
- @cindex group selection
- @table @kbd
- @item @key{SPC}
- @kindex @key{SPC} @r{(Group)}
- @findex gnus-group-read-group
- Select the current group, switch to the summary buffer and display the
- first unread article (@code{gnus-group-read-group}). If there are no
- unread articles in the group, or if you give a non-numerical prefix to
- this command, Gnus will offer to fetch all the old articles in this
- group from the server. If you give a numerical prefix @var{N}, @var{N}
- determines the number of articles Gnus will fetch. If @var{N} is
- positive, Gnus fetches the @var{N} newest articles, if @var{N} is
- negative, Gnus fetches the @code{abs(@var{N})} oldest articles.
- Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers old
- articles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u
- - 4 2 SPC} fetches the 42 oldest ones.
- When you are in the group (in the Summary buffer), you can type
- @kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the old
- ones.
- @item @key{RET}
- @kindex @key{RET} @r{(Group)}
- @findex gnus-group-select-group
- Select the current group and switch to the summary buffer
- (@code{gnus-group-select-group}). Takes the same arguments as
- @code{gnus-group-read-group}---the only difference is that this command
- does not display the first unread article automatically upon group
- entry.
- @item M-@key{RET}
- @kindex M-@key{RET} @r{(Group)}
- @findex gnus-group-quick-select-group
- This does the same as the command above, but tries to do it with the
- minimum amount of fuzz (@code{gnus-group-quick-select-group}). No
- scoring/killing will be performed, there will be no highlights and no
- expunging. This might be useful if you're in a real hurry and have to
- enter some humongous group. If you give a 0 prefix to this command
- (i.e., @kbd{0 M-@key{RET}}), Gnus won't even generate the summary buffer,
- which is useful if you want to toggle threading before generating the
- summary buffer (@pxref{Summary Generation Commands}).
- @item M-@key{SPC}
- @kindex M-@key{SPC} @r{(Group)}
- @findex gnus-group-visible-select-group
- This is yet one more command that does the same as the @key{RET}
- command, but this one does it without expunging and hiding dormants
- (@code{gnus-group-visible-select-group}).
- @item C-M-@key{RET}
- @kindex C-M-@key{RET} @r{(Group)}
- @findex gnus-group-select-group-ephemerally
- Finally, this command selects the current group ephemerally without
- doing any processing of its contents
- (@code{gnus-group-select-group-ephemerally}). Even threading has been
- turned off. Everything you do in the group after selecting it in this
- manner will have no permanent effects.
- @end table
- @vindex gnus-large-newsgroup
- The @code{gnus-large-newsgroup} variable says what Gnus should consider
- to be a big group. This is 200 by default. If the group has more
- (unread and/or ticked) articles than this, Gnus will query the user
- before entering the group. The user can then specify how many articles
- should be fetched from the server. If the user specifies a negative
- number (@code{-n}), the @code{n} oldest articles will be fetched. If it
- is positive, the @code{n} articles that have arrived most recently will
- be fetched.
- @vindex gnus-select-group-hook
- @vindex gnus-auto-select-first
- @code{gnus-auto-select-first} control whether any articles are selected
- automatically when entering a group with the @key{SPC} command.
- @table @code
- @item nil
- Don't select any articles when entering the group. Just display the
- full summary buffer.
- @item t
- Select the first unread article when entering the group.
- @item best
- Select the highest scored article in the group when entering the
- group.
- @end table
- This variable can also be a function. In that case, that function will
- be called to place point on a subject line, and/or select some article.
- Useful functions include:
- @table @code
- @item gnus-summary-first-unread-subject
- Place point on the subject line of the first unread article, but
- don't select the article.
- @item gnus-summary-first-unread-article
- Select the first unread article.
- @item gnus-summary-best-unread-article
- Select the highest-scored unread article.
- @end table
- If you want to prevent automatic selection in some group (say, in a
- binary group with Huge articles) you can set this variable to @code{nil}
- in @code{gnus-select-group-hook}, which is called when a group is
- selected.
- @node Subscription Commands
- @section Subscription Commands
- @cindex subscription
- @table @kbd
- @item S t
- @itemx u
- @kindex S t @r{(Group)}
- @kindex u @r{(Group)}
- @findex gnus-group-unsubscribe-current-group
- @c @icon{gnus-group-unsubscribe}
- Toggle subscription to the current group
- (@code{gnus-group-unsubscribe-current-group}).
- @item S s
- @itemx U
- @kindex S s @r{(Group)}
- @kindex U @r{(Group)}
- @findex gnus-group-unsubscribe-group
- Prompt for a group to subscribe, and then subscribe it. If it was
- subscribed already, unsubscribe it instead
- (@code{gnus-group-unsubscribe-group}).
- @item S k
- @itemx C-k
- @kindex S k @r{(Group)}
- @kindex C-k @r{(Group)}
- @findex gnus-group-kill-group
- @c @icon{gnus-group-kill-group}
- Kill the current group (@code{gnus-group-kill-group}).
- @item S y
- @itemx C-y
- @kindex S y @r{(Group)}
- @kindex C-y @r{(Group)}
- @findex gnus-group-yank-group
- Yank the last killed group (@code{gnus-group-yank-group}).
- @item C-x C-t
- @kindex C-x C-t @r{(Group)}
- @findex gnus-group-transpose-groups
- Transpose two groups (@code{gnus-group-transpose-groups}). This isn't
- really a subscription command, but you can use it instead of a
- kill-and-yank sequence sometimes.
- @item S w
- @itemx C-w
- @kindex S w @r{(Group)}
- @kindex C-w @r{(Group)}
- @findex gnus-group-kill-region
- Kill all groups in the region (@code{gnus-group-kill-region}).
- @item S z
- @kindex S z @r{(Group)}
- @findex gnus-group-kill-all-zombies
- Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
- @item S C-k
- @kindex S C-k @r{(Group)}
- @findex gnus-group-kill-level
- Kill all groups on a certain level (@code{gnus-group-kill-level}).
- These groups can't be yanked back after killing, so this command should
- be used with some caution. The only time where this command comes in
- really handy is when you have a @file{.newsrc} with lots of unsubscribed
- groups that you want to get rid off. @kbd{S C-k} on level 7 will
- kill off all unsubscribed groups that do not have message numbers in the
- @file{.newsrc} file.
- @end table
- Also @pxref{Group Levels}.
- @node Group Data
- @section Group Data
- @table @kbd
- @item c
- @kindex c @r{(Group)}
- @findex gnus-group-catchup-current
- @vindex gnus-group-catchup-group-hook
- @c @icon{gnus-group-catchup-current}
- Mark all unticked articles in this group as read
- (@code{gnus-group-catchup-current}).
- @code{gnus-group-catchup-group-hook} is called when catching up a group from
- the group buffer.
- @item C
- @kindex C @r{(Group)}
- @findex gnus-group-catchup-current-all
- Mark all articles in this group, even the ticked ones, as read
- (@code{gnus-group-catchup-current-all}).
- @item M-c
- @kindex M-c @r{(Group)}
- @findex gnus-group-clear-data
- Clear the data from the current group---nix out marks and the list of
- read articles (@code{gnus-group-clear-data}).
- @item M-x gnus-group-clear-data-on-native-groups
- @kindex M-x gnus-group-clear-data-on-native-groups
- @findex gnus-group-clear-data-on-native-groups
- If you have switched from one @sc{nntp} server to another, all your marks
- and read ranges have become worthless. You can use this command to
- clear out all data that you have on your native groups. Use with
- caution.
- @end table
- @node Group Levels
- @section Group Levels
- @cindex group level
- @cindex level
- All groups have a level of @dfn{subscribedness}. For instance, if a
- group is on level 2, it is more subscribed than a group on level 5. You
- can ask Gnus to just list groups on a given level or lower
- (@pxref{Listing Groups}), or to just check for new articles in groups on
- a given level or lower (@pxref{Scanning New Messages}).
- Remember: The higher the level of the group, the less important it is.
- @table @kbd
- @item S l
- @kindex S l @r{(Group)}
- @findex gnus-group-set-current-level
- Set the level of the current group. If a numeric prefix is given, the
- next @var{n} groups will have their levels set. The user will be
- prompted for a level.
- @end table
- @vindex gnus-level-killed
- @vindex gnus-level-zombie
- @vindex gnus-level-unsubscribed
- @vindex gnus-level-subscribed
- Gnus considers groups from levels 1 to
- @code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
- @code{gnus-level-subscribed} (exclusive) and
- @code{gnus-level-unsubscribed} (inclusive) (default 7) to be
- unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
- (default 8) and @code{gnus-level-killed} to be killed (completely dead)
- (default 9). Gnus treats subscribed and unsubscribed groups exactly the
- same, but zombie and killed groups have no information on what articles
- you have read, etc, stored. This distinction between dead and living
- groups isn't done because it is nice or clever, it is done purely for
- reasons of efficiency.
- It is recommended that you keep all your mail groups (if any) on quite
- low levels (e.g. 1 or 2).
- Maybe the following description of the default behavior of Gnus helps to
- understand what these levels are all about. By default, Gnus shows you
- subscribed nonempty groups, but by hitting @kbd{L} you can have it show
- empty subscribed groups and unsubscribed groups, too. Type @kbd{l} to
- go back to showing nonempty subscribed groups again. Thus, unsubscribed
- groups are hidden, in a way.
- Zombie and killed groups are similar to unsubscribed groups in that they
- are hidden by default. But they are different from subscribed and
- unsubscribed groups in that Gnus doesn't ask the news server for
- information (number of messages, number of unread messages) on zombie
- and killed groups. Normally, you use @kbd{C-k} to kill the groups you
- aren't interested in. If most groups are killed, Gnus is faster.
- Why does Gnus distinguish between zombie and killed groups? Well, when
- a new group arrives on the server, Gnus by default makes it a zombie
- group. This means that you are normally not bothered with new groups,
- but you can type @kbd{A z} to get a list of all new groups. Subscribe
- the ones you like and kill the ones you don't want. (@kbd{A k} shows a
- list of killed groups.)
- If you want to play with the level variables, you should show some care.
- Set them once, and don't touch them ever again. Better yet, don't touch
- them at all unless you know exactly what you're doing.
- @vindex gnus-level-default-unsubscribed
- @vindex gnus-level-default-subscribed
- Two closely related variables are @code{gnus-level-default-subscribed}
- (default 3) and @code{gnus-level-default-unsubscribed} (default 6),
- which are the levels that new groups will be put on if they are
- (un)subscribed. These two variables should, of course, be inside the
- relevant valid ranges.
- @vindex gnus-keep-same-level
- If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
- will only move to groups of the same level (or lower). In
- particular, going from the last article in one group to the next group
- will go to the next group of the same level (or lower). This might be
- handy if you want to read the most important groups before you read the
- rest.
- If this variable is @code{best}, Gnus will make the next newsgroup the
- one with the best level.
- @vindex gnus-group-default-list-level
- All groups with a level less than or equal to
- @code{gnus-group-default-list-level} will be listed in the group buffer
- by default.
- @vindex gnus-group-list-inactive-groups
- If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
- groups will be listed along with the unread groups. This variable is
- @code{t} by default. If it is @code{nil}, inactive groups won't be
- listed.
- @vindex gnus-group-use-permanent-levels
- If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
- give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
- use this level as the ``work'' level.
- @vindex gnus-activate-level
- Gnus will normally just activate (i. e., query the server about) groups
- on level @code{gnus-activate-level} or less. If you don't want to
- activate unsubscribed groups, for instance, you might set this variable
- to 5. The default is 6.
- @node Group Score
- @section Group Score
- @cindex group score
- @cindex group rank
- @cindex rank
- You would normally keep important groups on high levels, but that scheme
- is somewhat restrictive. Don't you wish you could have Gnus sort the
- group buffer according to how often you read groups, perhaps? Within
- reason?
- This is what @dfn{group score} is for. You can have Gnus assign a score
- to each group through the mechanism described below. You can then sort
- the group buffer based on this score. Alternatively, you can sort on
- score and then level. (Taken together, the level and the score is
- called the @dfn{rank} of the group. A group that is on level 4 and has
- a score of 1 has a higher rank than a group on level 5 that has a score
- of 300. (The level is the most significant part and the score is the
- least significant part.))
- @findex gnus-summary-bubble-group
- If you want groups you read often to get higher scores than groups you
- read seldom you can add the @code{gnus-summary-bubble-group} function to
- the @code{gnus-summary-exit-hook} hook. This will result (after
- sorting) in a bubbling sort of action. If you want to see that in
- action after each summary exit, you can add
- @code{gnus-group-sort-groups-by-rank} or
- @code{gnus-group-sort-groups-by-score} to the same hook, but that will
- slow things down somewhat.
- @node Marking Groups
- @section Marking Groups
- @cindex marking groups
- If you want to perform some command on several groups, and they appear
- subsequently in the group buffer, you would normally just give a
- numerical prefix to the command. Most group commands will then do your
- bidding on those groups.
- However, if the groups are not in sequential order, you can still
- perform a command on several groups. You simply mark the groups first
- with the process mark and then execute the command.
- @table @kbd
- @item #
- @kindex # @r{(Group)}
- @itemx M m
- @kindex M m @r{(Group)}
- @findex gnus-group-mark-group
- Set the mark on the current group (@code{gnus-group-mark-group}).
- @item M-#
- @kindex M-# @r{(Group)}
- @itemx M u
- @kindex M u @r{(Group)}
- @findex gnus-group-unmark-group
- Remove the mark from the current group
- (@code{gnus-group-unmark-group}).
- @item M U
- @kindex M U @r{(Group)}
- @findex gnus-group-unmark-all-groups
- Remove the mark from all groups (@code{gnus-group-unmark-all-groups}).
- @item M w
- @kindex M w @r{(Group)}
- @findex gnus-group-mark-region
- Mark all groups between point and mark (@code{gnus-group-mark-region}).
- @item M b
- @kindex M b @r{(Group)}
- @findex gnus-group-mark-buffer
- Mark all groups in the buffer (@code{gnus-group-mark-buffer}).
- @item M r
- @kindex M r @r{(Group)}
- @findex gnus-group-mark-regexp
- Mark all groups that match some regular expression
- (@code{gnus-group-mark-regexp}).
- @end table
- Also @pxref{Process/Prefix}.
- @findex gnus-group-universal-argument
- If you want to execute some command on all groups that have been marked
- with the process mark, you can use the @kbd{M-&}
- (@code{gnus-group-universal-argument}) command. It will prompt you for
- the command to be executed.
- @node Foreign Groups
- @section Foreign Groups
- @cindex foreign groups
- Below are some group mode commands for making and editing general foreign
- groups, as well as commands to ease the creation of a few
- special-purpose groups. All these commands insert the newly created
- groups under point---@code{gnus-subscribe-newsgroup-method} is not
- consulted.
- @table @kbd
- @item G m
- @kindex G m @r{(Group)}
- @findex gnus-group-make-group
- @cindex making groups
- Make a new group (@code{gnus-group-make-group}). Gnus will prompt you
- for a name, a method and possibly an @dfn{address}. For an easier way
- to subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}.
- @item G r
- @kindex G r @r{(Group)}
- @findex gnus-group-rename-group
- @cindex renaming groups
- Rename the current group to something else
- (@code{gnus-group-rename-group}). This is valid only on some
- groups---mail groups mostly. This command might very well be quite slow
- on some back ends.
- @item G c
- @kindex G c @r{(Group)}
- @cindex customizing
- @findex gnus-group-customize
- Customize the group parameters (@code{gnus-group-customize}).
- @item G e
- @kindex G e @r{(Group)}
- @findex gnus-group-edit-group-method
- @cindex renaming groups
- Enter a buffer where you can edit the select method of the current
- group (@code{gnus-group-edit-group-method}).
- @item G p
- @kindex G p @r{(Group)}
- @findex gnus-group-edit-group-parameters
- Enter a buffer where you can edit the group parameters
- (@code{gnus-group-edit-group-parameters}).
- @item G E
- @kindex G E @r{(Group)}
- @findex gnus-group-edit-group
- Enter a buffer where you can edit the group info
- (@code{gnus-group-edit-group}).
- @item G d
- @kindex G d @r{(Group)}
- @findex gnus-group-make-directory-group
- @cindex nndir
- Make a directory group (@pxref{Directory Groups}). You will be prompted
- for a directory name (@code{gnus-group-make-directory-group}).
- @item G h
- @kindex G h @r{(Group)}
- @cindex help group
- @findex gnus-group-make-help-group
- Make the Gnus help group (@code{gnus-group-make-help-group}).
- @item G a
- @kindex G a @r{(Group)}
- @cindex (ding) archive
- @cindex archive group
- @findex gnus-group-make-archive-group
- @vindex gnus-group-archive-directory
- @vindex gnus-group-recent-archive-directory
- Make a Gnus archive group (@code{gnus-group-make-archive-group}). By
- default a group pointing to the most recent articles will be created
- (@code{gnus-group-recent-archive-directory}), but given a prefix, a full
- group will be created from @code{gnus-group-archive-directory}.
- @item G k
- @kindex G k @r{(Group)}
- @findex gnus-group-make-kiboze-group
- @cindex nnkiboze
- Make a kiboze group. You will be prompted for a name, for a regexp to
- match groups to be ``included'' in the kiboze group, and a series of
- strings to match on headers (@code{gnus-group-make-kiboze-group}).
- @xref{Kibozed Groups}.
- @item G D
- @kindex G D @r{(Group)}
- @findex gnus-group-enter-directory
- @cindex nneething
- Read an arbitrary directory as if it were a newsgroup with the
- @code{nneething} back end (@code{gnus-group-enter-directory}).
- @xref{Anything Groups}.
- @item G f
- @kindex G f @r{(Group)}
- @findex gnus-group-make-doc-group
- @cindex ClariNet Briefs
- @cindex nndoc
- Make a group based on some file or other
- (@code{gnus-group-make-doc-group}). If you give a prefix to this
- command, you will be prompted for a file name and a file type.
- Currently supported types are @code{babyl}, @code{mbox}, @code{digest},
- @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs},
- @code{rfc934}, @code{rfc822-forward}, @code{nsmail} and @code{forward}.
- If you run this command without a prefix, Gnus will guess at the file
- type. @xref{Document Groups}.
- @item G u
- @kindex G u @r{(Group)}
- @vindex gnus-useful-groups
- @findex gnus-group-make-useful-group
- Create one of the groups mentioned in @code{gnus-useful-groups}
- (@code{gnus-group-make-useful-group}).
- @item G w
- @kindex G w @r{(Group)}
- @findex gnus-group-make-web-group
- @cindex DejaNews
- @cindex Alta Vista
- @cindex InReference
- @cindex nnweb
- Make an ephemeral group based on a web search
- (@code{gnus-group-make-web-group}). If you give a prefix to this
- command, make a solid group instead. You will be prompted for the
- search engine type and the search string. Valid search engine types
- include @code{dejanews}, @code{altavista} and @code{reference}.
- @xref{Web Searches}.
- If you use the @code{dejanews} search engine, you can limit the search
- to a particular group by using a match string like
- @samp{~g alt.sysadmin.recovery shaving}.
- @item G @key{DEL}
- @kindex G @key{DEL} @r{(Group)}
- @findex gnus-group-delete-group
- This function will delete the current group
- (@code{gnus-group-delete-group}). If given a prefix, this function will
- actually delete all the articles in the group, and forcibly remove the
- group itself from the face of the Earth. Use a prefix only if you are
- absolutely sure of what you are doing. This command can't be used on
- read-only groups (like @code{nntp} group), though.
- @item G V
- @kindex G V @r{(Group)}
- @findex gnus-group-make-empty-virtual
- Make a new, fresh, empty @code{nnvirtual} group
- (@code{gnus-group-make-empty-virtual}). @xref{Virtual Groups}.
- @item G v
- @kindex G v @r{(Group)}
- @findex gnus-group-add-to-virtual
- Add the current group to an @code{nnvirtual} group
- (@code{gnus-group-add-to-virtual}). Uses the process/prefix convention.
- @end table
- @xref{Select Methods}, for more information on the various select
- methods.
- @vindex gnus-activate-foreign-newsgroups
- If @code{gnus-activate-foreign-newsgroups} is a positive number,
- Gnus will check all foreign groups with this level or lower at startup.
- This might take quite a while, especially if you subscribe to lots of
- groups from different @sc{nntp} servers. Also @pxref{Group Levels};
- @code{gnus-activate-level} also affects activation of foreign
- newsgroups.
- @node Group Parameters
- @section Group Parameters
- @cindex group parameters
- The group parameters store information local to a particular group.
- Here's an example group parameter list:
- @example
- ((to-address . "ding@@gnus.org")
- (auto-expire . t))
- @end example
- We see that each element consists of a "dotted pair"---the thing before
- the dot is the key, while the thing after the dot is the value. All the
- parameters have this form @emph{except} local variable specs, which are
- not dotted pairs, but proper lists.
- The following group parameters can be used:
- @table @code
- @item to-address
- @cindex to-address
- Address used by when doing followups and new posts.
- @example
- (to-address . "some@@where.com")
- @end example
- This is primarily useful in mail groups that represent closed mailing
- lists---mailing lists where it's expected that everybody that writes to
- the mailing list is subscribed to it. Since using this parameter
- ensures that the mail only goes to the mailing list itself, it means
- that members won't receive two copies of your followups.
- Using @code{to-address} will actually work whether the group is foreign
- or not. Let's say there's a group on the server that is called
- @samp{fa.4ad-l}. This is a real newsgroup, but the server has gotten
- the articles from a mail-to-news gateway. Posting directly to this
- group is therefore impossible---you have to send mail to the mailing
- list address instead.
- Some parameters have corresponding customizable variables, each of which
- is an alist of regexps and values.
- @item to-list
- @cindex to-list
- Address used when doing @kbd{a} in that group.
- @example
- (to-list . "some@@where.com")
- @end example
- It is totally ignored
- when doing a followup---except that if it is present in a news group,
- you'll get mail group semantics when doing @kbd{f}.
- If you do an @kbd{a} command in a mail group and you have neither a
- @code{to-list} group parameter nor a @code{to-address} group parameter,
- then a @code{to-list} group parameter will be added automatically upon
- sending the message if @code{gnus-add-to-list} is set to @code{t}.
- @vindex gnus-add-to-list
- If you do an @kbd{a} command in a mail group and you don't have a
- @code{to-list} group parameter, one will be added automatically upon
- sending the message.
- See also @code{gnus-parameter-to-list-alist}.
- @item visible
- @cindex visible
- If the group parameter list has the element @code{(visible . t)},
- that group will always be visible in the Group buffer, regardless
- of whether it has any unread articles.
- @item broken-reply-to
- @cindex broken-reply-to
- Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
- headers in this group are to be ignored. This can be useful if you're
- reading a mailing list group where the listserv has inserted
- @code{Reply-To} headers that point back to the listserv itself. This is
- broken behavior. So there!
- @item to-group
- @cindex to-group
- Elements like @code{(to-group . "some.group.name")} means that all
- posts in that group will be sent to @code{some.group.name}.
- @item newsgroup
- @cindex newsgroup
- If you have @code{(newsgroup . t)} in the group parameter list, Gnus
- will treat all responses as if they were responses to news articles.
- This can be useful if you have a mail group that's really a mirror of a
- news group.
- @item gcc-self
- @cindex gcc-self
- If @code{(gcc-self . t)} is present in the group parameter list, newly
- composed messages will be @code{Gcc}'d to the current group. If
- @code{(gcc-self . none)} is present, no @code{Gcc:} header will be
- generated, if @code{(gcc-self . "string")} is present, this string will
- be inserted literally as a @code{gcc} header. This parameter takes
- precedence over any default @code{Gcc} rules as described later
- (@pxref{Archived Messages}).
- @item auto-expire
- @cindex auto-expire
- If the group parameter has an element that looks like @code{(auto-expire
- . t)}, all articles read will be marked as expirable. For an
- alternative approach, @pxref{Expiring Mail}.
- @item total-expire
- @cindex total-expire
- If the group parameter has an element that looks like
- @code{(total-expire . t)}, all read articles will be put through the
- expiry process, even if they are not marked as expirable. Use with
- caution. Unread, ticked and dormant articles are not eligible for
- expiry.
- See also @code{gnus-total-expirable-newsgroups}.
- @item expiry-wait
- @cindex expiry-wait
- @vindex nnmail-expiry-wait-function
- If the group parameter has an element that looks like @code{(expiry-wait
- . 10)}, this value will override any @code{nnmail-expiry-wait} and
- @code{nnmail-expiry-wait-function} when expiring expirable messages.
- The value can either be a number of days (not necessarily an integer) or
- the symbols @code{never} or @code{immediate}.
- @item score-file
- @cindex score file group parameter
- Elements that look like @code{(score-file . "file")} will make
- @file{file} into the current score file for the group in question. All
- interactive score entries will be put into this file.
- @item adapt-file
- @cindex adapt file group parameter
- Elements that look like @code{(adapt-file . "file")} will make
- @file{file} into the current adaptive file for the group in question.
- All adaptive score entries will be put into this file.
- @item admin-address
- When unsubscribing from a mailing list you should never send the
- unsubscription notice to the mailing list itself. Instead, you'd send
- messages to the administrative address. This parameter allows you to
- put the admin address somewhere convenient.
- @item display
- Elements that look like @code{(display . MODE)} say which articles to
- display on entering the group. Valid values are:
- @table @code
- @item all
- Display all articles, both read and unread.
- @item default
- Display the default visible articles, which normally includes unread and
- ticked articles.
- @end table
- @item comment
- Elements that look like @code{(comment . "This is a comment")}
- are arbitrary comments on the group. They are currently ignored by
- Gnus, but provide a place for you to store information on particular
- groups.
- @item charset
- Elements that look like @code{(charset . iso-8859-1)} will make
- @code{iso-8859-1} the default charset; that is, the charset that will be
- used for all articles that do not specify a charset.
- See also @code{gnus-group-charset-alist}.
- @item ignored-charsets
- Elements that look like @code{(ignored-charsets x-known iso-8859-1)}
- will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the
- default charset will be used for decoding articles.
- See also @code{gnus-group-ignored-charsets-alist}.
-
- @item posting-style
- You can store additional posting style information for this group only
- here (@pxref{Posting Styles}). The format is that of an entry in the
- @code{gnus-posting-styles} alist, except that there's no regexp matching
- the group name (of course). Style elements in this group parameter will
- take precedence over the ones found in @code{gnus-posting-styles}.
- For instance, if you want a funky name and signature in this group only,
- instead of hacking @code{gnus-posting-styles}, you could put something
- like this in the group parameters:
- @example
- (posting-style
- (name "Funky Name")
- (signature "Funky Signature"))
- @end example
- @item banner
- An item like @code{(banner . "regex")} causes any part of an article
- that matches the regular expression "regex" to be stripped. Instead of
- "regex", you can also use the symbol @code{signature} which strips the
- last signature or any of the elements of the alist
- @code{gnus-article-banner-alist}.
- @item (@var{variable} @var{form})
- You can use the group parameters to set variables local to the group you
- are entering. If you want to turn threading off in @samp{news.answers},
- you could put @code{(gnus-show-threads nil)} in the group parameters of
- that group. @code{gnus-show-threads} will be made into a local variable
- in the summary buffer you enter, and the form @code{nil} will be
- @code{eval}ed there.
- This can also be used as a group-specific hook function, if you like.
- If you want to hear a beep when you enter a group, you could put
- something like @code{(dummy-variable (ding))} in the parameters of that
- group. @code{dummy-variable} will be set to the result of the
- @code{(ding)} form, but who cares?
- @end table
- Use the @kbd{G p} or the @kbd{G c} command to edit group parameters of a
- group. (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c}
- presents you with a Customize-like interface. The latter helps avoid
- silly Lisp errors.) You might also be interested in reading about topic
- parameters (@pxref{Topic Parameters}).
- @node Listing Groups
- @section Listing Groups
- @cindex group listing
- These commands all list various slices of the groups available.
- @table @kbd
- @item l
- @itemx A s
- @kindex A s @r{(Group)}
- @kindex l @r{(Group)}
- @findex gnus-group-list-groups
- List all groups that have unread articles
- (@code{gnus-group-list-groups}). If the numeric prefix is used, this
- command will list only groups of level ARG and lower. By default, it
- only lists groups of level five (i. e.,
- @code{gnus-group-default-list-level}) or lower (i.e., just subscribed
- groups).
- @item L
- @itemx A u
- @kindex A u @r{(Group)}
- @kindex L @r{(Group)}
- @findex gnus-group-list-all-groups
- List all groups, whether they have unread articles or not
- (@code{gnus-group-list-all-groups}). If the numeric prefix is used,
- this command will list only groups of level ARG and lower. By default,
- it lists groups of level seven or lower (i.e., just subscribed and
- unsubscribed groups).
- @item A l
- @kindex A l @r{(Group)}
- @findex gnus-group-list-level
- List all unread groups on a specific level
- (@code{gnus-group-list-level}). If given a prefix, also list the groups
- with no unread articles.
- @item A k
- @kindex A k @r{(Group)}
- @findex gnus-group-list-killed
- List all killed groups (@code{gnus-group-list-killed}). If given a
- prefix argument, really list all groups that are available, but aren't
- currently (un)subscribed. This could entail reading the active file
- from the server.
- @item A z
- @kindex A z @r{(Group)}
- @findex gnus-group-list-zombies
- List all zombie groups (@code{gnus-group-list-zombies}).
- @item A m
- @kindex A m @r{(Group)}
- @findex gnus-group-list-matching
- List all unread, subscribed groups with names that match a regexp
- (@code{gnus-group-list-matching}).
- @item A M
- @kindex A M @r{(Group)}
- @findex gnus-group-list-all-matching
- List groups that match a regexp (@code{gnus-group-list-all-matching}).
- @item A A
- @kindex A A @r{(Group)}
- @findex gnus-group-list-active
- List absolutely all groups in the active file(s) of the
- server(s) you are connected to (@code{gnus-group-list-active}). This
- might very well take quite a while. It might actually be a better idea
- to do a @kbd{A M} to list all matching, and just give @samp{.} as the
- thing to match on. Also note that this command may list groups that
- don't exist (yet)---these will be listed as if they were killed groups.
- Take the output with some grains of salt.
- @item A a
- @kindex A a @r{(Group)}
- @findex gnus-group-apropos
- List all groups that have names that match a regexp
- (@code{gnus-group-apropos}).
- @item A d
- @kindex A d @r{(Group)}
- @findex gnus-group-description-apropos
- List all groups that have names or descriptions that match a regexp
- (@code{gnus-group-description-apropos}).
- @item A c
- @kindex A c @r{(Group)}
- @findex gnus-group-list-cached
- List all groups with cached articles (@code{gnus-group-list-cached}).
- @item A ?
- @kindex A ? @r{(Group)}
- @findex gnus-group-list-dormant
- List all groups with dormant articles (@code{gnus-group-list-dormant}).
- @end table
- @vindex gnus-permanently-visible-groups
- @cindex visible group parameter
- Groups that match the @code{gnus-permanently-visible-groups} regexp will
- always be shown, whether they have unread articles or not. You can also
- add the @code{visible} element to the group parameters in question to
- get the same effect.
- @vindex gnus-list-groups-with-ticked-articles
- Groups that have just ticked articles in it are normally listed in the
- group buffer. If @code{gnus-list-groups-with-ticked-articles} is
- @code{nil}, these groups will be treated just like totally empty
- groups. It is @code{t} by default.
- @node Sorting Groups
- @section Sorting Groups
- @cindex sorting groups
- @kindex C-c C-s @r{(Group)}
- @findex gnus-group-sort-groups
- @vindex gnus-group-sort-function
- The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
- group buffer according to the function(s) given by the
- @code{gnus-group-sort-function} variable. Available sorting functions
- include:
- @table @code
- @item gnus-group-sort-by-alphabet
- @findex gnus-group-sort-by-alphabet
- Sort the group names alphabetically. This is the default.
- @item gnus-group-sort-by-real-name
- @findex gnus-group-sort-by-real-name
- Sort the group alphabetically on the real (unprefixed) group names.
- @item gnus-group-sort-by-level
- @findex gnus-group-sort-by-level
- Sort by group level.
- @item gnus-group-sort-by-score
- @findex gnus-group-sort-by-score
- Sort by group score. @xref{Group Score}.
- @item gnus-group-sort-by-rank
- @findex gnus-group-sort-by-rank
- Sort by group score and then the group level. The level and the score
- are, when taken together, the group's @dfn{rank}. @xref{Group Score}.
- @item gnus-group-sort-by-unread
- @findex gnus-group-sort-by-unread
- Sort by number of unread articles.
- @item gnus-group-sort-by-method
- @findex gnus-group-sort-by-method
- Sort alphabetically on the select method.
- @end table
- @code{gnus-group-sort-function} can also be a list of sorting
- functions. In that case, the most significant sort key function must be
- the last one.
- There are also a number of commands for sorting directly according to
- some sorting criteria:
- @table @kbd
- @item G S a
- @kindex G S a @r{(Group)}
- @findex gnus-group-sort-groups-by-alphabet
- Sort the group buffer alphabetically by group name
- (@code{gnus-group-sort-groups-by-alphabet}).
- @item G S u
- @kindex G S u @r{(Group)}
- @findex gnus-group-sort-groups-by-unread
- Sort the group buffer by the number of unread articles
- (@code{gnus-group-sort-groups-by-unread}).
- @item G S l
- @kindex G S l @r{(Group)}
- @findex gnus-group-sort-groups-by-level
- Sort the group buffer by group level
- (@code{gnus-group-sort-groups-by-level}).
- @item G S v
- @kindex G S v @r{(Group)}
- @findex gnus-group-sort-groups-by-score
- Sort the group buffer by group score
- (@code{gnus-group-sort-groups-by-score}). @xref{Group Score}.
- @item G S r
- @kindex G S r @r{(Group)}
- @findex gnus-group-sort-groups-by-rank
- Sort the group buffer by group rank
- (@code{gnus-group-sort-groups-by-rank}). @xref{Group Score}.
- @item G S m
- @kindex G S m @r{(Group)}
- @findex gnus-group-sort-groups-by-method
- Sort the group buffer alphabetically by back end name
- (@code{gnus-group-sort-groups-by-method}).
- @end table
- All the commands below obey the process/prefix convention
- (@pxref{Process/Prefix}).
- When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these
- commands will sort in reverse order.
- You can also sort a subset of the groups:
- @table @kbd
- @item G P a
- @kindex G P a @r{(Group)}
- @findex gnus-group-sort-selected-groups-by-alphabet
- Sort the groups alphabetically by group name
- (@code{gnus-group-sort-selected-groups-by-alphabet}).
- @item G P u
- @kindex G P u @r{(Group)}
- @findex gnus-group-sort-selected-groups-by-unread
- Sort the groups by the number of unread articles
- (@code{gnus-group-sort-selected-groups-by-unread}).
- @item G P l
- @kindex G P l @r{(Group)}
- @findex gnus-group-sort-selected-groups-by-level
- Sort the groups by group level
- (@code{gnus-group-sort-selected-groups-by-level}).
- @item G P v
- @kindex G P v @r{(Group)}
- @findex gnus-group-sort-selected-groups-by-score
- Sort the groups by group score
- (@code{gnus-group-sort-selected-groups-by-score}). @xref{Group Score}.
- @item G P r
- @kindex G P r @r{(Group)}
- @findex gnus-group-sort-selected-groups-by-rank
- Sort the groups by group rank
- (@code{gnus-group-sort-selected-groups-by-rank}). @xref{Group Score}.
- @item G P m
- @kindex G P m @r{(Group)}
- @findex gnus-group-sort-selected-groups-by-method
- Sort the groups alphabetically by back end name
- (@code{gnus-group-sort-selected-groups-by-method}).
- @end table
- @node Group Maintenance
- @section Group Maintenance
- @cindex bogus groups
- @table @kbd
- @item b
- @kindex b @r{(Group)}
- @findex gnus-group-check-bogus-groups
- Find bogus groups and delete them
- (@code{gnus-group-check-bogus-groups}).
- @item F
- @kindex F @r{(Group)}
- @findex gnus-group-find-new-groups
- Find new groups and process them (@code{gnus-group-find-new-groups}).
- With 1 @kbd{C-u}, use the @code{ask-server} method to query the server
- for new groups. With 2 @kbd{C-u}'s, use most complete method possible
- to query the server for new groups, and subscribe the new groups as
- zombies.
- @item C-c C-x
- @kindex C-c C-x @r{(Group)}
- @findex gnus-group-expire-articles
- Run all expirable articles in the current group through the expiry
- process (if any) (@code{gnus-group-expire-articles}).
- @item C-c C-M-x
- @kindex C-c C-M-x @r{(Group)}
- @findex gnus-group-expire-all-groups
- Run all articles in all groups through the expiry process
- (@code{gnus-group-expire-all-groups}).
- @end table
- @node Browse Foreign Server
- @section Browse Foreign Server
- @cindex foreign servers
- @cindex browsing servers
- @table @kbd
- @item B
- @kindex B @r{(Group)}
- @findex gnus-group-browse-foreign-server
- You will be queried for a select method and a server name. Gnus will
- then attempt to contact this server and let you browse the groups there
- (@code{gnus-group-browse-foreign-server}).
- @end table
- @findex gnus-browse-mode
- A new buffer with a list of available groups will appear. This buffer
- will use the @code{gnus-browse-mode}. This buffer looks a bit (well,
- a lot) like a normal group buffer.
- Here's a list of keystrokes available in the browse mode:
- @table @kbd
- @item n
- @kindex n (Browse)
- @findex gnus-group-next-group
- Go to the next group (@code{gnus-group-next-group}).
- @item p
- @kindex p (Browse)
- @findex gnus-group-prev-group
- Go to the previous group (@code{gnus-group-prev-group}).
- @item @key{SPC}
- @kindex @key{SPC} (Browse)
- @findex gnus-browse-read-group
- Enter the current group and display the first article
- (@code{gnus-browse-read-group}).
- @item @key{RET}
- @kindex @key{RET} (Browse)
- @findex gnus-browse-select-group
- Enter the current group (@code{gnus-browse-select-group}).
- @item u
- @kindex u (Browse)
- @findex gnus-browse-unsubscribe-current-group
- Unsubscribe to the current group, or, as will be the case here,
- subscribe to it (@code{gnus-browse-unsubscribe-current-group}).
- @item l
- @itemx q
- @kindex q (Browse)
- @kindex l (Browse)
- @findex gnus-browse-exit
- Exit browse mode (@code{gnus-browse-exit}).
- @item ?
- @kindex ? (Browse)
- @findex gnus-browse-describe-briefly
- Describe browse mode briefly (well, there's not much to describe, is
- there) (@code{gnus-browse-describe-briefly}).
- @end table
- @node Exiting Gnus
- @section Exiting Gnus
- @cindex exiting Gnus
- Yes, Gnus is ex(c)iting.
- @table @kbd
- @item z
- @kindex z @r{(Group)}
- @findex gnus-group-suspend
- Suspend Gnus (@code{gnus-group-suspend}). This doesn't really exit Gnus,
- but it kills all buffers except the Group buffer. I'm not sure why this
- is a gain, but then who am I to judge?
- @item q
- @kindex q @r{(Group)}
- @findex gnus-group-exit
- @c @icon{gnus-group-exit}
- Quit Gnus (@code{gnus-group-exit}).
- @item Q
- @kindex Q @r{(Group)}
- @findex gnus-group-quit
- Quit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
- The dribble file will be saved, though (@pxref{Auto Save}).
- @end table
- @vindex gnus-exit-gnus-hook
- @vindex gnus-suspend-gnus-hook
- @code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
- @code{gnus-exit-gnus-hook} is called when you quit Gnus, while
- @code{gnus-after-exiting-gnus-hook} is called as the final item when
- exiting Gnus.
- @findex gnus-unload
- @cindex unloading
- If you wish to completely unload Gnus and all its adherents, you can use
- the @code{gnus-unload} command. This command is also very handy when
- trying to customize meta-variables.
- Note:
- @quotation
- Miss Lisa Cannifax, while sitting in English class, felt her feet go
- numbly heavy and herself fall into a hazy trance as the boy sitting
- behind her drew repeated lines with his pencil across the back of her
- plastic chair.
- @end quotation
- @node Group Topics
- @section Group Topics
- @cindex topics
- If you read lots and lots of groups, it might be convenient to group
- them hierarchically according to topics. You put your Emacs groups over
- here, your sex groups over there, and the rest (what, two groups or so?)
- you put in some misc section that you never bother with anyway. You can
- even group the Emacs sex groups as a sub-topic to either the Emacs
- groups or the sex groups---or both! Go wild!
- @iftex
- @iflatex
- \gnusfigure{Group Topics}{400}{
- \put(75,50){\epsfig{figure=tmp/group-topic.ps,height=9cm}}
- }
- @end iflatex
- @end iftex
- Here's an example:
- @example
- Gnus
- Emacs -- I wuw it!
- 3: comp.emacs
- 2: alt.religion.emacs
- Naughty Emacs
- 452: alt.sex.emacs
- 0: comp.talk.emacs.recovery
- Misc
- 8: comp.binaries.fractals
- 13: comp.sources.unix
- @end example
- @findex gnus-topic-mode
- @kindex t @r{(Group)}
- To get this @emph{fab} functionality you simply turn on (ooh!) the
- @code{gnus-topic} minor mode---type @kbd{t} in the group buffer. (This
- is a toggling command.)
- Go ahead, just try it. I'll still be here when you get back. La de
- dum... Nice tune, that... la la la... What, you're back? Yes, and now
- press @kbd{l}. There. All your groups are now listed under
- @samp{misc}. Doesn't that make you feel all warm and fuzzy? Hot and
- bothered?
- If you want this permanently enabled, you should add that minor mode to
- the hook for the group mode:
- @lisp
- (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
- @end lisp
- @menu
- * Topic Variables:: How to customize the topics the Lisp Way.
- * Topic Commands:: Interactive E-Z commands.
- * Topic Sorting:: Sorting each topic individually.
- * Topic Topology:: A map of the world.
- * Topic Parameters:: Parameters that apply to all groups in a topic.
- @end menu
- @node Topic Variables
- @subsection Topic Variables
- @cindex topic variables
- Now, if you select a topic, it will fold/unfold that topic, which is
- really neat, I think.
- @vindex gnus-topic-line-format
- The topic lines themselves are created according to the
- @code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
- Valid elements are:
- @table @samp
- @item i
- Indentation.
- @item n
- Topic name.
- @item v
- Visibility.
- @item l
- Level.
- @item g
- Number of groups in the topic.
- @item a
- Number of unread articles in the topic.
- @item A
- Number of unread articles in the topic and all its subtopics.
- @end table
- @vindex gnus-topic-indent-level
- Each sub-topic (and the groups in the sub-topics) will be indented with
- @code{gnus-topic-indent-level} times the topic level number of spaces.
- The default is 2.
- @vindex gnus-topic-mode-hook
- @code{gnus-topic-mode-hook} is called in topic minor mode buffers.
- @vindex gnus-topic-display-empty-topics
- The @code{gnus-topic-display-empty-topics} says whether to display even
- topics that have no unread articles in them. The default is @code{t}.
- @node Topic Commands
- @subsection Topic Commands
- @cindex topic commands
- When the topic minor mode is turned on, a new @kbd{T} submap will be
- available. In addition, a few of the standard keys change their
- definitions slightly.
- @table @kbd
- @item T n
- @kindex T n (Topic)
- @findex gnus-topic-create-topic
- Prompt for a new topic name and create it
- (@code{gnus-topic-create-topic}).
- @item T m
- @kindex T m (Topic)
- @findex gnus-topic-move-group
- Move the current group to some other topic
- (@code{gnus-topic-move-group}). This command uses the process/prefix
- convention (@pxref{Process/Prefix}).
- @item T j
- @kindex T j (Topic)
- @findex gnus-topic-jump-to-topic
- Go to a topic (@code{gnus-topic-jump-to-topic}).
- @item T c
- @kindex T c (Topic)
- @findex gnus-topic-copy-group
- Copy the current group to some other topic
- (@code{gnus-topic-copy-group}). This command uses the process/prefix
- convention (@pxref{Process/Prefix}).
- @item T h
- @kindex T h (Topic)
- @findex gnus-topic-hide-topic
- Hide the current topic (@code{gnus-topic-hide-topic}). If given
- a prefix, hide the topic permanently.
- @item T s
- @kindex T s (Topic)
- @findex gnus-topic-show-topic
- Show the current topic (@code{gnus-topic-show-topic}). If given
- a prefix, show the topic permanently.
- @item T D
- @kindex T D (Topic)
- @findex gnus-topic-remove-group
- Remove a group from the current topic (@code{gnus-topic-remove-group}).
- This command is mainly useful if you have the same group in several
- topics and wish to remove it from one of the topics. You may also
- remove a group from all topics, but in that case, Gnus will add it to
- the root topic the next time you start Gnus. In fact, all new groups
- (which, naturally, don't belong to any topic) will show up in the root
- topic.
- This command uses the process/prefix convention
- (@pxref{Process/Prefix}).
- @item T M
- @kindex T M (Topic)
- @findex gnus-topic-move-matching
- Move all groups that match some regular expression to a topic
- (@code{gnus-topic-move-matching}).
- @item T C
- @kindex T C (Topic)
- @findex gnus-topic-copy-matching
- Copy all groups that match some regular expression to a topic
- (@code{gnus-topic-copy-matching}).
- @item T H
- @kindex T H (Topic)
- @findex gnus-topic-toggle-display-empty-topics
- Toggle hiding empty topics
- (@code{gnus-topic-toggle-display-empty-topics}).
- @item T #
- @kindex T # (Topic)
- @findex gnus-topic-mark-topic
- Mark all groups in the current topic with the process mark
- (@code{gnus-topic-mark-topic}).
- @item T M-#
- @kindex T M-# (Topic)
- @findex gnus-topic-unmark-topic
- Remove the process mark from all groups in the current topic
- (@code{gnus-topic-unmark-topic}).
- @item T TAB
- @itemx TAB
- @kindex T TAB (Topic)
- @kindex TAB (Topic)
- @findex gnus-topic-indent
- ``Indent'' the current topic so that it becomes a sub-topic of the
- previous topic (@code{gnus-topic-indent}). If given a prefix,
- ``un-indent'' the topic instead.
- @item M-TAB
- @kindex M-TAB (Topic)
- @findex gnus-topic-unindent
- ``Un-indent'' the current topic so that it becomes a sub-topic of the
- parent of its current parent (@code{gnus-topic-unindent}).
- @item @key{RET}
- @kindex @key{RET} (Topic)
- @findex gnus-topic-select-group
- @itemx @key{SPC}
- Either select a group or fold a topic (@code{gnus-topic-select-group}).
- When you perform this command on a group, you'll enter the group, as
- usual. When done on a topic line, the topic will be folded (if it was
- visible) or unfolded (if it was folded already). So it's basically a
- toggling command on topics. In addition, if you give a numerical
- prefix, group on that level (and lower) will be displayed.
- @item C-c C-x
- @kindex C-c C-x (Topic)
- @findex gnus-topic-expire-articles
- Run all expirable articles in the current group or topic through the expiry
- process (if any) (@code{gnus-topic-expire-articles}).
- @item C-k
- @kindex C-k (Topic)
- @findex gnus-topic-kill-group
- Kill a group or topic (@code{gnus-topic-kill-group}). All groups in the
- topic will be removed along with the topic.
- @item C-y
- @kindex C-y (Topic)
- @findex gnus-topic-yank-group
- Yank the previously killed group or topic
- (@code{gnus-topic-yank-group}). Note that all topics will be yanked
- before all groups.
- @item T r
- @kindex T r (Topic)
- @findex gnus-topic-rename
- Rename a topic (@code{gnus-topic-rename}).
- @item T @key{DEL}
- @kindex T @key{DEL} (Topic)
- @findex gnus-topic-delete
- Delete an empty topic (@code{gnus-topic-delete}).
- @item A T
- @kindex A T (Topic)
- @findex gnus-topic-list-active
- List all groups that Gnus knows about in a topics-ified way
- (@code{gnus-topic-list-active}).
- @item G p
- @kindex G p (Topic)
- @findex gnus-topic-edit-parameters
- @cindex group parameters
- @cindex topic parameters
- @cindex parameters
- Edit the topic parameters (@code{gnus-topic-edit-parameters}).
- @xref{Topic Parameters}.
- @end table
- @node Topic Sorting
- @subsection Topic Sorting
- @cindex topic sorting
- You can sort the groups in each topic individually with the following
- commands:
- @table @kbd
- @item T S a
- @kindex T S a (Topic)
- @findex gnus-topic-sort-groups-by-alphabet
- Sort the current topic alphabetically by group name
- (@code{gnus-topic-sort-groups-by-alphabet}).
- @item T S u
- @kindex T S u (Topic)
- @findex gnus-topic-sort-groups-by-unread
- Sort the current topic by the number of unread articles
- (@code{gnus-topic-sort-groups-by-unread}).
- @item T S l
- @kindex T S l (Topic)
- @findex gnus-topic-sort-groups-by-level
- Sort the current topic by group level
- (@code{gnus-topic-sort-groups-by-level}).
- @item T S v
- @kindex T S v (Topic)
- @findex gnus-topic-sort-groups-by-score
- Sort the current topic by group score
- (@code{gnus-topic-sort-groups-by-score}). @xref{Group Score}.
- @item T S r
- @kindex T S r (Topic)
- @findex gnus-topic-sort-groups-by-rank
- Sort the current topic by group rank
- (@code{gnus-topic-sort-groups-by-rank}). @xref{Group Score}.
- @item T S m
- @kindex T S m (Topic)
- @findex gnus-topic-sort-groups-by-method
- Sort the current topic alphabetically by back end name
- (@code{gnus-topic-sort-groups-by-method}).
- @end table
- @xref{Sorting Groups}, for more information about group sorting.
- @node Topic Topology
- @subsection Topic Topology
- @cindex topic topology
- @cindex topology
- So, let's have a look at an example group buffer:
- @example
- Gnus
- Emacs -- I wuw it!
- 3: comp.emacs
- 2: alt.religion.emacs
- Naughty Emacs
- 452: alt.sex.emacs
- 0: comp.talk.emacs.recovery
- Misc
- 8: comp.binaries.fractals
- 13: comp.sources.unix
- @end example
- So, here we have one top-level topic (@samp{Gnus}), two topics under
- that, and one sub-topic under one of the sub-topics. (There is always
- just one (1) top-level topic). This topology can be expressed as
- follows:
- @lisp
- (("Gnus" visible)
- (("Emacs -- I wuw it!" visible)
- (("Naughty Emacs" visible)))
- (("Misc" visible)))
- @end lisp
- @vindex gnus-topic-topology
- This is in fact how the variable @code{gnus-topic-topology} would look
- for the display above. That variable is saved in the @file{.newsrc.eld}
- file, and shouldn't be messed with manually---unless you really want
- to. Since this variable is read from the @file{.newsrc.eld} file,
- setting it in any other startup files will have no effect.
- This topology shows what topics are sub-topics of what topics (right),
- and which topics are visible. Two settings are currently
- allowed---@code{visible} and @code{invisible}.
- @node Topic Parameters
- @subsection Topic Parameters
- @cindex topic parameters
- All groups in a topic will inherit group parameters from the parent (and
- ancestor) topic parameters. All valid group parameters are valid topic
- parameters (@pxref{Group Parameters}).
- In addition, the following parameters are only valid as topic
- parameters:
- @table @code
- @item subscribe
- When subscribing new groups by topic (@pxref{Subscription Methods}), the
- @code{subscribe} topic parameter says what groups go in what topic. Its
- value should be a regexp to match the groups that should go in that
- topic.
- @end table
- Group parameters (of course) override topic parameters, and topic
- parameters in sub-topics override topic parameters in super-topics. You
- know. Normal inheritance rules. (@dfn{Rules} is here a noun, not a
- verb, although you may feel free to disagree with me here.)
- @example
- Gnus
- Emacs
- 3: comp.emacs
- 2: alt.religion.emacs
- 452: alt.sex.emacs
- Relief
- 452: alt.sex.emacs
- 0: comp.talk.emacs.recovery
- Misc
- 8: comp.binaries.fractals
- 13: comp.sources.unix
- 452: alt.sex.emacs
- @end example
- The @samp{Emacs} topic has the topic parameter @code{(score-file
- . "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
- @code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
- topic parameter @code{(score-file . "emacs.SCORE")}. In addition,
- @* @samp{alt.religion.emacs} has the group parameter @code{(score-file
- . "religion.SCORE")}.
- Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
- will get the @file{relief.SCORE} home score file. If you enter the same
- group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
- score file. If you enter the group @samp{alt.religion.emacs}, you'll
- get the @file{religion.SCORE} home score file.
- This seems rather simple and self-evident, doesn't it? Well, yes. But
- there are some problems, especially with the @code{total-expiry}
- parameter. Say you have a mail group in two topics; one with
- @code{total-expiry} and one without. What happens when you do @kbd{M-x
- gnus-expire-all-expirable-groups}? Gnus has no way of telling which one
- of these topics you mean to expire articles from, so anything may
- happen. In fact, I hereby declare that it is @dfn{undefined} what
- happens. You just have to be careful if you do stuff like that.
- @node Misc Group Stuff
- @section Misc Group Stuff
- @menu
- * Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
- * Group Information:: Information and help on groups and Gnus.
- * Group Timestamp:: Making Gnus keep track of when you last read a group.
- * File Commands:: Reading and writing the Gnus files.
- @end menu
- @table @kbd
- @item ^
- @kindex ^ @r{(Group)}
- @findex gnus-group-enter-server-mode
- Enter the server buffer (@code{gnus-group-enter-server-mode}).
- @xref{The Server Buffer}.
- @item a
- @kindex a @r{(Group)}
- @findex gnus-group-post-news
- Post an article to a group (@code{gnus-group-post-news}). If given a
- prefix, the current group name will be used as the default.
- @item m
- @kindex m @r{(Group)}
- @findex gnus-group-mail
- Mail a message somewhere (@code{gnus-group-mail}).
- @end table
- Variables for the group buffer:
- @table @code
- @item gnus-group-mode-hook
- @vindex gnus-group-mode-hook
- is called after the group buffer has been
- created.
- @item gnus-group-prepare-hook
- @vindex gnus-group-prepare-hook
- is called after the group buffer is
- generated. It may be used to modify the buffer in some strange,
- unnatural way.
- @item gnus-group-prepared-hook
- @vindex gnus-group-prepare-hook
- is called as the very last thing after the group buffer has been
- generated. It may be used to move point around, for instance.
- @item gnus-permanently-visible-groups
- @vindex gnus-permanently-visible-groups
- Groups matching this regexp will always be listed in the group buffer,
- whether they are empty or not.
- @item gnus-group-name-charset-method-alist
- @vindex gnus-group-name-charset-method-alist
- An alist of method and the charset for group names. It is used to show
- non-ASCII group names.
- For example:
- @lisp
- (setq gnus-group-name-charset-method-alist
- '(((nntp "news.com.cn") . cn-gb-2312)))
- @end lisp
- @item gnus-group-name-charset-group-alist
- @vindex gnus-group-name-charset-group-alist
- An alist of regexp of group name and the charset for group names.
- It is used to show non-ASCII group names.
- For example:
- @lisp
- (setq gnus-group-name-charset-group-alist
- '(("\\.com\\.cn:" . cn-gb-2312)))
- @end lisp
- @end table
- @node Scanning New Messages
- @subsection Scanning New Messages
- @cindex new messages
- @cindex scanning new news
- @table @kbd
- @item g
- @kindex g @r{(Group)}
- @findex gnus-group-get-new-news
- @c @icon{gnus-group-get-new-news}
- Check the server(s) for new articles. If the numerical prefix is used,
- this command will check only groups of level @var{arg} and lower
- (@code{gnus-group-get-new-news}). If given a non-numerical prefix, this
- command will force a total re-reading of the active file(s) from the
- back end(s).
- @item M-g
- @kindex M-g @r{(Group)}
- @findex gnus-group-get-new-news-this-group
- @vindex gnus-goto-next-group-when-activating
- @c @icon{gnus-group-get-new-news-this-group}
- Check whether new articles have arrived in the current group
- (@code{gnus-group-get-new-news-this-group}).
- @code{gnus-goto-next-group-when-activating} says whether this command is
- to move point to the next group or not. It is @code{t} by default.
- @findex gnus-activate-all-groups
- @cindex activating groups
- @item C-c M-g
- @kindex C-c M-g @r{(Group)}
- Activate absolutely all groups (@code{gnus-activate-all-groups}).
- @item R
- @kindex R @r{(Group)}
- @cindex restarting
- @findex gnus-group-restart
- Restart Gnus (@code{gnus-group-restart}). This saves the @file{.newsrc}
- file(s), closes the connection to all servers, clears up all run-time
- Gnus variables, and then starts Gnus all over again.
- @end table
- @vindex gnus-get-new-news-hook
- @code{gnus-get-new-news-hook} is run just before checking for new news.
- @vindex gnus-after-getting-new-news-hook
- @code{gnus-after-getting-new-news-hook} is run after checking for new
- news.
- @node Group Information
- @subsection Group Information
- @cindex group information
- @cindex information on groups
- @table @kbd
- @item H f
- @kindex H f @r{(Group)}
- @findex gnus-group-fetch-faq
- @vindex gnus-group-faq-directory
- @cindex FAQ
- @cindex ange-ftp
- Try to fetch the FAQ for the current group
- (@code{gnus-group-fetch-faq}). Gnus will try to get the FAQ from
- @code{gnus-group-faq-directory}, which is usually a directory on a
- remote machine. This variable can also be a list of directories. In
- that case, giving a prefix to this command will allow you to choose
- between the various sites. @code{ange-ftp} (or @code{efs}) will be used
- for fetching the file.
- If fetching from the first site is unsuccessful, Gnus will attempt to go
- through @code{gnus-group-faq-directory} and try to open them one by one.
- @item H d
- @itemx C-c C-d
- @c @icon{gnus-group-describe-group}
- @kindex H d @r{(Group)}
- @kindex C-c C-d @r{(Group)}
- @cindex describing groups
- @cindex group description
- @findex gnus-group-describe-group
- Describe the current group (@code{gnus-group-describe-group}). If given
- a prefix, force Gnus to re-read the description from the server.
- @item M-d
- @kindex M-d @r{(Group)}
- @findex gnus-group-describe-all-groups
- Describe all groups (@code{gnus-group-describe-all-groups}). If given a
- prefix, force Gnus to re-read the description file from the server.
- @item H v
- @itemx V
- @kindex V @r{(Group)}
- @kindex H v @r{(Group)}
- @cindex version
- @findex gnus-version
- Display current Gnus version numbers (@code{gnus-version}).
- @item ?
- @kindex ? @r{(Group)}
- @findex gnus-group-describe-briefly
- Give a very short help message (@code{gnus-group-describe-briefly}).
- @item C-c C-i
- @kindex C-c C-i @r{(Group)}
- @cindex info
- @cindex manual
- @findex gnus-info-find-node
- Go to the Gnus info node (@code{gnus-info-find-node}).
- @end table
- @node Group Timestamp
- @subsection Group Timestamp
- @cindex timestamps
- @cindex group timestamps
- It can be convenient to let Gnus keep track of when you last read a
- group. To set the ball rolling, you should add
- @code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
- @lisp
- (add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
- @end lisp
- After doing this, each time you enter a group, it'll be recorded.
- This information can be displayed in various ways---the easiest is to
- use the @samp{%d} spec in the group line format:
- @lisp
- (setq gnus-group-line-format
- "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
- @end lisp
- This will result in lines looking like:
- @example
- * 0: mail.ding 19961002T012943
- 0: custom 19961002T012713
- @end example
- As you can see, the date is displayed in compact ISO 8601 format. This
- may be a bit too much, so to just display the date, you could say
- something like:
- @lisp
- (setq gnus-group-line-format
- "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
- @end lisp
- @node File Commands
- @subsection File Commands
- @cindex file commands
- @table @kbd
- @item r
- @kindex r @r{(Group)}
- @findex gnus-group-read-init-file
- @vindex gnus-init-file
- @cindex reading init file
- Re-read the init file (@code{gnus-init-file}, which defaults to
- @file{~/.gnus}) (@code{gnus-group-read-init-file}).
- @item s
- @kindex s @r{(Group)}
- @findex gnus-group-save-newsrc
- @cindex saving .newsrc
- Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
- (@code{gnus-group-save-newsrc}). If given a prefix, force saving the
- file(s) whether Gnus thinks it is necessary or not.
- @c @item Z
- @c @kindex Z @r{(Group)}
- @c @findex gnus-group-clear-dribble
- @c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
- @end table
- @node The Summary Buffer
- @chapter The Summary Buffer
- @cindex summary buffer
- A line for each article is displayed in the summary buffer. You can
- move around, read articles, post articles and reply to articles.
- The most common way to a summary buffer is to select a group from the
- group buffer (@pxref{Selecting a Group}).
- You can have as many summary buffers open as you wish.
- @menu
- * Summary Buffer Format:: Deciding how the summary buffer is to look.
- * Summary Maneuvering:: Moving around the summary buffer.
- * Choosing Articles:: Reading articles.
- * Paging the Article:: Scrolling the current article.
- * Reply Followup and Post:: Posting articles.
- * Marking Articles:: Marking articles as read, expirable, etc.
- * Limiting:: You can limit the summary buffer.
- * Threading:: How threads are made.
- * Sorting:: How articles and threads are sorted.
- * Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
- * Article Caching:: You may store articles in a cache.
- * Persistent Articles:: Making articles expiry-resistant.
- * Article Backlog:: Having already read articles hang around.
- * Saving Articles:: Ways of customizing article saving.
- * Decoding Articles:: Gnus can treat series of (uu)encoded articles.
- * Article Treatment:: The article buffer can be mangled at will.
- * MIME Commands:: Doing MIMEy things with the articles.
- * Charsets:: Character set issues.
- * Article Commands:: Doing various things with the article buffer.
- * Summary Sorting:: Sorting the summary buffer in various ways.
- * Finding the Parent:: No child support? Get the parent.
- * Alternative Approaches:: Reading using non-default summaries.
- * Tree Display:: A more visual display of threads.
- * Mail Group Commands:: Some commands can only be used in mail groups.
- * Various Summary Stuff:: What didn't fit anywhere else.
- * Exiting the Summary Buffer:: Returning to the Group buffer,
- or reselecting the current group.
- * Crosspost Handling:: How crossposted articles are dealt with.
- * Duplicate Suppression:: An alternative when crosspost handling fails.
- @end menu
- @node Summary Buffer Format
- @section Summary Buffer Format
- @cindex summary buffer format
- @iftex
- @iflatex
- \gnusfigure{The Summary Buffer}{180}{
- \put(0,0){\epsfig{figure=tmp/summary.ps,width=7.5cm}}
- \put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-article.ps,width=7.5cm}}}
- }
- @end iflatex
- @end iftex
- @menu
- * Summary Buffer Lines:: You can specify how summary lines should look.
- * To From Newsgroups:: How to not display your own name.
- * Summary Buffer Mode Line:: You can say how the mode line should look.
- * Summary Highlighting:: Making the summary buffer all pretty and nice.
- @end menu
- @findex mail-extract-address-components
- @findex gnus-extract-address-components
- @vindex gnus-extract-address-components
- Gnus will use the value of the @code{gnus-extract-address-components}
- variable as a function for getting the name and address parts of a
- @code{From} header. Two pre-defined functions exist:
- @code{gnus-extract-address-components}, which is the default, quite
- fast, and too simplistic solution; and
- @code{mail-extract-address-components}, which works very nicely, but is
- slower. The default function will return the wrong answer in 5% of the
- cases. If this is unacceptable to you, use the other function instead:
- @lisp
- (setq gnus-extract-address-components
- 'mail-extract-address-components)
- @end lisp
- @vindex gnus-summary-same-subject
- @code{gnus-summary-same-subject} is a string indicating that the current
- article has the same subject as the previous. This string will be used
- with those specs that require it. The default is @code{""}.
- @node Summary Buffer Lines
- @subsection Summary Buffer Lines
- @vindex gnus-summary-line-format
- You can change the format of the lines in the summary buffer by changing
- the @code{gnus-summary-line-format} variable. It works along the same
- lines as a normal @code{format} string, with some extensions
- (@pxref{Formatting Variables}).
- The default string is @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n}.
- The following format specification characters are understood:
- @table @samp
- @item N
- Article number.
- @item S
- Subject string. List identifiers stripped,
- @code{gnus-list-identifies}. @xref{Article Hiding}.
- @item s
- Subject if the article is the root of the thread or the previous article
- had a different subject, @code{gnus-summary-same-subject} otherwise.
- (@code{gnus-summary-same-subject} defaults to @code{""}.)
- @item F
- Full @code{From} header.
- @item n
- The name (from the @code{From} header).
- @item f
- The name, code @code{To} header or the @code{Newsgroups} header
- (@pxref{To From Newsgroups}).
- @item a
- The name (from the @code{From} header). This differs from the @code{n}
- spec in that it uses the function designated by the
- @code{gnus-extract-address-components} variable, which is slower, but
- may be more thorough.
- @item A
- The address (from the @code{From} header). This works the same way as
- the @code{a} spec.
- @item L
- Number of lines in the article.
- @item c
- Number of characters in the article. This specifier is not supported in some
- methods (like nnfolder).
- @item I
- Indentation based on thread level (@pxref{Customizing Threading}).
- @item T
- Nothing if the article is a root and lots of spaces if it isn't (it
- pushes everything after it off the screen).
- @item [
- Opening bracket, which is normally @samp{[}, but can also be @samp{<}
- for adopted articles (@pxref{Customizing Threading}).
- @item ]
- Closing bracket, which is normally @samp{]}, but can also be @samp{>}
- for adopted articles.
- @item >
- One space for each thread level.
- @item <
- Twenty minus thread level spaces.
- @item U
- Unread.
- @item R
- This misleadingly named specifier is the @dfn{secondary mark}. This
- mark will say whether the article has been replied to, has been cached,
- or has been saved.
- @item i
- Score as a number (@pxref{Scoring}).
- @item z
- @vindex gnus-summary-zcore-fuzz
- Zcore, @samp{+} if above the default level and @samp{-} if below the
- default level. If the difference between
- @code{gnus-summary-default-score} and the score is less than
- @code{gnus-summary-zcore-fuzz}, this spec will not be used.
- @item V
- Total thread score.
- @item x
- @code{Xref}.
- @item D
- @code{Date}.
- @item d
- The @code{Date} in @code{DD-MMM} format.
- @item o
- The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.
- @item M
- @code{Message-ID}.
- @item r
- @code{References}.
- @item t
- Number of articles in the current sub-thread. Using this spec will slow
- down summary buffer generation somewhat.
- @item e
- An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
- article has any children.
- @item P
- The line number.
- @item O
- Download mark.
- @item u
- User defined specifier. The next character in the format string should
- be a letter. Gnus will call the function
- @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
- following @samp{%u}. The function will be passed the current header as
- argument. The function should return a string, which will be inserted
- into the summary just like information from any other summary specifier.
- @end table
- The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
- have to be handled with care. For reasons of efficiency, Gnus will
- compute what column these characters will end up in, and ``hard-code''
- that. This means that it is invalid to have these specs after a
- variable-length spec. Well, you might not be arrested, but your summary
- buffer will look strange, which is bad enough.
- The smart choice is to have these specs as far to the left as possible.
- (Isn't that the case with everything, though? But I digress.)
- This restriction may disappear in later versions of Gnus.
- @node To From Newsgroups
- @subsection To From Newsgroups
- @cindex To
- @cindex Newsgroups
- In some groups (particularly in archive groups), the @code{From} header
- isn't very interesting, since all the articles there are written by
- you. To display the information in the @code{To} or @code{Newsgroups}
- headers instead, you need to decide three things: What information to
- gather; where to display it; and when to display it.
- @enumerate
- @item
- @vindex gnus-extra-headers
- The reading of extra header information is controlled by the
- @code{gnus-extra-headers}. This is a list of header symbols. For
- instance:
- @lisp
- (setq gnus-extra-headers
- '(To Newsgroups X-Newsreader))
- @end lisp
- This will result in Gnus trying to obtain these three headers, and
- storing it in header structures for later easy retrieval.
- @item
- @findex gnus-extra-header
- The value of these extra headers can be accessed via the
- @code{gnus-extra-header} function. Here's a format line spec that will
- access the @code{X-Newsreader} header:
- @example
- "%~(form (gnus-extra-header 'X-Newsreader))@@"
- @end example
- @item
- @vindex gnus-ignored-from-addresses
- The @code{gnus-ignored-from-addresses} variable says when the @samp{%f}
- summary line spec returns the @code{To}, @code{Newsreader} or
- @code{From} header. If this regexp matches the contents of the
- @code{From} header, the value of the @code{To} or @code{Newsreader}
- headers are used instead.
- @end enumerate
- @vindex nnmail-extra-headers
- A related variable is @code{nnmail-extra-headers}, which controls when
- to include extra headers when generating overview (@sc{nov}) files. If
- you have old overview files, you should regenerate them after changing
- this variable.
- @vindex gnus-summary-line-format
- You also have to instruct Gnus to display the data by changing the
- @code{%n} spec to the @code{%f} spec in the
- @code{gnus-summary-line-format} variable.
- In summary, you'd typically do something like the following:
- @lisp
- (setq gnus-extra-headers
- '(To Newsgroups))
- (setq nnmail-extra-headers gnus-extra-headers)
- (setq gnus-summary-line-format
- "%U%R%z%I%(%[%4L: %-20,20f%]%) %s\n")
- (setq gnus-ignored-from-addresses
- "Your Name Here")
- @end lisp
- Now, this is mostly useful for mail groups, where you have control over
- the @sc{nov} files that are created. However, if you can persuade your
- nntp admin to add:
- @example
- Newsgroups:full
- @end example
- to the end of her @file{overview.fmt} file, then you can use that just
- as you would the extra headers from the mail groups.
- @node Summary Buffer Mode Line
- @subsection Summary Buffer Mode Line
- @vindex gnus-summary-mode-line-format
- You can also change the format of the summary mode bar (@pxref{Mode Line
- Formatting}). Set @code{gnus-summary-mode-line-format} to whatever you
- like. The default is @samp{Gnus: %%b [%A] %Z}.
- Here are the elements you can play with:
- @table @samp
- @item G
- Group name.
- @item p
- Unprefixed group name.
- @item A
- Current article number.
- @item z
- Current article score.
- @item V
- Gnus version.
- @item U
- Number of unread articles in this group.
- @item e
- Number of unread articles in this group that aren't displayed in the
- summary buffer.
- @item Z
- A string with the number of unread and unselected articles represented
- either as @samp{<%U(+%e) more>} if there are both unread and unselected
- articles, and just as @samp{<%U more>} if there are just unread articles
- and no unselected ones.
- @item g
- Shortish group name. For instance, @samp{rec.arts.anime} will be
- shortened to @samp{r.a.anime}.
- @item S
- Subject of the current article.
- @item u
- User-defined spec (@pxref{User-Defined Specs}).
- @item s
- Name of the current score file (@pxref{Scoring}).
- @item d
- Number of dormant articles (@pxref{Unread Articles}).
- @item t
- Number of ticked articles (@pxref{Unread Articles}).
- @item r
- Number of articles that have been marked as read in this session.
- @item E
- Number of articles expunged by the score files.
- @end table
- @node Summary Highlighting
- @subsection Summary Highlighting
- @table @code
- @item gnus-visual-mark-article-hook
- @vindex gnus-visual-mark-article-hook
- This hook is run after selecting an article. It is meant to be used for
- highlighting the article in some way. It is not run if
- @code{gnus-visual} is @code{nil}.
- @item gnus-summary-update-hook
- @vindex gnus-summary-update-hook
- This hook is called when a summary line is changed. It is not run if
- @code{gnus-visual} is @code{nil}.
- @item gnus-summary-selected-face
- @vindex gnus-summary-selected-face
- This is the face (or @dfn{font} as some people call it) used to
- highlight the current article in the summary buffer.
- @item gnus-summary-highlight
- @vindex gnus-summary-highlight
- Summary lines are highlighted according to this variable, which is a
- list where the elements are of the format @code{(@var{form}
- . @var{face})}. If you would, for instance, like ticked articles to be
- italic and high-scored articles to be bold, you could set this variable
- to something like
- @lisp
- (((eq mark gnus-ticked-mark) . italic)
- ((> score default) . bold))
- @end lisp
- As you may have guessed, if @var{form} returns a non-@code{nil} value,
- @var{face} will be applied to the line.
- @end table
- @node Summary Maneuvering
- @section Summary Maneuvering
- @cindex summary movement
- All the straight movement commands understand the numeric prefix and
- behave pretty much as you'd expect.
- None of these commands select articles.
- @table @kbd
- @item G M-n
- @itemx M-n
- @kindex M-n @r{(Summary)}
- @kindex G M-n @r{(Summary)}
- @findex gnus-summary-next-unread-subject
- Go to the next summary line of an unread article
- (@code{gnus-summary-next-unread-subject}).
- @item G M-p
- @itemx M-p
- @kindex M-p @r{(Summary)}
- @kindex G M-p @r{(Summary)}
- @findex gnus-summary-prev-unread-subject
- Go to the previous summary line of an unread article
- (@code{gnus-summary-prev-unread-subject}).
- @item G g
- @kindex G g @r{(Summary)}
- @findex gnus-summary-goto-subject
- Ask for an article number and then go to the summary line of that article
- without displaying the article (@code{gnus-summary-goto-subject}).
- @end table
- If Gnus asks you to press a key to confirm going to the next group, you
- can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
- buffer, searching for the next group to read without actually returning
- to the group buffer.
- Variables related to summary movement:
- @table @code
- @vindex gnus-auto-select-next
- @item gnus-auto-select-next
- If you issue one of the movement commands (like @kbd{n}) and there are
- no more unread articles after the current one, Gnus will offer to go to
- the next group. If this variable is @code{t} and the next group is
- empty, Gnus will exit summary mode and return to the group buffer. If
- this variable is neither @code{t} nor @code{nil}, Gnus will select the
- next group, no matter whether it has any unread articles or not. As a
- special case, if this variable is @code{quietly}, Gnus will select the
- next group without asking for confirmation. If this variable is
- @code{almost-quietly}, the same will happen only if you are located on
- the last article in the group. Finally, if this variable is
- @code{slightly-quietly}, the @kbd{Z n} command will go to the next group
- without confirmation. Also @pxref{Group Levels}.
- @item gnus-auto-select-same
- @vindex gnus-auto-select-same
- If non-@code{nil}, all the movement commands will try to go to the next
- article with the same subject as the current. (@dfn{Same} here might
- mean @dfn{roughly equal}. See @code{gnus-summary-gather-subject-limit}
- for details (@pxref{Customizing Threading}).) If there are no more
- articles with the same subject, go to the first unread article.
- This variable is not particularly useful if you use a threaded display.
- @item gnus-summary-check-current
- @vindex gnus-summary-check-current
- If non-@code{nil}, all the ``unread'' movement commands will not proceed
- to the next (or previous) article if the current article is unread.
- Instead, they will choose the current article.
- @item gnus-auto-center-summary
- @vindex gnus-auto-center-summary
- If non-@code{nil}, Gnus will keep the point in the summary buffer
- centered at all times. This makes things quite tidy, but if you have a
- slow network connection, or simply do not like this un-Emacsism, you can
- set this variable to @code{nil} to get the normal Emacs scrolling
- action. This will also inhibit horizontal re-centering of the summary
- buffer, which might make it more inconvenient to read extremely long
- threads.
- This variable can also be a number. In that case, center the window at
- the given number of lines from the top.
- @end table
- @node Choosing Articles
- @section Choosing Articles
- @cindex selecting articles
- @menu
- * Choosing Commands:: Commands for choosing articles.
- * Choosing Variables:: Variables that influence these commands.
- @end menu
- @node Choosing Commands
- @subsection Choosing Commands
- None of the following movement commands understand the numeric prefix,
- and they all select and display an article.
- If you want to fetch new articles or redisplay the group, see
- @ref{Exiting the Summary Buffer}.
- @table @kbd
- @item @key{SPC}
- @kindex @key{SPC} @r{(Summary)}
- @findex gnus-summary-next-page
- Select the current article, or, if that one's read already, the next
- unread article (@code{gnus-summary-next-page}).
- @item G n
- @itemx n
- @kindex n @r{(Summary)}
- @kindex G n @r{(Summary)}
- @findex gnus-summary-next-unread-article
- @c @icon{gnus-summary-next-unread}
- Go to next unread article (@code{gnus-summary-next-unread-article}).
- @item G p
- @itemx p
- @kindex p @r{(Summary)}
- @findex gnus-summary-prev-unread-article
- @c @icon{gnus-summary-prev-unread}
- Go to previous unread article (@code{gnus-summary-prev-unread-article}).
- @item G N
- @itemx N
- @kindex N @r{(Summary)}
- @kindex G N @r{(Summary)}
- @findex gnus-summary-next-article
- Go to the next article (@code{gnus-summary-next-article}).
- @item G P
- @itemx P
- @kindex P @r{(Summary)}
- @kindex G P @r{(Summary)}
- @findex gnus-summary-prev-article
- Go to the previous article (@code{gnus-summary-prev-article}).
- @item G C-n
- @kindex G C-n @r{(Summary)}
- @findex gnus-summary-next-same-subject
- Go to the next article with the same subject
- (@code{gnus-summary-next-same-subject}).
- @item G C-p
- @kindex G C-p @r{(Summary)}
- @findex gnus-summary-prev-same-subject
- Go to the previous article with the same subject
- (@code{gnus-summary-prev-same-subject}).
- @item G f
- @itemx .
- @kindex G f @r{(Summary)}
- @kindex . @r{(Summary)}
- @findex gnus-summary-first-unread-article
- Go to the first unread article
- (@code{gnus-summary-first-unread-article}).
- @item G b
- @itemx ,
- @kindex G b @r{(Summary)}
- @kindex , @r{(Summary)}
- @findex gnus-summary-best-unread-article
- Go to the article with the highest score
- (@code{gnus-summary-best-unread-article}).
- @item G l
- @itemx l
- @kindex l @r{(Summary)}
- @kindex G l @r{(Summary)}
- @findex gnus-summary-goto-last-article
- Go to the previous article read (@code{gnus-summary-goto-last-article}).
- @item G o
- @kindex G o @r{(Summary)}
- @findex gnus-summary-pop-article
- @cindex history
- @cindex article history
- Pop an article off the summary history and go to this article
- (@code{gnus-summary-pop-article}). This command differs from the
- command above in that you can pop as many previous articles off the
- history as you like, while @kbd{l} toggles the two last read articles.
- For a somewhat related issue (if you use these commands a lot),
- @pxref{Article Backlog}.
- @item G j
- @itemx j
- @kindex j @r{(Summary)}
- @kindex G j @r{(Summary)}
- @findex gnus-summary-goto-article
- Ask for an article number or @code{Message-ID}, and then go to that
- article (@code{gnus-summary-goto-article}).
- @end table
- @node Choosing Variables
- @subsection Choosing Variables
- Some variables relevant for moving and selecting articles:
- @table @code
- @item gnus-auto-extend-newsgroup
- @vindex gnus-auto-extend-newsgroup
- All the movement commands will try to go to the previous (or next)
- article, even if that article isn't displayed in the Summary buffer if
- this variable is non-@code{nil}. Gnus will then fetch the article from
- the server and display it in the article buffer.
- @item gnus-select-article-hook
- @vindex gnus-select-article-hook
- This hook is called whenever an article is selected. By default it
- exposes any threads hidden under the selected article.
- @item gnus-mark-article-hook
- @vindex gnus-mark-article-hook
- @findex gnus-summary-mark-unread-as-read
- @findex gnus-summary-mark-read-and-unread-as-read
- @findex gnus-unread-mark
- This hook is called whenever an article is selected. It is intended to
- be used for marking articles as read. The default value is
- @code{gnus-summary-mark-read-and-unread-as-read}, and will change the
- mark of almost any article you read to @code{gnus-unread-mark}. The
- only articles not affected by this function are ticked, dormant, and
- expirable articles. If you'd instead like to just have unread articles
- marked as read, you can use @code{gnus-summary-mark-unread-as-read}
- instead. It will leave marks like @code{gnus-low-score-mark},
- @code{gnus-del-mark} (and so on) alone.
- @end table
- @node Paging the Article
- @section Scrolling the Article
- @cindex article scrolling
- @table @kbd
- @item @key{SPC}
- @kindex @key{SPC} @r{(Summary)}
- @findex gnus-summary-next-page
- Pressing @key{SPC} will scroll the current article forward one page,
- or, if you have come to the end of the current article, will choose the
- next article (@code{gnus-summary-next-page}).
- @item @key{DEL}
- @kindex @key{DEL} @r{(Summary)}
- @findex gnus-summary-prev-page
- Scroll the current article back one page (@code{gnus-summary-prev-page}).
- @item @key{RET}
- @kindex @key{RET} @r{(Summary)}
- @findex gnus-summary-scroll-up
- Scroll the current article one line forward
- (@code{gnus-summary-scroll-up}).
- @item M-@key{RET}
- @kindex M-@key{RET} @r{(Summary)}
- @findex gnus-summary-scroll-down
- Scroll the current article one line backward
- (@code{gnus-summary-scroll-down}).
- @item A g
- @itemx g
- @kindex A g @r{(Summary)}
- @kindex g @r{(Summary)}
- @findex gnus-summary-show-article
- @vindex gnus-summary-show-article-charset-alist
- (Re)fetch the current article (@code{gnus-summary-show-article}). If
- given a prefix, fetch the current article, but don't run any of the
- article treatment functions. This will give you a ``raw'' article, just
- the way it came from the server.
- If given a numerical prefix, you can do semi-manual charset stuff.
- @kbd{C-u 0 g cn-gb-2312 @key{RET}} will decode the message as if it were
- encoded in the @code{cn-gb-2312} charset. If you have
- @lisp
- (setq gnus-summary-show-article-charset-alist
- '((1 . cn-gb-2312)
- (2 . big5)))
- @end lisp
- then you can say @kbd{C-u 1 g} to get the same effect.
- @item A <
- @itemx <
- @kindex < @r{(Summary)}
- @kindex A < @r{(Summary)}
- @findex gnus-summary-beginning-of-article
- Scroll to the beginning of the article
- (@code{gnus-summary-beginning-of-article}).
- @item A >
- @itemx >
- @kindex > @r{(Summary)}
- @kindex A > @r{(Summary)}
- @findex gnus-summary-end-of-article
- Scroll to the end of the article (@code{gnus-summary-end-of-article}).
- @item A s
- @itemx s
- @kindex A s @r{(Summary)}
- @kindex s @r{(Summary)}
- @findex gnus-summary-isearch-article
- Perform an isearch in the article buffer
- (@code{gnus-summary-isearch-article}).
- @item h
- @kindex h @r{(Summary)}
- @findex gnus-summary-select-article-buffer
- Select the article buffer (@code{gnus-summary-select-article-buffer}).
- @end table
- @node Reply Followup and Post
- @section Reply, Followup and Post
- @menu
- * Summary Mail Commands:: Sending mail.
- * Summary Post Commands:: Sending news.
- * Summary Message Commands:: Other Message-related commands.
- * Canceling and Superseding:: ``Whoops, I shouldn't have called him that.''
- @end menu
- @node Summary Mail Commands
- @subsection Summary Mail Commands
- @cindex mail
- @cindex composing mail
- Commands for composing a mail message:
- @table @kbd
- @item S r
- @itemx r
- @kindex S r @r{(Summary)}
- @kindex r @r{(Summary)}
- @findex gnus-summary-reply
- @c @icon{gnus-summary-mail-reply}
- @c @icon{gnus-summary-reply}
- Mail a reply to the author of the current article
- (@code{gnus-summary-reply}).
- @item S R
- @itemx R
- @kindex R @r{(Summary)}
- @kindex S R @r{(Summary)}
- @findex gnus-summary-reply-with-original
- @c @icon{gnus-summary-reply-with-original}
- Mail a reply to the author of the current article and include the
- original message (@code{gnus-summary-reply-with-original}). This
- command uses the process/prefix convention.
- @item S w
- @kindex S w @r{(Summary)}
- @findex gnus-summary-wide-reply
- Mail a wide reply to the author of the current article
- (@code{gnus-summary-wide-reply}). A @dfn{wide reply} is a reply that
- goes out to all people listed in the @code{To}, @code{From} (or
- @code{Reply-to}) and @code{Cc} headers.
- @item S W
- @kindex S W @r{(Summary)}
- @findex gnus-summary-wide-reply-with-original
- Mail a wide reply to the current article and include the original
- message (@code{gnus-summary-wide-reply-with-original}). This command uses
- the process/prefix convention.
- @item S o m
- @itemx C-c C-f
- @kindex S o m @r{(Summary)}
- @kindex C-c C-f @r{(Summary)}
- @findex gnus-summary-mail-forward
- @c @icon{gnus-summary-mail-forward}
- Forward the current article to some other person
- (@code{gnus-summary-mail-forward}). If no prefix is given, the message
- is forwarded according to the value of (@code{message-forward-as-mime})
- and (@code{message-forward-show-mml}); if the prefix is 1, decode the
- message and forward directly inline; if the prefix is 2, forward message
- as an rfc822 MIME section; if the prefix is 3, decode message and
- forward as an rfc822 MIME section; if the prefix is 4, forward message
- directly inline; otherwise, the message is forwarded as no prefix given
- but use the flipped value of (@code{message-forward-as-mime}). By
- default, the message is decoded and forwarded as an rfc822 MIME section.
- @item S m
- @itemx m
- @kindex m @r{(Summary)}
- @kindex S m @r{(Summary)}
- @findex gnus-summary-mail-other-window
- @c @icon{gnus-summary-mail-originate}
- Send a mail to some other person
- (@code{gnus-summary-mail-other-window}).
- @item S D b
- @kindex S D b @r{(Summary)}
- @findex gnus-summary-resend-bounced-mail
- @cindex bouncing mail
- If you have sent a mail, but the mail was bounced back to you for some
- reason (wrong address, transient failure), you can use this command to
- resend that bounced mail (@code{gnus-summary-resend-bounced-mail}). You
- will be popped into a mail buffer where you can edit the headers before
- sending the mail off again. If you give a prefix to this command, and
- the bounced mail is a reply to some other mail, Gnus will try to fetch
- that mail and display it for easy perusal of its headers. This might
- very well fail, though.
- @item S D r
- @kindex S D r @r{(Summary)}
- @findex gnus-summary-resend-message
- Not to be confused with the previous command,
- @code{gnus-summary-resend-message} will prompt you for an address to
- send the current message off to, and then send it to that place. The
- headers of the message won't be altered---but lots of headers that say
- @code{Resent-To}, @code{Resent-From} and so on will be added. This
- means that you actually send a mail to someone that has a @code{To}
- header that (probably) points to yourself. This will confuse people.
- So, natcherly you'll only do that if you're really eVIl.
- This command is mainly used if you have several accounts and want to
- ship a mail to a different account of yours. (If you're both
- @code{root} and @code{postmaster} and get a mail for @code{postmaster}
- to the @code{root} account, you may want to resend it to
- @code{postmaster}. Ordnung muß sein!
- This command understands the process/prefix convention
- (@pxref{Process/Prefix}).
- @item S O m
- @kindex S O m @r{(Summary)}
- @findex gnus-uu-digest-mail-forward
- Digest the current series (@pxref{Decoding Articles}) and forward the
- result using mail (@code{gnus-uu-digest-mail-forward}). This command
- uses the process/prefix convention (@pxref{Process/Prefix}).
- @item S M-c
- @kindex S M-c @r{(Summary)}
- @findex gnus-summary-mail-crosspost-complaint
- @cindex crossposting
- @cindex excessive crossposting
- Send a complaint about excessive crossposting to the author of the
- current article (@code{gnus-summary-mail-crosspost-complaint}).
- @findex gnus-crosspost-complaint
- This command is provided as a way to fight back against the current
- crossposting pandemic that's sweeping Usenet. It will compose a reply
- using the @code{gnus-crosspost-complaint} variable as a preamble. This
- command understands the process/prefix convention
- (@pxref{Process/Prefix}) and will prompt you before sending each mail.
- @end table
- Also @pxref{(message)Header Commands} for more information.
- @node Summary Post Commands
- @subsection Summary Post Commands
- @cindex post
- @cindex composing news
- Commands for posting a news article:
- @table @kbd
- @item S p
- @itemx a
- @kindex a @r{(Summary)}
- @kindex S p @r{(Summary)}
- @findex gnus-summary-post-news
- @c @icon{gnus-summary-post-news}
- Post an article to the current group
- (@code{gnus-summary-post-news}).
- @item S f
- @itemx f
- @kindex f @r{(Summary)}
- @kindex S f @r{(Summary)}
- @findex gnus-summary-followup
- @c @icon{gnus-summary-followup}
- Post a followup to the current article (@code{gnus-summary-followup}).
- @item S F
- @itemx F
- @kindex S F @r{(Summary)}
- @kindex F @r{(Summary)}
- @c @icon{gnus-summary-followup-with-original}
- @findex gnus-summary-followup-with-original
- Post a followup to the current article and include the original message
- (@code{gnus-summary-followup-with-original}). This command uses the
- process/prefix convention.
- @item S n
- @kindex S n @r{(Summary)}
- @findex gnus-summary-followup-to-mail
- Post a followup to the current article via news, even if you got the
- message through mail (@code{gnus-summary-followup-to-mail}).
- @item S N
- @kindex S N @r{(Summary)}
- @findex gnus-summary-followup-to-mail-with-original
- Post a followup to the current article via news, even if you got the
- message through mail and include the original message
- (@code{gnus-summary-followup-to-mail-with-original}). This command uses
- the process/prefix convention.
- @item S o p
- @kindex S o p @r{(Summary)}
- @findex gnus-summary-post-forward
- Forward the current article to a newsgroup
- (@code{gnus-summary-post-forward}).
- If no prefix is given, the message is forwarded according to the value
- of (@code{message-forward-as-mime}) and
- (@code{message-forward-show-mml}); if the prefix is 1, decode the
- message and forward directly inline; if the prefix is 2, forward message
- as an rfc822 MIME section; if the prefix is 3, decode message and
- forward as an rfc822 MIME section; if the prefix is 4, forward message
- directly inline; otherwise, the message is forwarded as no prefix given
- but use the flipped value of (@code{message-forward-as-mime}). By
- default, the message is decoded and forwarded as an rfc822 MIME section.
- @item S O p
- @kindex S O p @r{(Summary)}
- @findex gnus-uu-digest-post-forward
- @cindex digests
- @cindex making digests
- Digest the current series and forward the result to a newsgroup
- (@code{gnus-uu-digest-mail-forward}). This command uses the
- process/prefix convention.
- @item S u
- @kindex S u @r{(Summary)}
- @findex gnus-uu-post-news
- @c @icon{gnus-uu-post-news}
- Uuencode a file, split it into parts, and post it as a series
- (@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}).
- @end table
- Also @pxref{(message)Header Commands} for more information.
- @node Summary Message Commands
- @subsection Summary Message Commands
- @table @kbd
- @item S y
- @kindex S y @r{(Summary)}
- @findex gnus-summary-yank-message
- Yank the current article into an already existing Message composition
- buffer (@code{gnus-summary-yank-message}). This command prompts for
- what message buffer you want to yank into, and understands the
- process/prefix convention (@pxref{Process/Prefix}).
- @end table
- @node Canceling and Superseding
- @subsection Canceling Articles
- @cindex canceling articles
- @cindex superseding articles
- Have you ever written something, and then decided that you really,
- really, really wish you hadn't posted that?
- Well, you can't cancel mail, but you can cancel posts.
- @findex gnus-summary-cancel-article
- @kindex C @r{(Summary)}
- @c @icon{gnus-summary-cancel-article}
- Find the article you wish to cancel (you can only cancel your own
- articles, so don't try any funny stuff). Then press @kbd{C} or @kbd{S
- c} (@code{gnus-summary-cancel-article}). Your article will be
- canceled---machines all over the world will be deleting your article.
- This command uses the process/prefix convention (@pxref{Process/Prefix}).
- Be aware, however, that not all sites honor cancels, so your article may
- live on here and there, while most sites will delete the article in
- question.
- Gnus will use the ``current'' select method when canceling. If you
- want to use the standard posting method, use the @samp{a} symbolic
- prefix (@pxref{Symbolic Prefixes}).
- If you discover that you have made some mistakes and want to do some
- corrections, you can post a @dfn{superseding} article that will replace
- your original article.
- @findex gnus-summary-supersede-article
- @kindex S @r{(Summary)}
- Go to the original article and press @kbd{S s}
- (@code{gnus-summary-supersede-article}). You will be put in a buffer
- where you can edit the article all you want before sending it off the
- usual way.
- The same goes for superseding as for canceling, only more so: Some
- sites do not honor superseding. On those sites, it will appear that you
- have posted almost the same article twice.
- If you have just posted the article, and change your mind right away,
- there is a trick you can use to cancel/supersede the article without
- waiting for the article to appear on your site first. You simply return
- to the post buffer (which is called @code{*sent ...*}). There you will
- find the article you just posted, with all the headers intact. Change
- the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
- header by substituting one of those words for the word
- @code{Message-ID}. Then just press @kbd{C-c C-c} to send the article as
- you would do normally. The previous article will be
- canceled/superseded.
- Just remember, kids: There is no 'c' in 'supersede'.
- @node Marking Articles
- @section Marking Articles
- @cindex article marking
- @cindex article ticking
- @cindex marks
- There are several marks you can set on an article.
- You have marks that decide the @dfn{readedness} (whoo, neato-keano
- neologism ohoy!) of the article. Alphabetic marks generally mean
- @dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
- In addition, you also have marks that do not affect readedness.
- @menu
- * Unread Articles:: Marks for unread articles.
- * Read Articles:: Marks for read articles.
- * Other Marks:: Marks that do not affect readedness.
- @end menu
- @ifinfo
- There's a plethora of commands for manipulating these marks:
- @end ifinfo
- @menu
- * Setting Marks:: How to set and remove marks.
- * Generic Marking Commands:: How to customize the marking.
- * Setting Process Marks:: How to mark articles for later processing.
- @end menu
- @node Unread Articles
- @subsection Unread Articles
- The following marks mark articles as (kinda) unread, in one form or
- other.
- @table @samp
- @item !
- @vindex gnus-ticked-mark
- Marked as ticked (@code{gnus-ticked-mark}).
- @dfn{Ticked articles} are articles that will remain visible always. If
- you see an article that you find interesting, or you want to put off
- reading it, or replying to it, until sometime later, you'd typically
- tick it. However, articles can be expired, so if you want to keep an
- article forever, you'll have to make it persistent (@pxref{Persistent
- Articles}).
- @item ?
- @vindex gnus-dormant-mark
- Marked as dormant (@code{gnus-dormant-mark}).
- @dfn{Dormant articles} will only appear in the summary buffer if there
- are followups to it. If you want to see them even if they don't have
- followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
- @item @key{SPC}
- @vindex gnus-unread-mark
- Marked as unread (@code{gnus-unread-mark}).
- @dfn{Unread articles} are articles that haven't been read at all yet.
- @end table
- @node Read Articles
- @subsection Read Articles
- @cindex expirable mark
- All the following marks mark articles as read.
- @table @samp
- @item r
- @vindex gnus-del-mark
- These are articles that the user has marked as read with the @kbd{d}
- command manually, more or less (@code{gnus-del-mark}).
- @item R
- @vindex gnus-read-mark
- Articles that have actually been read (@code{gnus-read-mark}).
- @item O
- @vindex gnus-ancient-mark
- Articles that were marked as read in previous sessions and are now
- @dfn{old} (@code{gnus-ancient-mark}).
- @item K
- @vindex gnus-killed-mark
- Marked as killed (@code{gnus-killed-mark}).
- @item X
- @vindex gnus-kill-file-mark
- Marked as killed by kill files (@code{gnus-kill-file-mark}).
- @item Y
- @vindex gnus-low-score-mark
- Marked as read by having too low a score (@code{gnus-low-score-mark}).
- @item C
- @vindex gnus-catchup-mark
- Marked as read by a catchup (@code{gnus-catchup-mark}).
- @item G
- @vindex gnus-canceled-mark
- Canceled article (@code{gnus-canceled-mark})
- @item F
- @vindex gnus-souped-mark
- @sc{soup}ed article (@code{gnus-souped-mark}). @xref{SOUP}.
- @item Q
- @vindex gnus-sparse-mark
- Sparsely reffed article (@code{gnus-sparse-mark}). @xref{Customizing
- Threading}.
- @item M
- @vindex gnus-duplicate-mark
- Article marked as read by duplicate suppression
- (@code{gnus-duplicated-mark}). @xref{Duplicate Suppression}.
- @end table
- All these marks just mean that the article is marked as read, really.
- They are interpreted differently when doing adaptive scoring, though.
- One more special mark, though:
- @table @samp
- @item E
- @vindex gnus-expirable-mark
- Marked as expirable (@code{gnus-expirable-mark}).
- Marking articles as @dfn{expirable} (or have them marked as such
- automatically) doesn't make much sense in normal groups---a user doesn't
- control expiring of news articles, but in mail groups, for instance,
- articles marked as @dfn{expirable} can be deleted by Gnus at
- any time.
- @end table
- @node Other Marks
- @subsection Other Marks
- @cindex process mark
- @cindex bookmarks
- There are some marks that have nothing to do with whether the article is
- read or not.
- @itemize @bullet
- @item
- You can set a bookmark in the current article. Say you are reading a
- long thesis on cats' urinary tracts, and have to go home for dinner
- before you've finished reading the thesis. You can then set a bookmark
- in the article, and Gnus will jump to this bookmark the next time it
- encounters the article. @xref{Setting Marks}.
- @item
- @vindex gnus-replied-mark
- All articles that you have replied to or made a followup to (i.e., have
- answered) will be marked with an @samp{A} in the second column
- (@code{gnus-replied-mark}).
- @item
- @vindex gnus-cached-mark
- Articles stored in the article cache will be marked with an @samp{*} in
- the second column (@code{gnus-cached-mark}). @xref{Article Caching}.
- @item
- @vindex gnus-saved-mark
- Articles ``saved'' (in some manner or other; not necessarily
- religiously) are marked with an @samp{S} in the second column
- (@code{gnus-saved-mark}).
- @item
- @vindex gnus-not-empty-thread-mark
- @vindex gnus-empty-thread-mark
- If the @samp{%e} spec is used, the presence of threads or not will be
- marked with @code{gnus-not-empty-thread-mark} and
- @code{gnus-empty-thread-mark} in the third column, respectively.
- @item
- @vindex gnus-process-mark
- Finally we have the @dfn{process mark} (@code{gnus-process-mark}). A
- variety of commands react to the presence of the process mark. For
- instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
- all articles that have been marked with the process mark. Articles
- marked with the process mark have a @samp{#} in the second column.
- @end itemize
- You might have noticed that most of these ``non-readedness'' marks
- appear in the second column by default. So if you have a cached, saved,
- replied article that you have process-marked, what will that look like?
- Nothing much. The precedence rules go as follows: process -> cache ->
- replied -> saved. So if the article is in the cache and is replied,
- you'll only see the cache mark and not the replied mark.
- @node Setting Marks
- @subsection Setting Marks
- @cindex setting marks
- All the marking commands understand the numeric prefix.
- @table @kbd
- @item M c
- @itemx M-u
- @kindex M c @r{(Summary)}
- @kindex M-u @r{(Summary)}
- @findex gnus-summary-clear-mark-forward
- @cindex mark as unread
- Clear all readedness-marks from the current article
- (@code{gnus-summary-clear-mark-forward}). In other words, mark the
- article as unread.
- @item M t
- @itemx !
- @kindex ! @r{(Summary)}
- @kindex M t @r{(Summary)}
- @findex gnus-summary-tick-article-forward
- Tick the current article (@code{gnus-summary-tick-article-forward}).
- @xref{Article Caching}.
- @item M ?
- @itemx ?
- @kindex ? @r{(Summary)}
- @kindex M ? @r{(Summary)}
- @findex gnus-summary-mark-as-dormant
- Mark the current article as dormant
- (@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}.
- @item M d
- @itemx d
- @kindex M d @r{(Summary)}
- @kindex d @r{(Summary)}
- @findex gnus-summary-mark-as-read-forward
- Mark the current article as read
- (@code{gnus-summary-mark-as-read-forward}).
- @item D
- @kindex D @r{(Summary)}
- @findex gnus-summary-mark-as-read-backward
- Mark the current article as read and move point to the previous line
- (@code{gnus-summary-mark-as-read-backward}).
- @item M k
- @itemx k
- @kindex k @r{(Summary)}
- @kindex M k @r{(Summary)}
- @findex gnus-summary-kill-same-subject-and-select
- Mark all articles that have the same subject as the current one as read,
- and then select the next unread article
- (@code{gnus-summary-kill-same-subject-and-select}).
- @item M K
- @itemx C-k
- @kindex M K @r{(Summary)}
- @kindex C-k @r{(Summary)}
- @findex gnus-summary-kill-same-subject
- Mark all articles that have the same subject as the current one as read
- (@code{gnus-summary-kill-same-subject}).
- @item M C
- @kindex M C @r{(Summary)}
- @findex gnus-summary-catchup
- @c @icon{gnus-summary-catchup}
- Mark all unread articles as read (@code{gnus-summary-catchup}).
- @item M C-c
- @kindex M C-c @r{(Summary)}
- @findex gnus-summary-catchup-all
- Mark all articles in the group as read---even the ticked and dormant
- articles (@code{gnus-summary-catchup-all}).
- @item M H
- @kindex M H @r{(Summary)}
- @findex gnus-summary-catchup-to-here
- Catchup the current group to point
- (@code{gnus-summary-catchup-to-here}).
- @item C-w
- @kindex C-w @r{(Summary)}
- @findex gnus-summary-mark-region-as-read
- Mark all articles between point and mark as read
- (@code{gnus-summary-mark-region-as-read}).
- @item M V k
- @kindex M V k @r{(Summary)}
- @findex gnus-summary-kill-below
- Kill all articles with scores below the default score (or below the
- numeric prefix) (@code{gnus-summary-kill-below}).
- @item M e
- @itemx E
- @kindex M e @r{(Summary)}
- @kindex E @r{(Summary)}
- @findex gnus-summary-mark-as-expirable
- Mark the current article as expirable
- (@code{gnus-summary-mark-as-expirable}).
- @item M b
- @kindex M b @r{(Summary)}
- @findex gnus-summary-set-bookmark
- Set a bookmark in the current article
- (@code{gnus-summary-set-bookmark}).
- @item M B
- @kindex M B @r{(Summary)}
- @findex gnus-summary-remove-bookmark
- Remove the bookmark from the current article
- (@code{gnus-summary-remove-bookmark}).
- @item M V c
- @kindex M V c @r{(Summary)}
- @findex gnus-summary-clear-above
- Clear all marks from articles with scores over the default score (or
- over the numeric prefix) (@code{gnus-summary-clear-above}).
- @item M V u
- @kindex M V u @r{(Summary)}
- @findex gnus-summary-tick-above
- Tick all articles with scores over the default score (or over the
- numeric prefix) (@code{gnus-summary-tick-above}).
- @item M V m
- @kindex M V m @r{(Summary)}
- @findex gnus-summary-mark-above
- Prompt for a mark, and mark all articles with scores over the default
- score (or over the numeric prefix) with this mark
- (@code{gnus-summary-clear-above}).
- @end table
- @vindex gnus-summary-goto-unread
- The @code{gnus-summary-goto-unread} variable controls what action should
- be taken after setting a mark. If non-@code{nil}, point will move to
- the next/previous unread article. If @code{nil}, point will just move
- one line up or down. As a special case, if this variable is
- @code{never}, all the marking commands as well as other commands (like
- @key{SPC}) will move to the next article, whether it is unread or not.
- The default is @code{t}.
- @node Generic Marking Commands
- @subsection Generic Marking Commands
- Some people would like the command that ticks an article (@kbd{!}) go to
- the next article. Others would like it to go to the next unread
- article. Yet others would like it to stay on the current article. And
- even though I haven't heard of anybody wanting it to go to the
- previous (unread) article, I'm sure there are people that want that as
- well.
- Multiply these five behaviors by five different marking commands, and
- you get a potentially complex set of variable to control what each
- command should do.
- To sidestep that mess, Gnus provides commands that do all these
- different things. They can be found on the @kbd{M M} map in the summary
- buffer. Type @kbd{M M C-h} to see them all---there are too many of them
- to list in this manual.
- While you can use these commands directly, most users would prefer
- altering the summary mode keymap. For instance, if you would like the
- @kbd{!} command to go to the next article instead of the next unread
- article, you could say something like:
- @lisp
- (add-hook 'gnus-summary-mode-hook 'my-alter-summary-map)
- (defun my-alter-summary-map ()
- (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next))
- @end lisp
- or
- @lisp
- (defun my-alter-summary-map ()
- (local-set-key "!" "MM!n"))
- @end lisp
- @node Setting Process Marks
- @subsection Setting Process Marks
- @cindex setting process marks
- @table @kbd
- @item M P p
- @itemx #
- @kindex # @r{(Summary)}
- @kindex M P p @r{(Summary)}
- @findex gnus-summary-mark-as-processable
- Mark the current article with the process mark
- (@code{gnus-summary-mark-as-processable}).
- @findex gnus-summary-unmark-as-processable
- @item M P u
- @itemx M-#
- @kindex M P u @r{(Summary)}
- @kindex M-# @r{(Summary)}
- Remove the process mark, if any, from the current article
- (@code{gnus-summary-unmark-as-processable}).
- @item M P U
- @kindex M P U @r{(Summary)}
- @findex gnus-summary-unmark-all-processable
- Remove the process mark from all articles
- (@code{gnus-summary-unmark-all-processable}).
- @item M P i
- @kindex M P i @r{(Summary)}
- @findex gnus-uu-invert-processable
- Invert the list of process marked articles
- (@code{gnus-uu-invert-processable}).
- @item M P R
- @kindex M P R @r{(Summary)}
- @findex gnus-uu-mark-by-regexp
- Mark articles that have a @code{Subject} header that matches a regular
- expression (@code{gnus-uu-mark-by-regexp}).
- @item M P G
- @kindex M P G @r{(Summary)}
- @findex gnus-uu-unmark-by-regexp
- Unmark articles that have a @code{Subject} header that matches a regular
- expression (@code{gnus-uu-unmark-by-regexp}).
- @item M P r
- @kindex M P r @r{(Summary)}
- @findex gnus-uu-mark-region
- Mark articles in region (@code{gnus-uu-mark-region}).
- @item M P t
- @kindex M P t @r{(Summary)}
- @findex gnus-uu-mark-thread
- Mark all articles in the current (sub)thread
- (@code{gnus-uu-mark-thread}).
- @item M P T
- @kindex M P T @r{(Summary)}
- @findex gnus-uu-unmark-thread
- Unmark all articles in the current (sub)thread
- (@code{gnus-uu-unmark-thread}).
- @item M P v
- @kindex M P v @r{(Summary)}
- @findex gnus-uu-mark-over
- Mark all articles that have a score above the prefix argument
- (@code{gnus-uu-mark-over}).
- @item M P s
- @kindex M P s @r{(Summary)}
- @findex gnus-uu-mark-series
- Mark all articles in the current series (@code{gnus-uu-mark-series}).
- @item M P S
- @kindex M P S @r{(Summary)}
- @findex gnus-uu-mark-sparse
- Mark all series that have already had some articles marked
- (@code{gnus-uu-mark-sparse}).
- @item M P a
- @kindex M P a @r{(Summary)}
- @findex gnus-uu-mark-all
- Mark all articles in series order (@code{gnus-uu-mark-series}).
- @item M P b
- @kindex M P b @r{(Summary)}
- @findex gnus-uu-mark-buffer
- Mark all articles in the buffer in the order they appear
- (@code{gnus-uu-mark-buffer}).
- @item M P k
- @kindex M P k @r{(Summary)}
- @findex gnus-summary-kill-process-mark
- Push the current process mark set onto the stack and unmark all articles
- (@code{gnus-summary-kill-process-mark}).
- @item M P y
- @kindex M P y @r{(Summary)}
- @findex gnus-summary-yank-process-mark
- Pop the previous process mark set from the stack and restore it
- (@code{gnus-summary-yank-process-mark}).
- @item M P w
- @kindex M P w @r{(Summary)}
- @findex gnus-summary-save-process-mark
- Push the current process mark set onto the stack
- (@code{gnus-summary-save-process-mark}).
- @end table
- Also see the @kbd{&} command in @pxref{Searching for Articles} for how to
- set process marks based on article body contents.
- @node Limiting
- @section Limiting
- @cindex limiting
- It can be convenient to limit the summary buffer to just show some
- subset of the articles currently in the group. The effect most limit
- commands have is to remove a few (or many) articles from the summary
- buffer.
- All limiting commands work on subsets of the articles already fetched
- from the servers. None of these commands query the server for
- additional articles.
- @table @kbd
- @item / /
- @itemx / s
- @kindex / / @r{(Summary)}
- @findex gnus-summary-limit-to-subject
- Limit the summary buffer to articles that match some subject
- (@code{gnus-summary-limit-to-subject}).
- @item / a
- @kindex / a @r{(Summary)}
- @findex gnus-summary-limit-to-author
- Limit the summary buffer to articles that match some author
- (@code{gnus-summary-limit-to-author}).
- @item / x
- @kindex / x @r{(Summary)}
- @findex gnus-summary-limit-to-extra
- Limit the summary buffer to articles that match one of the ``extra''
- headers (@pxref{To From Newsgroups})
- (@code{gnus-summary-limit-to-extra}).
- @item / u
- @itemx x
- @kindex / u @r{(Summary)}
- @kindex x @r{(Summary)}
- @findex gnus-summary-limit-to-unread
- Limit the summary buffer to articles not marked as read
- (@code{gnus-summary-limit-to-unread}). If given a prefix, limit the
- buffer to articles strictly unread. This means that ticked and
- dormant articles will also be excluded.
- @item / m
- @kindex / m @r{(Summary)}
- @findex gnus-summary-limit-to-marks
- Ask for a mark and then limit to all articles that have been marked
- with that mark (@code{gnus-summary-limit-to-marks}).
- @item / t
- @kindex / t @r{(Summary)}
- @findex gnus-summary-limit-to-age
- Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days
- (@code{gnus-summary-limit-to-age}). If given a prefix, limit to
- articles younger than that number of days.
- @item / n
- @kindex / n @r{(Summary)}
- @findex gnus-summary-limit-to-articles
- Limit the summary buffer to the current article
- (@code{gnus-summary-limit-to-articles}). Uses the process/prefix
- convention (@pxref{Process/Prefix}).
- @item / w
- @kindex / w @r{(Summary)}
- @findex gnus-summary-pop-limit
- Pop the previous limit off the stack and restore it
- (@code{gnus-summary-pop-limit}). If given a prefix, pop all limits off
- the stack.
- @item / v
- @kindex / v @r{(Summary)}
- @findex gnus-summary-limit-to-score
- Limit the summary buffer to articles that have a score at or above some
- score (@code{gnus-summary-limit-to-score}).
- @item / E
- @itemx M S
- @kindex M S @r{(Summary)}
- @kindex / E @r{(Summary)}
- @findex gnus-summary-limit-include-expunged
- Include all expunged articles in the limit
- (@code{gnus-summary-limit-include-expunged}).
- @item / D
- @kindex / D @r{(Summary)}
- @findex gnus-summary-limit-include-dormant
- Include all dormant articles in the limit
- (@code{gnus-summary-limit-include-dormant}).
- @item / *
- @kindex / * @r{(Summary)}
- @findex gnus-summary-limit-include-cached
- Include all cached articles in the limit
- (@code{gnus-summary-limit-include-cached}).
- @item / d
- @kindex / d @r{(Summary)}
- @findex gnus-summary-limit-exclude-dormant
- Exclude all dormant articles from the limit
- (@code{gnus-summary-limit-exclude-dormant}).
- @item / M
- @kindex / M @r{(Summary)}
- @findex gnus-summary-limit-exclude-marks
- Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}).
- @item / T
- @kindex / T @r{(Summary)}
- @findex gnus-summary-limit-include-thread
- Include all the articles in the current thread in the limit.
- @item / c
- @kindex / c @r{(Summary)}
- @findex gnus-summary-limit-exclude-childless-dormant
- Exclude all dormant articles that have no children from the limit
- (@code{gnus-summary-limit-exclude-childless-dormant}).
- @item / C
- @kindex / C @r{(Summary)}
- @findex gnus-summary-limit-mark-excluded-as-read
- Mark all excluded unread articles as read
- (@code{gnus-summary-limit-mark-excluded-as-read}). If given a prefix,
- also mark excluded ticked and dormant articles as read.
- @end table
- @node Threading
- @section Threading
- @cindex threading
- @cindex article threading
- Gnus threads articles by default. @dfn{To thread} is to put responses
- to articles directly after the articles they respond to---in a
- hierarchical fashion.
- Threading is done by looking at the @code{References} headers of the
- articles. In a perfect world, this would be enough to build pretty
- trees, but unfortunately, the @code{References} header is often broken
- or simply missing. Weird news propagation exacerbates the problem,
- so one has to employ other heuristics to get pleasing results. A
- plethora of approaches exists, as detailed in horrible detail in
- @pxref{Customizing Threading}.
- First, a quick overview of the concepts:
- @table @dfn
- @item root
- The top-most article in a thread; the first article in the thread.
- @item thread
- A tree-like article structure.
- @item sub-thread
- A small(er) section of this tree-like structure.
- @item loose threads
- Threads often lose their roots due to article expiry, or due to the root
- already having been read in a previous session, and not displayed in the
- summary buffer. We then typically have many sub-threads that really
- belong to one thread, but are without connecting roots. These are
- called loose threads.
- @item thread gathering
- An attempt to gather loose threads into bigger threads.
- @item sparse threads
- A thread where the missing articles have been ``guessed'' at, and are
- displayed as empty lines in the summary buffer.
- @end table
- @menu
- * Customizing Threading:: Variables you can change to affect the threading.
- * Thread Commands:: Thread based commands in the summary buffer.
- @end menu
- @node Customizing Threading
- @subsection Customizing Threading
- @cindex customizing threading
- @menu
- * Loose Threads:: How Gnus gathers loose threads into bigger threads.
- * Filling In Threads:: Making the threads displayed look fuller.
- * More Threading:: Even more variables for fiddling with threads.
- * Low-Level Threading:: You thought it was over... but you were wrong!
- @end menu
- @node Loose Threads
- @subsubsection Loose Threads
- @cindex <
- @cindex >
- @cindex loose threads
- @table @code
- @item gnus-summary-make-false-root
- @vindex gnus-summary-make-false-root
- If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
- and create a dummy root at the top. (Wait a minute. Root at the top?
- Yup.) Loose subtrees occur when the real root has expired, or you've
- read or killed the root in a previous session.
- When there is no real root of a thread, Gnus will have to fudge
- something. This variable says what fudging method Gnus should use.
- There are four possible values:
- @iftex
- @iflatex
- \gnusfigure{The Summary Buffer}{390}{
- \put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}}
- \put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}}
- \put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}}
- \put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}}
- }
- @end iflatex
- @end iftex
- @cindex adopting articles
- @table @code
- @item adopt
- Gnus will make the first of the orphaned articles the parent. This
- parent will adopt all the other articles. The adopted articles will be
- marked as such by pointy brackets (@samp{<>}) instead of the standard
- square brackets (@samp{[]}). This is the default method.
- @item dummy
- @vindex gnus-summary-dummy-line-format
- Gnus will create a dummy summary line that will pretend to be the
- parent. This dummy line does not correspond to any real article, so
- selecting it will just select the first real article after the dummy
- article. @code{gnus-summary-dummy-line-format} is used to specify the
- format of the dummy roots. It accepts only one format spec: @samp{S},
- which is the subject of the article. @xref{Formatting Variables}.
- @item empty
- Gnus won't actually make any article the parent, but simply leave the
- subject field of all orphans except the first empty. (Actually, it will
- use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
- Buffer Format}).)
- @item none
- Don't make any article parent at all. Just gather the threads and
- display them after one another.
- @item nil
- Don't gather loose threads.
- @end table
- @item gnus-summary-gather-subject-limit
- @vindex gnus-summary-gather-subject-limit
- Loose threads are gathered by comparing subjects of articles. If this
- variable is @code{nil}, Gnus requires an exact match between the
- subjects of the loose threads before gathering them into one big
- super-thread. This might be too strict a requirement, what with the
- presence of stupid newsreaders that chop off long subject lines. If
- you think so, set this variable to, say, 20 to require that only the
- first 20 characters of the subjects have to match. If you set this
- variable to a really low number, you'll find that Gnus will gather
- everything in sight into one thread, which isn't very helpful.
- @cindex fuzzy article gathering
- If you set this variable to the special value @code{fuzzy}, Gnus will
- use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy
- Matching}).
- @item gnus-simplify-subject-fuzzy-regexp
- @vindex gnus-simplify-subject-fuzzy-regexp
- This can either be a regular expression or list of regular expressions
- that match strings that will be removed from subjects if fuzzy subject
- simplification is used.
- @item gnus-simplify-ignored-prefixes
- @vindex gnus-simplify-ignored-prefixes
- If you set @code{gnus-summary-gather-subject-limit} to something as low
- as 10, you might consider setting this variable to something sensible:
- @c Written by Michael Ernst <mernst@cs.rice.edu>
- @lisp
- (setq gnus-simplify-ignored-prefixes
- (concat
- "\\`\\[?\\("
- (mapconcat
- 'identity
- '("looking"
- "wanted" "followup" "summary\\( of\\)?"
- "help" "query" "problem" "question"
- "answer" "reference" "announce"
- "How can I" "How to" "Comparison of"
- ;; ...
- )
- "\\|")
- "\\)\\s *\\("
- (mapconcat 'identity
- '("for" "for reference" "with" "about")
- "\\|")
- "\\)?\\]?:?[ \t]*"))
- @end lisp
- All words that match this regexp will be removed before comparing two
- subjects.
- @item gnus-simplify-subject-functions
- @vindex gnus-simplify-subject-functions
- If non-@code{nil}, this variable overrides
- @code{gnus-summary-gather-subject-limit}. This variable should be a
- list of functions to apply to the @code{Subject} string iteratively to
- arrive at the simplified version of the string.
- Useful functions to put in this list include:
- @table @code
- @item gnus-simplify-subject-re
- @findex gnus-simplify-subject-re
- Strip the leading @samp{Re:}.
- @item gnus-simplify-subject-fuzzy
- @findex gnus-simplify-subject-fuzzy
- Simplify fuzzily.
- @item gnus-simplify-whitespace
- @findex gnus-simplify-whitespace
- Remove excessive whitespace.
- @end table
- You may also write your own functions, of course.
- @item gnus-summary-gather-exclude-subject
- @vindex gnus-summary-gather-exclude-subject
- Since loose thread gathering is done on subjects only, that might lead
- to many false hits, especially with certain common subjects like
- @samp{} and @samp{(none)}. To make the situation slightly better,
- you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
- what subjects should be excluded from the gathering process.@*
- The default is @samp{^ *$\\|^(none)$}.
- @item gnus-summary-thread-gathering-function
- @vindex gnus-summary-thread-gathering-function
- Gnus gathers threads by looking at @code{Subject} headers. This means
- that totally unrelated articles may end up in the same ``thread'', which
- is confusing. An alternate approach is to look at all the
- @code{Message-ID}s in all the @code{References} headers to find matches.
- This will ensure that no gathered threads ever include unrelated
- articles, but it also means that people who have posted with broken
- newsreaders won't be gathered properly. The choice is yours---plague or
- cholera:
- @table @code
- @item gnus-gather-threads-by-subject
- @findex gnus-gather-threads-by-subject
- This function is the default gathering function and looks at
- @code{Subject}s exclusively.
- @item gnus-gather-threads-by-references
- @findex gnus-gather-threads-by-references
- This function looks at @code{References} headers exclusively.
- @end table
- If you want to test gathering by @code{References}, you could say
- something like:
- @lisp
- (setq gnus-summary-thread-gathering-function
- 'gnus-gather-threads-by-references)
- @end lisp
- @end table
- @node Filling In Threads
- @subsubsection Filling In Threads
- @table @code
- @item gnus-fetch-old-headers
- @vindex gnus-fetch-old-headers
- If non-@code{nil}, Gnus will attempt to build old threads by fetching
- more old headers---headers to articles marked as read. If you
- would like to display as few summary lines as possible, but still
- connect as many loose threads as possible, you should set this variable
- to @code{some} or a number. If you set it to a number, no more than
- that number of extra old headers will be fetched. In either case,
- fetching old headers only works if the back end you are using carries
- overview files---this would normally be @code{nntp}, @code{nnspool} and
- @code{nnml}. Also remember that if the root of the thread has been
- expired by the server, there's not much Gnus can do about that.
- This variable can also be set to @code{invisible}. This won't have any
- visible effects, but is useful if you use the @kbd{A T} command a lot
- (@pxref{Finding the Parent}).
- @item gnus-build-sparse-threads
- @vindex gnus-build-sparse-threads
- Fetching old headers can be slow. A low-rent similar effect can be
- gotten by setting this variable to @code{some}. Gnus will then look at
- the complete @code{References} headers of all articles and try to string
- together articles that belong in the same thread. This will leave
- @dfn{gaps} in the threading display where Gnus guesses that an article
- is missing from the thread. (These gaps appear like normal summary
- lines. If you select a gap, Gnus will try to fetch the article in
- question.) If this variable is @code{t}, Gnus will display all these
- ``gaps'' without regard for whether they are useful for completing the
- thread or not. Finally, if this variable is @code{more}, Gnus won't cut
- off sparse leaf nodes that don't lead anywhere. This variable is
- @code{nil} by default.
- @end table
- @node More Threading
- @subsubsection More Threading
- @table @code
- @item gnus-show-threads
- @vindex gnus-show-threads
- If this variable is @code{nil}, no threading will be done, and all of
- the rest of the variables here will have no effect. Turning threading
- off will speed group selection up a bit, but it is sure to make reading
- slower and more awkward.
- @item gnus-thread-hide-subtree
- @vindex gnus-thread-hide-subtree
- If non-@code{nil}, all threads will be hidden when the summary buffer is
- generated.
- @item gnus-thread-expunge-below
- @vindex gnus-thread-expunge-below
- All threads that have a total score (as defined by
- @code{gnus-thread-score-function}) less than this number will be
- expunged. This variable is @code{nil} by default, which means that no
- threads are expunged.
- @item gnus-thread-hide-killed
- @vindex gnus-thread-hide-killed
- if you kill a thread and this variable is non-@code{nil}, the subtree
- will be hidden.
- @item gnus-thread-ignore-subject
- @vindex gnus-thread-ignore-subject
- Sometimes somebody changes the subject in the middle of a thread. If
- this variable is non-@code{nil}, the subject change is ignored. If it
- is @code{nil}, which is the default, a change in the subject will result
- in a new thread.
- @item gnus-thread-indent-level
- @vindex gnus-thread-indent-level
- This is a number that says how much each sub-thread should be indented.
- The default is 4.
- @item gnus-sort-gathered-threads-function
- @vindex gnus-sort-gathered-threads-function
- Sometimes, particularly with mailing lists, the order in which mails
- arrive locally is not necessarily the same as the order in which they
- arrived on the mailing list. Consequently, when sorting sub-threads
- using the default @code{gnus-thread-sort-by-number}, responses can end
- up appearing before the article to which they are responding to.
- Setting this variable to an alternate value
- (e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in an
- appropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce a
- more logical sub-thread ordering in such instances.
- @end table
- @node Low-Level Threading
- @subsubsection Low-Level Threading
- @table @code
- @item gnus-parse-headers-hook
- @vindex gnus-parse-headers-hook
- Hook run before parsing any headers.
- @item gnus-alter-header-function
- @vindex gnus-alter-header-function
- If non-@code{nil}, this function will be called to allow alteration of
- article header structures. The function is called with one parameter,
- the article header vector, which it may alter in any way. For instance,
- if you have a mail-to-news gateway which alters the @code{Message-ID}s
- in systematic ways (by adding prefixes and such), you can use this
- variable to un-scramble the @code{Message-ID}s so that they are more
- meaningful. Here's one example:
- @lisp
- (setq gnus-alter-header-function 'my-alter-message-id)
- (defun my-alter-message-id (header)
- (let ((id (mail-header-id header)))
- (when (string-match
- "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
- (mail-header-set-id
- (concat (match-string 1 id) "@@" (match-string 2 id))
- header))))
- @end lisp
- @end table
- @node Thread Commands
- @subsection Thread Commands
- @cindex thread commands
- @table @kbd
- @item T k
- @itemx C-M-k
- @kindex T k @r{(Summary)}
- @kindex C-M-k @r{(Summary)}
- @findex gnus-summary-kill-thread
- Mark all articles in the current (sub-)thread as read
- (@code{gnus-summary-kill-thread}). If the prefix argument is positive,
- remove all marks instead. If the prefix argument is negative, tick
- articles instead.
- @item T l
- @itemx C-M-l
- @kindex T l @r{(Summary)}
- @kindex C-M-l @r{(Summary)}
- @findex gnus-summary-lower-thread
- Lower the score of the current (sub-)thread
- (@code{gnus-summary-lower-thread}).
- @item T i
- @kindex T i @r{(Summary)}
- @findex gnus-summary-raise-thread
- Increase the score of the current (sub-)thread
- (@code{gnus-summary-raise-thread}).
- @item T #
- @kindex T # @r{(Summary)}
- @findex gnus-uu-mark-thread
- Set the process mark on the current (sub-)thread
- (@code{gnus-uu-mark-thread}).
- @item T M-#
- @kindex T M-# @r{(Summary)}
- @findex gnus-uu-unmark-thread
- Remove the process mark from the current (sub-)thread
- (@code{gnus-uu-unmark-thread}).
- @item T T
- @kindex T T @r{(Summary)}
- @findex gnus-summary-toggle-threads
- Toggle threading (@code{gnus-summary-toggle-threads}).
- @item T s
- @kindex T s @r{(Summary)}
- @findex gnus-summary-show-thread
- Expose the (sub-)thread hidden under the current article, if any
- (@code{gnus-summary-show-thread}).
- @item T h
- @kindex T h @r{(Summary)}
- @findex gnus-summary-hide-thread
- Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
- @item T S
- @kindex T S @r{(Summary)}
- @findex gnus-summary-show-all-threads
- Expose all hidden threads (@code{gnus-summary-show-all-threads}).
- @item T H
- @kindex T H @r{(Summary)}
- @findex gnus-summary-hide-all-threads
- Hide all threads (@code{gnus-summary-hide-all-threads}).
- @item T t
- @kindex T t @r{(Summary)}
- @findex gnus-summary-rethread-current
- Re-thread the current article's thread
- (@code{gnus-summary-rethread-current}). This works even when the
- summary buffer is otherwise unthreaded.
- @item T ^
- @kindex T ^ @r{(Summary)}
- @findex gnus-summary-reparent-thread
- Make the current article the child of the marked (or previous) article
- (@code{gnus-summary-reparent-thread}).
- @end table
- The following commands are thread movement commands. They all
- understand the numeric prefix.
- @table @kbd
- @item T n
- @kindex T n @r{(Summary)}
- @itemx C-M-n
- @kindex C-M-n @r{(Summary)}
- @itemx M-down
- @kindex M-down @r{(Summary)}
- @findex gnus-summary-next-thread
- Go to the next thread (@code{gnus-summary-next-thread}).
- @item T p
- @kindex T p @r{(Summary)}
- @itemx C-M-p
- @kindex C-M-p @r{(Summary)}
- @itemx M-up
- @kindex M-up @r{(Summary)}
- @findex gnus-summary-prev-thread
- Go to the previous thread (@code{gnus-summary-prev-thread}).
- @item T d
- @kindex T d @r{(Summary)}
- @findex gnus-summary-down-thread
- Descend the thread (@code{gnus-summary-down-thread}).
- @item T u
- @kindex T u @r{(Summary)}
- @findex gnus-summary-up-thread
- Ascend the thread (@code{gnus-summary-up-thread}).
- @item T o
- @kindex T o @r{(Summary)}
- @findex gnus-summary-top-thread
- Go to the top of the thread (@code{gnus-summary-top-thread}).
- @end table
- @vindex gnus-thread-operation-ignore-subject
- If you ignore subject while threading, you'll naturally end up with
- threads that have several different subjects in them. If you then issue
- a command like @kbd{T k} (@code{gnus-summary-kill-thread}) you might not
- wish to kill the entire thread, but just those parts of the thread that
- have the same subject as the current article. If you like this idea,
- you can fiddle with @code{gnus-thread-operation-ignore-subject}. If it
- is non-@code{nil} (which it is by default), subjects will be ignored
- when doing thread commands. If this variable is @code{nil}, articles in
- the same thread with different subjects will not be included in the
- operation in question. If this variable is @code{fuzzy}, only articles
- that have subjects fuzzily equal will be included (@pxref{Fuzzy
- Matching}).
- @node Sorting
- @section Sorting
- @findex gnus-thread-sort-by-total-score
- @findex gnus-thread-sort-by-date
- @findex gnus-thread-sort-by-score
- @findex gnus-thread-sort-by-subject
- @findex gnus-thread-sort-by-author
- @findex gnus-thread-sort-by-number
- @vindex gnus-thread-sort-functions
- If you are using a threaded summary display, you can sort the threads by
- setting @code{gnus-thread-sort-functions}, which can be either a single
- function, a list of functions, or a list containing functions and
- @code{(not some-function)} elements.
- By default, sorting is done on article numbers. Ready-made sorting
- predicate functions include @code{gnus-thread-sort-by-number},
- @code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
- @code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, and
- @code{gnus-thread-sort-by-total-score}.
- Each function takes two threads and returns non-@code{nil} if the first
- thread should be sorted before the other. Note that sorting really is
- normally done by looking only at the roots of each thread.
- If you use more than one function, the primary sort key should be the
- last function in the list. You should probably always include
- @code{gnus-thread-sort-by-number} in the list of sorting
- functions---preferably first. This will ensure that threads that are
- equal with respect to the other sort criteria will be displayed in
- ascending article order.
- If you would like to sort by reverse score, then by subject, and finally
- by number, you could do something like:
- @lisp
- (setq gnus-thread-sort-functions
- '(gnus-thread-sort-by-number
- gnus-thread-sort-by-subject
- (not gnus-thread-sort-by-total-score)))
- @end lisp
- The threads that have highest score will be displayed first in the
- summary buffer. When threads have the same score, they will be sorted
- alphabetically. The threads that have the same score and the same
- subject will be sorted by number, which is (normally) the sequence in
- which the articles arrived.
- If you want to sort by score and then reverse arrival order, you could
- say something like:
- @lisp
- (setq gnus-thread-sort-functions
- '((lambda (t1 t2)
- (not (gnus-thread-sort-by-number t1 t2)))
- gnus-thread-sort-by-score))
- @end lisp
- @vindex gnus-thread-score-function
- The function in the @code{gnus-thread-score-function} variable (default
- @code{+}) is used for calculating the total score of a thread. Useful
- functions might be @code{max}, @code{min}, or squared means, or whatever
- tickles your fancy.
- @findex gnus-article-sort-functions
- @findex gnus-article-sort-by-date
- @findex gnus-article-sort-by-score
- @findex gnus-article-sort-by-subject
- @findex gnus-article-sort-by-author
- @findex gnus-article-sort-by-number
- If you are using an unthreaded display for some strange reason or other,
- you have to fiddle with the @code{gnus-article-sort-functions} variable.
- It is very similar to the @code{gnus-thread-sort-functions}, except that
- it uses slightly different functions for article comparison. Available
- sorting predicate functions are @code{gnus-article-sort-by-number},
- @code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject},
- @code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}.
- If you want to sort an unthreaded summary display by subject, you could
- say something like:
- @lisp
- (setq gnus-article-sort-functions
- '(gnus-article-sort-by-number
- gnus-article-sort-by-subject))
- @end lisp
- @node Asynchronous Fetching
- @section Asynchronous Article Fetching
- @cindex asynchronous article fetching
- @cindex article pre-fetch
- @cindex pre-fetch
- If you read your news from an @sc{nntp} server that's far away, the
- network latencies may make reading articles a chore. You have to wait
- for a while after pressing @kbd{n} to go to the next article before the
- article appears. Why can't Gnus just go ahead and fetch the article
- while you are reading the previous one? Why not, indeed.
- First, some caveats. There are some pitfalls to using asynchronous
- article fetching, especially the way Gnus does it.
- Let's say you are reading article 1, which is short, and article 2 is
- quite long, and you are not interested in reading that. Gnus does not
- know this, so it goes ahead and fetches article 2. You decide to read
- article 3, but since Gnus is in the process of fetching article 2, the
- connection is blocked.
- To avoid these situations, Gnus will open two (count 'em two)
- connections to the server. Some people may think this isn't a very nice
- thing to do, but I don't see any real alternatives. Setting up that
- extra connection takes some time, so Gnus startup will be slower.
- Gnus will fetch more articles than you will read. This will mean that
- the link between your machine and the @sc{nntp} server will become more
- loaded than if you didn't use article pre-fetch. The server itself will
- also become more loaded---both with the extra article requests, and the
- extra connection.
- Ok, so now you know that you shouldn't really use this thing... unless
- you really want to.
- @vindex gnus-asynchronous
- Here's how: Set @code{gnus-asynchronous} to @code{t}. The rest should
- happen automatically.
- @vindex gnus-use-article-prefetch
- You can control how many articles are to be pre-fetched by setting
- @code{gnus-use-article-prefetch}. This is 30 by default, which means
- that when you read an article in the group, the back end will pre-fetch
- the next 30 articles. If this variable is @code{t}, the back end will
- pre-fetch all the articles it can without bound. If it is
- @code{nil}, no pre-fetching will be done.
- @vindex gnus-async-prefetch-article-p
- @findex gnus-async-read-p
- There are probably some articles that you don't want to pre-fetch---read
- articles, for instance. The @code{gnus-async-prefetch-article-p} variable controls whether an article is to be pre-fetched. This function should
- return non-@code{nil} when the article in question is to be
- pre-fetched. The default is @code{gnus-async-read-p}, which returns
- @code{nil} on read articles. The function is called with an article
- data structure as the only parameter.
- If, for instance, you wish to pre-fetch only unread articles shorter than 100 lines, you could say something like:
- @lisp
- (defun my-async-short-unread-p (data)
- "Return non-nil for short, unread articles."
- (and (gnus-data-unread-p data)
- (< (mail-header-lines (gnus-data-header data))
- 100)))
- (setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
- @end lisp
- These functions will be called many, many times, so they should
- preferably be short and sweet to avoid slowing down Gnus too much.
- It's probably a good idea to byte-compile things like this.
- @vindex gnus-prefetched-article-deletion-strategy
- Articles have to be removed from the asynch buffer sooner or later. The
- @code{gnus-prefetched-article-deletion-strategy} says when to remove
- articles. This is a list that may contain the following elements:
- @table @code
- @item read
- Remove articles when they are read.
- @item exit
- Remove articles when exiting the group.
- @end table
- The default value is @code{(read exit)}.
- @c @vindex gnus-use-header-prefetch
- @c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
- @c from the next group.
- @node Article Caching
- @section Article Caching
- @cindex article caching
- @cindex caching
- If you have an @emph{extremely} slow @sc{nntp} connection, you may
- consider turning article caching on. Each article will then be stored
- locally under your home directory. As you may surmise, this could
- potentially use @emph{huge} amounts of disk space, as well as eat up all
- your inodes so fast it will make your head swim. In vodka.
- Used carefully, though, it could be just an easier way to save articles.
- @vindex gnus-use-long-file-name
- @vindex gnus-cache-directory
- @vindex gnus-use-cache
- To turn caching on, set @code{gnus-use-cache} to @code{t}. By default,
- all articles ticked or marked as dormant will then be copied
- over to your local cache (@code{gnus-cache-directory}). Whether this
- cache is flat or hierarchical is controlled by the
- @code{gnus-use-long-file-name} variable, as usual.
- When re-selecting a ticked or dormant article, it will be fetched from the
- cache instead of from the server. As articles in your cache will never
- expire, this might serve as a method of saving articles while still
- keeping them where they belong. Just mark all articles you want to save
- as dormant, and don't worry.
- When an article is marked as read, is it removed from the cache.
- @vindex gnus-cache-remove-articles
- @vindex gnus-cache-enter-articles
- The entering/removal of articles from the cache is controlled by the
- @code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
- variables. Both are lists of symbols. The first is @code{(ticked
- dormant)} by default, meaning that ticked and dormant articles will be
- put in the cache. The latter is @code{(read)} by default, meaning that
- articles marked as read are removed from the cache. Possibly
- symbols in these two lists are @code{ticked}, @code{dormant},
- @code{unread} and @code{read}.
- @findex gnus-jog-cache
- So where does the massive article-fetching and storing come into the
- picture? The @code{gnus-jog-cache} command will go through all
- subscribed newsgroups, request all unread articles, score them, and
- store them in the cache. You should only ever, ever ever ever, use this
- command if 1) your connection to the @sc{nntp} server is really, really,
- really slow and 2) you have a really, really, really huge disk.
- Seriously. One way to cut down on the number of articles downloaded is
- to score unwanted articles down and have them marked as read. They will
- not then be downloaded by this command.
- @vindex gnus-uncacheable-groups
- @vindex gnus-cacheable-groups
- It is likely that you do not want caching on all groups. For instance,
- if your @code{nnml} mail is located under your home directory, it makes no
- sense to cache it somewhere else under your home directory. Unless you
- feel that it's neat to use twice as much space.
- To limit the caching, you could set @code{gnus-cacheable-groups} to a
- regexp of groups to cache, @samp{^nntp} for instance, or set the
- @code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance.
- Both variables are @code{nil} by default. If a group matches both
- variables, the group is not cached.
- @findex gnus-cache-generate-nov-databases
- @findex gnus-cache-generate-active
- @vindex gnus-cache-active-file
- The cache stores information on what articles it contains in its active
- file (@code{gnus-cache-active-file}). If this file (or any other parts
- of the cache) becomes all messed up for some reason or other, Gnus
- offers two functions that will try to set things right. @kbd{M-x
- gnus-cache-generate-nov-databases} will (re)build all the @sc{nov}
- files, and @kbd{gnus-cache-generate-active} will (re)generate the active
- file.
- @node Persistent Articles
- @section Persistent Articles
- @cindex persistent articles
- Closely related to article caching, we have @dfn{persistent articles}.
- In fact, it's just a different way of looking at caching, and much more
- useful in my opinion.
- Say you're reading a newsgroup, and you happen on to some valuable gem
- that you want to keep and treasure forever. You'd normally just save it
- (using one of the many saving commands) in some file. The problem with
- that is that it's just, well, yucky. Ideally you'd prefer just having
- the article remain in the group where you found it forever; untouched by
- the expiry going on at the news server.
- This is what a @dfn{persistent article} is---an article that just won't
- be deleted. It's implemented using the normal cache functions, but
- you use two explicit commands for managing persistent articles:
- @table @kbd
- @item *
- @kindex * @r{(Summary)}
- @findex gnus-cache-enter-article
- Make the current article persistent (@code{gnus-cache-enter-article}).
- @item M-*
- @kindex M-* @r{(Summary)}
- @findex gnus-cache-remove-article
- Remove the current article from the persistent articles
- (@code{gnus-cache-remove-article}). This will normally delete the
- article.
- @end table
- Both these commands understand the process/prefix convention.
- To avoid having all ticked articles (and stuff) entered into the cache,
- you should set @code{gnus-use-cache} to @code{passive} if you're just
- interested in persistent articles:
- @lisp
- (setq gnus-use-cache 'passive)
- @end lisp
- @node Article Backlog
- @section Article Backlog
- @cindex backlog
- @cindex article backlog
- If you have a slow connection, but the idea of using caching seems
- unappealing to you (and it is, really), you can help the situation some
- by switching on the @dfn{backlog}. This is where Gnus will buffer
- already read articles so that it doesn't have to re-fetch articles
- you've already read. This only helps if you are in the habit of
- re-selecting articles you've recently read, of course. If you never do
- that, turning the backlog on will slow Gnus down a little bit, and
- increase memory usage some.
- @vindex gnus-keep-backlog
- If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
- at most @var{n} old articles in a buffer for later re-fetching. If this
- variable is non-@code{nil} and is not a number, Gnus will store
- @emph{all} read articles, which means that your Emacs will grow without
- bound before exploding and taking your machine down with you. I put
- that in there just to keep y'all on your toes.
- This variable is @code{nil} by default.
- @node Saving Articles
- @section Saving Articles
- @cindex saving articles
- Gnus can save articles in a number of ways. Below is the documentation
- for saving articles in a fairly straight-forward fashion (i.e., little
- processing of the article is done before it is saved). For a different
- approach (uudecoding, unsharing) you should use @code{gnus-uu}
- (@pxref{Decoding Articles}).
- @vindex gnus-save-all-headers
- If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
- unwanted headers before saving the article.
- @vindex gnus-saved-headers
- If the preceding variable is @code{nil}, all headers that match the
- @code{gnus-saved-headers} regexp will be kept, while the rest will be
- deleted before saving.
- @table @kbd
- @item O o
- @itemx o
- @kindex O o @r{(Summary)}
- @kindex o @r{(Summary)}
- @findex gnus-summary-save-article
- @c @icon{gnus-summary-save-article}
- Save the current article using the default article saver
- (@code{gnus-summary-save-article}).
- @item O m
- @kindex O m @r{(Summary)}
- @findex gnus-summary-save-article-mail
- Save the current article in mail format
- (@code{gnus-summary-save-article-mail}).
- @item O r
- @kindex O r @r{(Summary)}
- @findex gnus-summary-save-article-rmail
- Save the current article in rmail format
- (@code{gnus-summary-save-article-rmail}).
- @item O f
- @kindex O f @r{(Summary)}
- @findex gnus-summary-save-article-file
- @c @icon{gnus-summary-save-article-file}
- Save the current article in plain file format
- (@code{gnus-summary-save-article-file}).
- @item O F
- @kindex O F @r{(Summary)}
- @findex gnus-summary-write-article-file
- Write the current article in plain file format, overwriting any previous
- file contents (@code{gnus-summary-write-article-file}).
- @item O b
- @kindex O b @r{(Summary)}
- @findex gnus-summary-save-article-body-file
- Save the current article body in plain file format
- (@code{gnus-summary-save-article-body-file}).
- @item O h
- @kindex O h @r{(Summary)}
- @findex gnus-summary-save-article-folder
- Save the current article in mh folder format
- (@code{gnus-summary-save-article-folder}).
- @item O v
- @kindex O v @r{(Summary)}
- @findex gnus-summary-save-article-vm
- Save the current article in a VM folder
- (@code{gnus-summary-save-article-vm}).
- @item O p
- @kindex O p @r{(Summary)}
- @findex gnus-summary-pipe-output
- Save the current article in a pipe. Uhm, like, what I mean is---Pipe
- the current article to a process (@code{gnus-summary-pipe-output}).
- @end table
- @vindex gnus-prompt-before-saving
- All these commands use the process/prefix convention
- (@pxref{Process/Prefix}). If you save bunches of articles using these
- functions, you might get tired of being prompted for files to save each
- and every article in. The prompting action is controlled by
- the @code{gnus-prompt-before-saving} variable, which is @code{always} by
- default, giving you that excessive prompting action you know and
- loathe. If you set this variable to @code{t} instead, you'll be prompted
- just once for each series of articles you save. If you like to really
- have Gnus do all your thinking for you, you can even set this variable
- to @code{nil}, which means that you will never be prompted for files to
- save articles in. Gnus will simply save all the articles in the default
- files.
- @vindex gnus-default-article-saver
- You can customize the @code{gnus-default-article-saver} variable to make
- Gnus do what you want it to. You can use any of the six ready-made
- functions below, or you can create your own.
- @table @code
- @item gnus-summary-save-in-rmail
- @findex gnus-summary-save-in-rmail
- @vindex gnus-rmail-save-name
- @findex gnus-plain-save-name
- This is the default format, @dfn{babyl}. Uses the function in the
- @code{gnus-rmail-save-name} variable to get a file name to save the
- article in. The default is @code{gnus-plain-save-name}.
- @item gnus-summary-save-in-mail
- @findex gnus-summary-save-in-mail
- @vindex gnus-mail-save-name
- Save in a Unix mail (mbox) file. Uses the function in the
- @code{gnus-mail-save-name} variable to get a file name to save the
- article in. The default is @code{gnus-plain-save-name}.
- @item gnus-summary-save-in-file
- @findex gnus-summary-save-in-file
- @vindex gnus-file-save-name
- @findex gnus-numeric-save-name
- Append the article straight to an ordinary file. Uses the function in
- the @code{gnus-file-save-name} variable to get a file name to save the
- article in. The default is @code{gnus-numeric-save-name}.
- @item gnus-summary-save-body-in-file
- @findex gnus-summary-save-body-in-file
- Append the article body to an ordinary file. Uses the function in the
- @code{gnus-file-save-name} variable to get a file name to save the
- article in. The default is @code{gnus-numeric-save-name}.
- @item gnus-summary-save-in-folder
- @findex gnus-summary-save-in-folder
- @findex gnus-folder-save-name
- @findex gnus-Folder-save-name
- @vindex gnus-folder-save-name
- @cindex rcvstore
- @cindex MH folders
- Save the article to an MH folder using @code{rcvstore} from the MH
- library. Uses the function in the @code{gnus-folder-save-name} variable
- to get a file name to save the article in. The default is
- @code{gnus-folder-save-name}, but you can also use
- @code{gnus-Folder-save-name}, which creates capitalized names.
- @item gnus-summary-save-in-vm
- @findex gnus-summary-save-in-vm
- Save the article in a VM folder. You have to have the VM mail
- reader to use this setting.
- @end table
- @vindex gnus-article-save-directory
- All of these functions, except for the last one, will save the article
- in the @code{gnus-article-save-directory}, which is initialized from the
- @code{SAVEDIR} environment variable. This is @file{~/News/} by
- default.
- As you can see above, the functions use different functions to find a
- suitable name of a file to save the article in. Below is a list of
- available functions that generate names:
- @table @code
- @item gnus-Numeric-save-name
- @findex gnus-Numeric-save-name
- File names like @file{~/News/Alt.andrea-dworkin/45}.
- @item gnus-numeric-save-name
- @findex gnus-numeric-save-name
- File names like @file{~/News/alt.andrea-dworkin/45}.
- @item gnus-Plain-save-name
- @findex gnus-Plain-save-name
- File names like @file{~/News/Alt.andrea-dworkin}.
- @item gnus-plain-save-name
- @findex gnus-plain-save-name
- File names like @file{~/News/alt.andrea-dworkin}.
- @end table
- @vindex gnus-split-methods
- You can have Gnus suggest where to save articles by plonking a regexp into
- the @code{gnus-split-methods} alist. For instance, if you would like to
- save articles related to Gnus in the file @file{gnus-stuff}, and articles
- related to VM in @code{vm-stuff}, you could set this variable to something
- like:
- @lisp
- (("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
- ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
- (my-choosing-function "../other-dir/my-stuff")
- ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
- @end lisp
- We see that this is a list where each element is a list that has two
- elements---the @dfn{match} and the @dfn{file}. The match can either be
- a string (in which case it is used as a regexp to match on the article
- head); it can be a symbol (which will be called as a function with the
- group name as a parameter); or it can be a list (which will be
- @code{eval}ed). If any of these actions have a non-@code{nil} result,
- the @dfn{file} will be used as a default prompt. In addition, the
- result of the operation itself will be used if the function or form
- called returns a string or a list of strings.
- You basically end up with a list of file names that might be used when
- saving the current article. (All ``matches'' will be used.) You will
- then be prompted for what you really want to use as a name, with file
- name completion over the results from applying this variable.
- This variable is @code{((gnus-article-archive-name))} by default, which
- means that Gnus will look at the articles it saves for an
- @code{Archive-name} line and use that as a suggestion for the file
- name.
- Here's an example function to clean up file names somewhat. If you have
- lots of mail groups called things like
- @samp{nnml:mail.whatever}, you may want to chop off the beginning of
- these group names before creating the file name to save to. The
- following will do just that:
- @lisp
- (defun my-save-name (group)
- (when (string-match "^nnml:mail." group)
- (substring group (match-end 0))))
- (setq gnus-split-methods
- '((gnus-article-archive-name)
- (my-save-name)))
- @end lisp
- @vindex gnus-use-long-file-name
- Finally, you have the @code{gnus-use-long-file-name} variable. If it is
- @code{nil}, all the preceding functions will replace all periods
- (@samp{.}) in the group names with slashes (@samp{/})---which means that
- the functions will generate hierarchies of directories instead of having
- all the files in the top level directory
- (@file{~/News/alt/andrea-dworkin} instead of
- @file{~/News/alt.andrea-dworkin}.) This variable is @code{t} by default
- on most systems. However, for historical reasons, this is @code{nil} on
- Xenix and usg-unix-v machines by default.
- This function also affects kill and score file names. If this variable
- is a list, and the list contains the element @code{not-score}, long file
- names will not be used for score files, if it contains the element
- @code{not-save}, long file names will not be used for saving, and if it
- contains the element @code{not-kill}, long file names will not be used
- for kill files.
- If you'd like to save articles in a hierarchy that looks something like
- a spool, you could
- @lisp
- (setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy
- (setq gnus-default-article-saver
- 'gnus-summary-save-in-file) ; no encoding
- @end lisp
- Then just save with @kbd{o}. You'd then read this hierarchy with
- ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
- the top level directory as the argument (@file{~/News/}). Then just walk
- around to the groups/directories with @code{nneething}.
- @node Decoding Articles
- @section Decoding Articles
- @cindex decoding articles
- Sometime users post articles (or series of articles) that have been
- encoded in some way or other. Gnus can decode them for you.
- @menu
- * Uuencoded Articles:: Uudecode articles.
- * Shell Archives:: Unshar articles.
- * PostScript Files:: Split PostScript.
- * Other Files:: Plain save and binhex.
- * Decoding Variables:: Variables for a happy decoding.
- * Viewing Files:: You want to look at the result of the decoding?
- @end menu
- @cindex series
- @cindex article series
- All these functions use the process/prefix convention
- (@pxref{Process/Prefix}) for finding out what articles to work on, with
- the extension that a ``single article'' means ``a single series''. Gnus
- can find out by itself what articles belong to a series, decode all the
- articles and unpack/view/save the resulting file(s).
- Gnus guesses what articles are in the series according to the following
- simplish rule: The subjects must be (nearly) identical, except for the
- last two numbers of the line. (Spaces are largely ignored, however.)
- For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus
- will find all the articles that match the regexp @samp{^cat.gif
- ([0-9]+/[0-9]+).*$}.
- Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a
- series}, will not be properly recognized by any of the automatic viewing
- commands, and you have to mark the articles manually with @kbd{#}.
- @node Uuencoded Articles
- @subsection Uuencoded Articles
- @cindex uudecode
- @cindex uuencoded articles
- @table @kbd
- @item X u
- @kindex X u @r{(Summary)}
- @findex gnus-uu-decode-uu
- @c @icon{gnus-uu-decode-uu}
- Uudecodes the current series (@code{gnus-uu-decode-uu}).
- @item X U
- @kindex X U @r{(Summary)}
- @findex gnus-uu-decode-uu-and-save
- Uudecodes and saves the current series
- (@code{gnus-uu-decode-uu-and-save}).
- @item X v u
- @kindex X v u @r{(Summary)}
- @findex gnus-uu-decode-uu-view
- Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
- @item X v U
- @kindex X v U @r{(Summary)}
- @findex gnus-uu-decode-uu-and-save-view
- Uudecodes, views and saves the current series
- (@code{gnus-uu-decode-uu-and-save-view}).
- @end table
- Remember that these all react to the presence of articles marked with
- the process mark. If, for instance, you'd like to decode and save an
- entire newsgroup, you'd typically do @kbd{M P a}
- (@code{gnus-uu-mark-all}) and then @kbd{X U}
- (@code{gnus-uu-decode-uu-and-save}).
- All this is very much different from how @code{gnus-uu} worked with
- @sc{gnus 4.1}, where you had explicit keystrokes for everything under
- the sun. This version of @code{gnus-uu} generally assumes that you mark
- articles in some way (@pxref{Setting Process Marks}) and then press
- @kbd{X u}.
- @vindex gnus-uu-notify-files
- Note: When trying to decode articles that have names matching
- @code{gnus-uu-notify-files}, which is hard-coded to
- @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
- automatically post an article on @samp{comp.unix.wizards} saying that
- you have just viewed the file in question. This feature can't be turned
- off.
- @node Shell Archives
- @subsection Shell Archives
- @cindex unshar
- @cindex shell archives
- @cindex shared articles
- Shell archives (``shar files'') used to be a popular way to distribute
- sources, but it isn't used all that much today. In any case, we have
- some commands to deal with these:
- @table @kbd
- @item X s
- @kindex X s @r{(Summary)}
- @findex gnus-uu-decode-unshar
- Unshars the current series (@code{gnus-uu-decode-unshar}).
- @item X S
- @kindex X S @r{(Summary)}
- @findex gnus-uu-decode-unshar-and-save
- Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
- @item X v s
- @kindex X v s @r{(Summary)}
- @findex gnus-uu-decode-unshar-view
- Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
- @item X v S
- @kindex X v S @r{(Summary)}
- @findex gnus-uu-decode-unshar-and-save-view
- Unshars, views and saves the current series
- (@code{gnus-uu-decode-unshar-and-save-view}).
- @end table
- @node PostScript Files
- @subsection PostScript Files
- @cindex PostScript
- @table @kbd
- @item X p
- @kindex X p @r{(Summary)}
- @findex gnus-uu-decode-postscript
- Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
- @item X P
- @kindex X P @r{(Summary)}
- @findex gnus-uu-decode-postscript-and-save
- Unpack and save the current PostScript series
- (@code{gnus-uu-decode-postscript-and-save}).
- @item X v p
- @kindex X v p @r{(Summary)}
- @findex gnus-uu-decode-postscript-view
- View the current PostScript series
- (@code{gnus-uu-decode-postscript-view}).
- @item X v P
- @kindex X v P @r{(Summary)}
- @findex gnus-uu-decode-postscript-and-save-view
- View and save the current PostScript series
- (@code{gnus-uu-decode-postscript-and-save-view}).
- @end table
- @node Other Files
- @subsection Other Files
- @table @kbd
- @item X o
- @kindex X o @r{(Summary)}
- @findex gnus-uu-decode-save
- Save the current series
- (@code{gnus-uu-decode-save}).
- @item X b
- @kindex X b @r{(Summary)}
- @findex gnus-uu-decode-binhex
- Unbinhex the current series (@code{gnus-uu-decode-binhex}). This
- doesn't really work yet.
- @end table
- @node Decoding Variables
- @subsection Decoding Variables
- Adjective, not verb.
- @menu
- * Rule Variables:: Variables that say how a file is to be viewed.
- * Other Decode Variables:: Other decode variables.
- * Uuencoding and Posting:: Variables for customizing uuencoding.
- @end menu
- @node Rule Variables
- @subsubsection Rule Variables
- @cindex rule variables
- Gnus uses @dfn{rule variables} to decide how to view a file. All these
- variables are of the form
- @lisp
- (list '(regexp1 command2)
- '(regexp2 command2)
- ...)
- @end lisp
- @table @code
- @item gnus-uu-user-view-rules
- @vindex gnus-uu-user-view-rules
- @cindex sox
- This variable is consulted first when viewing files. If you wish to use,
- for instance, @code{sox} to convert an @samp{.au} sound file, you could
- say something like:
- @lisp
- (setq gnus-uu-user-view-rules
- (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio")))
- @end lisp
- @item gnus-uu-user-view-rules-end
- @vindex gnus-uu-user-view-rules-end
- This variable is consulted if Gnus couldn't make any matches from the
- user and default view rules.
- @item gnus-uu-user-archive-rules
- @vindex gnus-uu-user-archive-rules
- This variable can be used to say what commands should be used to unpack
- archives.
- @end table
- @node Other Decode Variables
- @subsubsection Other Decode Variables
- @table @code
- @vindex gnus-uu-grabbed-file-functions
- @item gnus-uu-grabbed-file-functions
- All functions in this list will be called right after each file has been
- successfully decoded---so that you can move or view files right away,
- and don't have to wait for all files to be decoded before you can do
- anything. Ready-made functions you can put in this list are:
- @table @code
- @item gnus-uu-grab-view
- @findex gnus-uu-grab-view
- View the file.
- @item gnus-uu-grab-move
- @findex gnus-uu-grab-move
- Move the file (if you're using a saving function.)
- @end table
- @item gnus-uu-be-dangerous
- @vindex gnus-uu-be-dangerous
- Specifies what to do if unusual situations arise during decoding. If
- @code{nil}, be as conservative as possible. If @code{t}, ignore things
- that didn't work, and overwrite existing files. Otherwise, ask each
- time.
- @item gnus-uu-ignore-files-by-name
- @vindex gnus-uu-ignore-files-by-name
- Files with name matching this regular expression won't be viewed.
- @item gnus-uu-ignore-files-by-type
- @vindex gnus-uu-ignore-files-by-type
- Files with a @sc{mime} type matching this variable won't be viewed.
- Note that Gnus tries to guess what type the file is based on the name.
- @code{gnus-uu} is not a @sc{mime} package (yet), so this is slightly
- kludgey.
- @item gnus-uu-tmp-dir
- @vindex gnus-uu-tmp-dir
- Where @code{gnus-uu} does its work.
- @item gnus-uu-do-not-unpack-archives
- @vindex gnus-uu-do-not-unpack-archives
- Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
- looking for files to display.
- @item gnus-uu-view-and-save
- @vindex gnus-uu-view-and-save
- Non-@code{nil} means that the user will always be asked to save a file
- after viewing it.
- @item gnus-uu-ignore-default-view-rules
- @vindex gnus-uu-ignore-default-view-rules
- Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
- rules.
- @item gnus-uu-ignore-default-archive-rules
- @vindex gnus-uu-ignore-default-archive-rules
- Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
- unpacking commands.
- @item gnus-uu-kill-carriage-return
- @vindex gnus-uu-kill-carriage-return
- Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
- from articles.
- @item gnus-uu-unmark-articles-not-decoded
- @vindex gnus-uu-unmark-articles-not-decoded
- Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully
- decoded articles as unread.
- @item gnus-uu-correct-stripped-uucode
- @vindex gnus-uu-correct-stripped-uucode
- Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
- uuencoded files that have had trailing spaces deleted.
- @item gnus-uu-pre-uudecode-hook
- @vindex gnus-uu-pre-uudecode-hook
- Hook run before sending a message to @code{uudecode}.
- @item gnus-uu-view-with-metamail
- @vindex gnus-uu-view-with-metamail
- @cindex metamail
- Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
- commands defined by the rule variables and just fudge a @sc{mime}
- content type based on the file name. The result will be fed to
- @code{metamail} for viewing.
- @item gnus-uu-save-in-digest
- @vindex gnus-uu-save-in-digest
- Non-@code{nil} means that @code{gnus-uu}, when asked to save without
- decoding, will save in digests. If this variable is @code{nil},
- @code{gnus-uu} will just save everything in a file without any
- embellishments. The digesting almost conforms to RFC 1153---no easy way
- to specify any meaningful volume and issue numbers were found, so I
- simply dropped them.
- @end table
- @node Uuencoding and Posting
- @subsubsection Uuencoding and Posting
- @table @code
- @item gnus-uu-post-include-before-composing
- @vindex gnus-uu-post-include-before-composing
- Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
- before you compose the article. If this variable is @code{t}, you can
- either include an encoded file with @kbd{C-c C-i} or have one included
- for you when you post the article.
- @item gnus-uu-post-length
- @vindex gnus-uu-post-length
- Maximum length of an article. The encoded file will be split into how
- many articles it takes to post the entire file.
- @item gnus-uu-post-threaded
- @vindex gnus-uu-post-threaded
- Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
- thread. This may not be smart, as no other decoder I have seen is able
- to follow threads when collecting uuencoded articles. (Well, I have
- seen one package that does that---@code{gnus-uu}, but somehow, I don't
- think that counts...) Default is @code{nil}.
- @item gnus-uu-post-separate-description
- @vindex gnus-uu-post-separate-description
- Non-@code{nil} means that the description will be posted in a separate
- article. The first article will typically be numbered (0/x). If this
- variable is @code{nil}, the description the user enters will be included
- at the beginning of the first article, which will be numbered (1/x).
- Default is @code{t}.
- @end table
- @node Viewing Files
- @subsection Viewing Files
- @cindex viewing files
- @cindex pseudo-articles
- After decoding, if the file is some sort of archive, Gnus will attempt
- to unpack the archive and see if any of the files in the archive can be
- viewed. For instance, if you have a gzipped tar file @file{pics.tar.gz}
- containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will
- uncompress and de-tar the main file, and then view the two pictures.
- This unpacking process is recursive, so if the archive contains archives
- of archives, it'll all be unpacked.
- Finally, Gnus will normally insert a @dfn{pseudo-article} for each
- extracted file into the summary buffer. If you go to these
- ``articles'', you will be prompted for a command to run (usually Gnus
- will make a suggestion), and then the command will be run.
- @vindex gnus-view-pseudo-asynchronously
- If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
- until the viewing is done before proceeding.
- @vindex gnus-view-pseudos
- If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
- the pseudo-articles into the summary buffer, but view them
- immediately. If this variable is @code{not-confirm}, the user won't even
- be asked for a confirmation before viewing is done.
- @vindex gnus-view-pseudos-separately
- If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
- pseudo-article will be created for each file to be viewed. If
- @code{nil}, all files that use the same viewing command will be given as
- a list of parameters to that command.
- @vindex gnus-insert-pseudo-articles
- If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
- pseudo-articles when decoding. It is @code{t} by default.
- So; there you are, reading your @emph{pseudo-articles} in your
- @emph{virtual newsgroup} from the @emph{virtual server}; and you think:
- Why isn't anything real anymore? How did we get here?
- @node Article Treatment
- @section Article Treatment
- Reading through this huge manual, you may have quite forgotten that the
- object of newsreaders is to actually, like, read what people have
- written. Reading articles. Unfortunately, people are quite bad at
- writing, so there are tons of functions and variables to make reading
- these articles easier.
- @menu
- * Article Highlighting:: You want to make the article look like fruit salad.
- * Article Fontisizing:: Making emphasized text look nice.
- * Article Hiding:: You also want to make certain info go away.
- * Article Washing:: Lots of way-neat functions to make life better.
- * Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
- * Article Date:: Grumble, UT!
- * Article Signature:: What is a signature?
- * Article Miscellania:: Various other stuff.
- @end menu
- @node Article Highlighting
- @subsection Article Highlighting
- @cindex highlighting
- Not only do you want your article buffer to look like fruit salad, but
- you want it to look like technicolor fruit salad.
- @table @kbd
- @item W H a
- @kindex W H a @r{(Summary)}
- @findex gnus-article-highlight
- @findex gnus-article-maybe-highlight
- Do much highlighting of the current article
- (@code{gnus-article-highlight}). This function highlights header, cited
- text, the signature, and adds buttons to the body and the head.
- @item W H h
- @kindex W H h @r{(Summary)}
- @findex gnus-article-highlight-headers
- @vindex gnus-header-face-alist
- Highlight the headers (@code{gnus-article-highlight-headers}). The
- highlighting will be done according to the @code{gnus-header-face-alist}
- variable, which is a list where each element has the form
- @code{(@var{regexp} @var{name} @var{content})}.
- @var{regexp} is a regular expression for matching the
- header, @var{name} is the face used for highlighting the header name
- (@pxref{Faces and Fonts}) and @var{content} is the face for highlighting
- the header value. The first match made will be used. Note that
- @var{regexp} shouldn't have @samp{^} prepended---Gnus will add one.
- @item W H c
- @kindex W H c @r{(Summary)}
- @findex gnus-article-highlight-citation
- Highlight cited text (@code{gnus-article-highlight-citation}).
- Some variables to customize the citation highlights:
- @table @code
- @vindex gnus-cite-parse-max-size
- @item gnus-cite-parse-max-size
- If the article size if bigger than this variable (which is 25000 by
- default), no citation highlighting will be performed.
- @item gnus-cite-prefix-regexp
- @vindex gnus-cite-prefix-regexp
- Regexp matching the longest possible citation prefix on a line.
- @item gnus-cite-max-prefix
- @vindex gnus-cite-max-prefix
- Maximum possible length for a citation prefix (default 20).
- @item gnus-cite-face-list
- @vindex gnus-cite-face-list
- List of faces used for highlighting citations (@pxref{Faces and Fonts}).
- When there are citations from multiple articles in the same message,
- Gnus will try to give each citation from each article its own face.
- This should make it easier to see who wrote what.
- @item gnus-supercite-regexp
- @vindex gnus-supercite-regexp
- Regexp matching normal Supercite attribution lines.
- @item gnus-supercite-secondary-regexp
- @vindex gnus-supercite-secondary-regexp
- Regexp matching mangled Supercite attribution lines.
- @item gnus-cite-minimum-match-count
- @vindex gnus-cite-minimum-match-count
- Minimum number of identical prefixes we have to see before we believe
- that it's a citation.
- @item gnus-cite-attribution-prefix
- @vindex gnus-cite-attribution-prefix
- Regexp matching the beginning of an attribution line.
- @item gnus-cite-attribution-suffix
- @vindex gnus-cite-attribution-suffix
- Regexp matching the end of an attribution line.
- @item gnus-cite-attribution-face
- @vindex gnus-cite-attribution-face
- Face used for attribution lines. It is merged with the face for the
- cited text belonging to the attribution.
- @end table
- @item W H s
- @kindex W H s @r{(Summary)}
- @vindex gnus-signature-separator
- @vindex gnus-signature-face
- @findex gnus-article-highlight-signature
- Highlight the signature (@code{gnus-article-highlight-signature}).
- Everything after @code{gnus-signature-separator} (@pxref{Article
- Signature}) in an article will be considered a signature and will be
- highlighted with @code{gnus-signature-face}, which is @code{italic} by
- default.
- @end table
- @xref{Customizing Articles}, for how to highlight articles automatically.
- @node Article Fontisizing
- @subsection Article Fontisizing
- @cindex emphasis
- @cindex article emphasis
- @findex gnus-article-emphasize
- @kindex W e @r{(Summary)}
- People commonly add emphasis to words in news articles by writing things
- like @samp{_this_} or @samp{*this*} or @samp{/this/}. Gnus can make
- this look nicer by running the article through the @kbd{W e}
- (@code{gnus-article-emphasize}) command.
- @vindex gnus-emphasis-alist
- How the emphasis is computed is controlled by the
- @code{gnus-emphasis-alist} variable. This is an alist where the first
- element is a regular expression to be matched. The second is a number
- that says what regular expression grouping is used to find the entire
- emphasized word. The third is a number that says what regexp grouping
- should be displayed and highlighted. (The text between these two
- groupings will be hidden.) The fourth is the face used for
- highlighting.
- @lisp
- (setq gnus-article-emphasis
- '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
- ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
- @end lisp
- @cindex slash
- @cindex asterisk
- @cindex underline
- @cindex /
- @cindex *
- @vindex gnus-emphasis-underline
- @vindex gnus-emphasis-bold
- @vindex gnus-emphasis-italic
- @vindex gnus-emphasis-underline-bold
- @vindex gnus-emphasis-underline-italic
- @vindex gnus-emphasis-bold-italic
- @vindex gnus-emphasis-underline-bold-italic
- By default, there are seven rules, and they use the following faces:
- @code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
- @code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
- @code{gnus-emphasis-underline-italic},
- @code{gnus-emphasis-underline-bold}, and
- @code{gnus-emphasis-underline-bold-italic}.
- If you want to change these faces, you can either use @kbd{M-x
- customize}, or you can use @code{copy-face}. For instance, if you want
- to make @code{gnus-emphasis-italic} use a red face instead, you could
- say something like:
- @lisp
- (copy-face 'red 'gnus-emphasis-italic)
- @end lisp
- @vindex gnus-group-highlight-words-alist
- If you want to highlight arbitrary words, you can use the
- @code{gnus-group-highlight-words-alist} variable, which uses the same
- syntax as @code{gnus-emphasis-alist}. The @code{highlight-words} group
- parameter (@pxref{Group Parameters}) can also be used.
- @xref{Customizing Articles}, for how to fontize articles automatically.
- @node Article Hiding
- @subsection Article Hiding
- @cindex article hiding
- Or rather, hiding certain things in each article. There usually is much
- too much cruft in most articles.
- @table @kbd
- @item W W a
- @kindex W W a @r{(Summary)}
- @findex gnus-article-hide
- Do quite a lot of hiding on the article buffer
- (@kbd{gnus-article-hide}). In particular, this function will hide
- headers, PGP, cited text and the signature.
- @item W W h
- @kindex W W h @r{(Summary)}
- @findex gnus-article-hide-headers
- Hide headers (@code{gnus-article-hide-headers}). @xref{Hiding
- Headers}.
- @item W W b
- @kindex W W b @r{(Summary)}
- @findex gnus-article-hide-boring-headers
- Hide headers that aren't particularly interesting
- (@code{gnus-article-hide-boring-headers}). @xref{Hiding Headers}.
- @item W W s
- @kindex W W s @r{(Summary)}
- @findex gnus-article-hide-signature
- Hide signature (@code{gnus-article-hide-signature}). @xref{Article
- Signature}.
- @item W W l
- @kindex W W l @r{(Summary)}
- @findex gnus-article-hide-list-identifiers
- @vindex gnus-list-identifiers
- Strip list identifiers specified in @code{gnus-list-identifiers}. These
- are strings some mailing list servers add to the beginning of all
- @code{Subject} headers---for example, @samp{[zebra 4711]}. Any leading
- @samp{Re: } is skipped before stripping. @code{gnus-list-identifiers}
- may not contain @code{\\(..\\)}.
- @table @code
- @item gnus-list-identifiers
- @vindex gnus-list-identifiers
- A regular expression that matches list identifiers to be removed from
- subject. This can also be a list of regular expressions.
- @end table
- @item W W p
- @kindex W W p @r{(Summary)}
- @findex gnus-article-hide-pgp
- @vindex gnus-article-hide-pgp-hook
- Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}). The
- @code{gnus-article-hide-pgp-hook} hook will be run after a @sc{pgp}
- signature has been hidden. For example, to automatically verify
- articles that have signatures in them do:
- @lisp
- ;;; Hide pgp cruft if any.
- (setq gnus-treat-strip-pgp t)
- ;;; After hiding pgp, verify the message;
- ;;; only happens if pgp signature is found.
- (add-hook 'gnus-article-hide-pgp-hook
- (lambda ()
- (save-excursion
- (set-buffer gnus-original-article-buffer)
- (mc-verify))))
- @end lisp
- @item W W P
- @kindex W W P @r{(Summary)}
- @findex gnus-article-hide-pem
- Hide @sc{pem} (privacy enhanced messages) cruft
- (@code{gnus-article-hide-pem}).
- @item W W B
- @kindex W W B @r{(Summary)}
- @findex gnus-article-strip-banner
- @cindex banner
- @cindex OneList
- @cindex stripping advertisements
- @cindex advertisements
- Strip the banner specified by the @code{banner} group parameter
- (@code{gnus-article-strip-banner}). This is mainly used to hide those
- annoying banners and/or signatures that some mailing lists and moderated
- groups adds to all the messages. The way to use this function is to add
- the @code{banner} group parameter (@pxref{Group Parameters}) to the
- group you want banners stripped from. The parameter either be a string,
- which will be interpreted as a regular expression matching text to be
- removed, or the symbol @code{signature}, meaning that the (last)
- signature should be removed, or other symbol, meaning that the
- corresponding regular expression in @code{gnus-article-banner-alist} is
- used.
- @item W W c
- @kindex W W c @r{(Summary)}
- @findex gnus-article-hide-citation
- Hide citation (@code{gnus-article-hide-citation}). Some variables for
- customizing the hiding:
- @table @code
- @item gnus-cited-opened-text-button-line-format
- @itemx gnus-cited-closed-text-button-line-format
- @vindex gnus-cited-closed-text-button-line-format
- @vindex gnus-cited-opened-text-button-line-format
- Gnus adds buttons to show where the cited text has been hidden, and to
- allow toggle hiding the text. The format of the variable is specified
- by these format-like variable (@pxref{Formatting Variables}). These
- specs are valid:
- @table @samp
- @item b
- Starting point of the hidden text.
- @item e
- Ending point of the hidden text.
- @item l
- Number of characters in the hidden region.
- @item n
- Number of lines of hidden text.
- @end table
- @item gnus-cited-lines-visible
- @vindex gnus-cited-lines-visible
- The number of lines at the beginning of the cited text to leave
- shown. This can also be a cons cell with the number of lines at the top
- and bottom of the text, respectively, to remain visible.
- @end table
- @item W W C-c
- @kindex W W C-c @r{(Summary)}
- @findex gnus-article-hide-citation-maybe
- Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the
- following two variables:
- @table @code
- @item gnus-cite-hide-percentage
- @vindex gnus-cite-hide-percentage
- If the cited text is of a bigger percentage than this variable (default
- 50), hide the cited text.
- @item gnus-cite-hide-absolute
- @vindex gnus-cite-hide-absolute
- The cited text must have at least this length (default 10) before it
- is hidden.
- @end table
- @item W W C
- @kindex W W C @r{(Summary)}
- @findex gnus-article-hide-citation-in-followups
- Hide cited text in articles that aren't roots
- (@code{gnus-article-hide-citation-in-followups}). This isn't very
- useful as an interactive command, but might be a handy function to stick
- have happen automatically (@pxref{Customizing Articles}).
- @end table
- All these ``hiding'' commands are toggles, but if you give a negative
- prefix to these commands, they will show what they have previously
- hidden. If you give a positive prefix, they will always hide.
- Also @pxref{Article Highlighting} for further variables for
- citation customization.
- @xref{Customizing Articles}, for how to hide article elements
- automatically.
- @node Article Washing
- @subsection Article Washing
- @cindex washing
- @cindex article washing
- We call this ``article washing'' for a really good reason. Namely, the
- @kbd{A} key was taken, so we had to use the @kbd{W} key instead.
- @dfn{Washing} is defined by us as ``changing something from something to
- something else'', but normally results in something looking better.
- Cleaner, perhaps.
- @xref{Customizing Articles}, if you want to change how Gnus displays
- articles by default.
- @table @kbd
- @item C-u g
- This is not really washing, it's sort of the opposite of washing. If
- you type this, you see the article exactly as it exists on disk or on
- the server.
- @item W l
- @kindex W l @r{(Summary)}
- @findex gnus-summary-stop-page-breaking
- Remove page breaks from the current article
- (@code{gnus-summary-stop-page-breaking}). @xref{Misc Article}, for page
- delimiters.
- @item W r
- @kindex W r @r{(Summary)}
- @findex gnus-summary-caesar-message
- @c @icon{gnus-summary-caesar-message}
- Do a Caesar rotate (rot13) on the article buffer
- (@code{gnus-summary-caesar-message}).
- Unreadable articles that tell you to read them with Caesar rotate or rot13.
- (Typically offensive jokes and such.)
- It's commonly called @dfn{rot13} because each letter is rotated 13
- positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter
- #15). It is sometimes referred to as ``Caesar rotate'' because Caesar
- is rumored to have employed this form of, uh, somewhat weak encryption.
- @item W t
- @item t
- @kindex W t @r{(Summary)}
- @kindex t @r{(Summary)}
- @findex gnus-summary-toggle-header
- Toggle whether to display all headers in the article buffer
- (@code{gnus-summary-toggle-header}).
- @item W v
- @kindex W v @r{(Summary)}
- @findex gnus-summary-verbose-header
- Toggle whether to display all headers in the article buffer permanently
- (@code{gnus-summary-verbose-header}).
- @item W o
- @kindex W o @r{(Summary)}
- @findex gnus-article-treat-overstrike
- Treat overstrike (@code{gnus-article-treat-overstrike}).
- @item W d
- @kindex W d @r{(Summary)}
- @findex gnus-article-treat-dumbquotes
- @vindex gnus-article-dumbquotes-map
- @cindex Smartquotes
- @cindex M******** sm*rtq**t*s
- @cindex Latin 1
- Treat M******** sm*rtq**t*s according to
- @code{gnus-article-dumbquotes-map}
- (@code{gnus-article-treat-dumbquotes}). Note that this function guesses
- whether a character is a sm*rtq**t* or not, so it should only be used
- interactively.
- In reality, this function is translates a subset of the subset of the
- @code{cp1252} (or @code{Windows-1252}) character set that isn't in ISO
- Latin-1, including the quote characters @code{\222} and @code{\264}.
- Messages in this character set often have a MIME header saying that
- they are Latin-1.
- @item W w
- @kindex W w @r{(Summary)}
- @findex gnus-article-fill-cited-article
- Do word wrap (@code{gnus-article-fill-cited-article}).
- You can give the command a numerical prefix to specify the width to use
- when filling.
- @item W Q
- @kindex W Q @r{(Summary)}
- @findex gnus-article-fill-long-lines
- Fill long lines (@code{gnus-article-fill-long-lines}).
- @item W C
- @kindex W C @r{(Summary)}
- @findex gnus-article-capitalize-sentences
- Capitalize the first word in each sentence
- (@code{gnus-article-capitalize-sentences}).
- @item W c
- @kindex W c @r{(Summary)}
- @findex gnus-article-remove-cr
- Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF
- (this takes care of DOS line endings), and then translate any remaining
- CRs into LF (this takes care of Mac line endings)
- (@code{gnus-article-remove-cr}).
- @item W q
- @kindex W q @r{(Summary)}
- @findex gnus-article-de-quoted-unreadable
- Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
- Quoted-Printable is one common @sc{mime} encoding employed when sending
- non-ASCII (i. e., 8-bit) articles. It typically makes strings like
- @samp{déjà vu} look like @samp{d=E9j=E0 vu}, which doesn't look very
- readable to me. Note that the this is usually done automatically by
- Gnus if the message in question has a @code{Content-Transfer-Encoding}
- header that says that this encoding has been done.
- @item W 6
- @kindex W 6 @r{(Summary)}
- @findex gnus-article-de-base64-unreadable
- Treat base64 (@code{gnus-article-de-base64-unreadable}).
- Base64 is one common @sc{mime} encoding employed when sending non-ASCII
- (i. e., 8-bit) articles. Note that the this is usually done
- automatically by Gnus if the message in question has a
- @code{Content-Transfer-Encoding} header that says that this encoding has
- been done.
- @item W Z
- @kindex W Z @r{(Summary)}
- @findex gnus-article-decode-HZ
- Treat HZ or HZP (@code{gnus-article-decode-HZ}). HZ (or HZP) is one
- common encoding employed when sending Chinese articles. It typically
- makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}.
- @item W h
- @kindex W h @r{(Summary)}
- @findex gnus-article-wash-html
- Treat HTML (@code{gnus-article-wash-html}).
- Note that the this is usually done automatically by Gnus if the message
- in question has a @code{Content-Type} header that says that this type
- has been done.
- @item W f
- @kindex W f @r{(Summary)}
- @cindex x-face
- @findex gnus-article-display-x-face
- @findex gnus-article-x-face-command
- @vindex gnus-article-x-face-command
- @vindex gnus-article-x-face-too-ugly
- @iftex
- @iflatex
- \include{xface}
- @end iflatex
- @end iftex
- @anchor{X-Face}
- Look for and display any X-Face headers
- (@code{gnus-article-display-x-face}). The command executed by this
- function is given by the @code{gnus-article-x-face-command} variable.
- If this variable is a string, this string will be executed in a
- sub-shell. If it is a function, this function will be called with the
- face as the argument. If the @code{gnus-article-x-face-too-ugly} (which
- is a regexp) matches the @code{From} header, the face will not be shown.
- The default action under Emacs is to fork off the @code{display}
- program@footnote{@code{display} is from the ImageMagick package. For the
- @code{uncompface} and @code{icontopbm} programs look for a package
- like `compface' or `faces-xface' on a GNU/Linux system.}
- to view the face. Under XEmacs or Emacs 21+ with suitable image
- support, the default action is to display the face before the
- @code{From} header. (It's nicer if XEmacs has been compiled with X-Face
- support---that will make display somewhat faster. If there's no native
- X-Face support, Gnus will try to convert the @code{X-Face} header using
- external programs from the @code{pbmplus} package and
- friends.@footnote{On a GNU/Linux system look for packages with names
- like @code{netpbm} or @code{libgr-progs}.}) If you
- want to have this function in the display hook, it should probably come
- last.
- @item W b
- @kindex W b @r{(Summary)}
- @findex gnus-article-add-buttons
- Add clickable buttons to the article (@code{gnus-article-add-buttons}).
- @xref{Article Buttons}.
- @item W B
- @kindex W B @r{(Summary)}
- @findex gnus-article-add-buttons-to-head
- Add clickable buttons to the article headers
- (@code{gnus-article-add-buttons-to-head}).
- @item W W H
- @kindex W W H @r{(Summary)}
- @findex gnus-article-strip-headers-from-body
- Strip headers like the @code{X-No-Archive} header from the beginning of
- article bodies (@code{gnus-article-strip-headers-from-body}).
- @item W E l
- @kindex W E l @r{(Summary)}
- @findex gnus-article-strip-leading-blank-lines
- Remove all blank lines from the beginning of the article
- (@code{gnus-article-strip-leading-blank-lines}).
- @item W E m
- @kindex W E m @r{(Summary)}
- @findex gnus-article-strip-multiple-blank-lines
- Replace all blank lines with empty lines and then all multiple empty
- lines with a single empty line.
- (@code{gnus-article-strip-multiple-blank-lines}).
- @item W E t
- @kindex W E t @r{(Summary)}
- @findex gnus-article-remove-trailing-blank-lines
- Remove all blank lines at the end of the article
- (@code{gnus-article-remove-trailing-blank-lines}).
- @item W E a
- @kindex W E a @r{(Summary)}
- @findex gnus-article-strip-blank-lines
- Do all the three commands above
- (@code{gnus-article-strip-blank-lines}).
- @item W E A
- @kindex W E A @r{(Summary)}
- @findex gnus-article-strip-all-blank-lines
- Remove all blank lines
- (@code{gnus-article-strip-all-blank-lines}).
- @item W E s
- @kindex W E s @r{(Summary)}
- @findex gnus-article-strip-leading-space
- Remove all white space from the beginning of all lines of the article
- body (@code{gnus-article-strip-leading-space}).
- @item W E e
- @kindex W E e @r{(Summary)}
- @findex gnus-article-strip-trailing-space
- Remove all white space from the end of all lines of the article
- body (@code{gnus-article-strip-trailing-space}).
- @end table
- @xref{Customizing Articles}, for how to wash articles automatically.
- @node Article Buttons
- @subsection Article Buttons
- @cindex buttons
- People often include references to other stuff in articles, and it would
- be nice if Gnus could just fetch whatever it is that people talk about
- with the minimum of fuzz when you hit @key{RET} or use the middle mouse
- button on these references.
- Gnus adds @dfn{buttons} to certain standard references by default:
- Well-formed URLs, mail addresses and Message-IDs. This is controlled by
- two variables, one that handles article bodies and one that handles
- article heads:
- @table @code
- @item gnus-button-alist
- @vindex gnus-button-alist
- This is an alist where each entry has this form:
- @lisp
- (REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
- @end lisp
- @table @var
- @item regexp
- All text that match this regular expression will be considered an
- external reference. Here's a typical regexp that matches embedded URLs:
- @samp{<URL:\\([^\n\r>]*\\)>}.
- @item button-par
- Gnus has to know which parts of the matches is to be highlighted. This
- is a number that says what sub-expression of the regexp is to be
- highlighted. If you want it all highlighted, you use 0 here.
- @item use-p
- This form will be @code{eval}ed, and if the result is non-@code{nil},
- this is considered a match. This is useful if you want extra sifting to
- avoid false matches.
- @item function
- This function will be called when you click on this button.
- @item data-par
- As with @var{button-par}, this is a sub-expression number, but this one
- says which part of the match is to be sent as data to @var{function}.
- @end table
- So the full entry for buttonizing URLs is then
- @lisp
- ("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
- @end lisp
- @item gnus-header-button-alist
- @vindex gnus-header-button-alist
- This is just like the other alist, except that it is applied to the
- article head only, and that each entry has an additional element that is
- used to say what headers to apply the buttonize coding to:
- @lisp
- (HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
- @end lisp
- @var{header} is a regular expression.
- @item gnus-button-url-regexp
- @vindex gnus-button-url-regexp
- A regular expression that matches embedded URLs. It is used in the
- default values of the variables above.
- @item gnus-article-button-face
- @vindex gnus-article-button-face
- Face used on buttons.
- @item gnus-article-mouse-face
- @vindex gnus-article-mouse-face
- Face used when the mouse cursor is over a button.
- @end table
- @xref{Customizing Articles}, for how to buttonize articles automatically.
- @node Article Date
- @subsection Article Date
- The date is most likely generated in some obscure timezone you've never
- heard of, so it's quite nice to be able to find out what the time was
- when the article was sent.
- @table @kbd
- @item W T u
- @kindex W T u @r{(Summary)}
- @findex gnus-article-date-ut
- Display the date in UT (aka. GMT, aka ZULU)
- (@code{gnus-article-date-ut}).
- @item W T i
- @kindex W T i @r{(Summary)}
- @findex gnus-article-date-iso8601
- @cindex ISO 8601
- Display the date in international format, aka. ISO 8601
- (@code{gnus-article-date-iso8601}).
- @item W T l
- @kindex W T l @r{(Summary)}
- @findex gnus-article-date-local
- Display the date in the local timezone (@code{gnus-article-date-local}).
- @item W T s
- @kindex W T s @r{(Summary)}
- @vindex gnus-article-time-format
- @findex gnus-article-date-user
- @findex format-time-string
- Display the date using a user-defined format
- (@code{gnus-article-date-user}). The format is specified by the
- @code{gnus-article-time-format} variable, and is a string that's passed
- to @code{format-time-string}. See the documentation of that variable
- for a list of possible format specs.
- @item W T e
- @kindex W T e @r{(Summary)}
- @findex gnus-article-date-lapsed
- @findex gnus-start-date-timer
- @findex gnus-stop-date-timer
- Say how much time has elapsed between the article was posted and now
- (@code{gnus-article-date-lapsed}). It looks something like:
- @example
- X-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago
- @end example
- The value of @code{gnus-article-date-lapsed-new-header} determines
- whether this header will just be added below the old Date one, or will
- replace it.
- An advantage of using Gnus to read mail is that it converts simple bugs
- into wonderful absurdities.
- If you want to have this line updated continually, you can put
- @lisp
- (gnus-start-date-timer)
- @end lisp
- in your @file{.gnus.el} file, or you can run it off of some hook. If
- you want to stop the timer, you can use the @code{gnus-stop-date-timer}
- command.
- @item W T o
- @kindex W T o @r{(Summary)}
- @findex gnus-article-date-original
- Display the original date (@code{gnus-article-date-original}). This can
- be useful if you normally use some other conversion function and are
- worried that it might be doing something totally wrong. Say, claiming
- that the article was posted in 1854. Although something like that is
- @emph{totally} impossible. Don't you trust me? *titter*
- @end table
- @xref{Customizing Articles}, for how to display the date in your
- preferred format automatically.
- @node Article Signature
- @subsection Article Signature
- @cindex signatures
- @cindex article signature
- @vindex gnus-signature-separator
- Each article is divided into two parts---the head and the body. The
- body can be divided into a signature part and a text part. The variable
- that says what is to be considered a signature is
- @code{gnus-signature-separator}. This is normally the standard
- @samp{^-- $} as mandated by son-of-RFC 1036. However, many people use
- non-standard signature separators, so this variable can also be a list
- of regular expressions to be tested, one by one. (Searches are done
- from the end of the body towards the beginning.) One likely value is:
- @lisp
- (setq gnus-signature-separator
- '("^-- $" ; The standard
- "^-- *$" ; A common mangling
- "^-------*$" ; Many people just use a looong
- ; line of dashes. Shame!
- "^ *--------*$" ; Double-shame!
- "^________*$" ; Underscores are also popular
- "^========*$")) ; Pervert!
- @end lisp
- The more permissive you are, the more likely it is that you'll get false
- positives.
- @vindex gnus-signature-limit
- @code{gnus-signature-limit} provides a limit to what is considered a
- signature when displaying articles.
- @enumerate
- @item
- If it is an integer, no signature may be longer (in characters) than
- that integer.
- @item
- If it is a floating point number, no signature may be longer (in lines)
- than that number.
- @item
- If it is a function, the function will be called without any parameters,
- and if it returns @code{nil}, there is no signature in the buffer.
- @item
- If it is a string, it will be used as a regexp. If it matches, the text
- in question is not a signature.
- @end enumerate
- This variable can also be a list where the elements may be of the types
- listed above. Here's an example:
- @lisp
- (setq gnus-signature-limit
- '(200.0 "^---*Forwarded article"))
- @end lisp
- This means that if there are more than 200 lines after the signature
- separator, or the text after the signature separator is matched by
- the regular expression @samp{^---*Forwarded article}, then it isn't a
- signature after all.
- @node Article Miscellania
- @subsection Article Miscellania
- @table @kbd
- @item A t
- @kindex A t @r{(Summary)}
- @findex gnus-article-babel
- Translate the article from one language to another
- (@code{gnus-article-babel}).
- @end table
- @node MIME Commands
- @section @sc{mime} Commands
- @cindex MIME decoding
- @cindex attachments
- @cindex viewing attachments
- The following commands all understand the numerical prefix. For
- instance, @kbd{3 b} means ``view the third @sc{mime} part''.
- @table @kbd
- @item b
- @itemx K v
- @kindex b @r{(Summary)}
- @kindex K v @r{(Summary)}
- View the @sc{mime} part.
- @item K o
- @kindex K o @r{(Summary)}
- Save the @sc{mime} part.
- @item K c
- @kindex K c @r{(Summary)}
- Copy the @sc{mime} part.
- @item K e
- @kindex K e @r{(Summary)}
- View the @sc{mime} part externally.
- @item K i
- @kindex K i @r{(Summary)}
- View the @sc{mime} part internally.
- @item K |
- @kindex K | @r{(Summary)}
- Pipe the @sc{mime} part to an external command.
- @end table
- The rest of these @sc{mime} commands do not use the numerical prefix in
- the same manner:
- @table @kbd
- @item K b
- @kindex K b @r{(Summary)}
- Make all the @sc{mime} parts have buttons in front of them. This is
- mostly useful if you wish to save (or perform other actions) on inlined
- parts.
- @item K m
- @kindex K m @r{(Summary)}
- @findex gnus-summary-repair-multipart
- Some multipart messages are transmitted with missing or faulty headers.
- This command will attempt to ``repair'' these messages so that they can
- be viewed in a more pleasant manner
- (@code{gnus-summary-repair-multipart}).
- @item X m
- @kindex X m @r{(Summary)}
- @findex gnus-summary-save-parts
- Save all parts matching a @sc{mime} type to a directory
- (@code{gnus-summary-save-parts}). Understands the process/prefix
- convention (@pxref{Process/Prefix}).
- @item M-t
- @kindex M-t @r{(Summary)}
- @findex gnus-summary-display-buttonized
- Toggle the buttonized display of the article buffer
- (@code{gnus-summary-toggle-display-buttonized}).
- @item W M w
- @kindex W M w @r{(Summary)}
- Decode RFC 2047-encoded words in the article headers
- (@code{gnus-article-decode-mime-words}).
- @item W M c
- @kindex W M c @r{(Summary)}
- Decode encoded article bodies as well as charsets
- (@code{gnus-article-decode-charset}).
- This command looks in the @code{Content-Type} header to determine the
- charset. If there is no such header in the article, you can give it a
- prefix, which will prompt for the charset to decode as. In regional
- groups where people post using some common encoding (but do not include
- MIME headers), you can set the @code{charset} group/topic parameter to
- the required charset (@pxref{Group Parameters}).
- @item W M v
- @kindex W M v @r{(Summary)}
- View all the @sc{mime} parts in the current article
- (@code{gnus-mime-view-all-parts}).
- @end table
- Relevant variables:
- @table @code
- @item gnus-ignored-mime-types
- @vindex gnus-ignored-mime-types
- This is a list of regexps. @sc{mime} types that match a regexp from
- this list will be completely ignored by Gnus. The default value is
- @code{nil}.
- To have all Vcards be ignored, you'd say something like this:
- @lisp
- (setq gnus-ignored-mime-types
- '("text/x-vcard"))
- @end lisp
- @item gnus-unbuttonized-mime-types
- @vindex gnus-unbuttonized-mime-types
- This is a list of regexps. @sc{mime} types that match a regexp from
- this list won't have @sc{mime} buttons inserted unless they aren't
- displayed. The default value is @code{(".*/.*")}.
- @item gnus-article-mime-part-function
- @vindex gnus-article-mime-part-function
- For each @sc{mime} part, this function will be called with the @sc{mime}
- handle as the parameter. The function is meant to be used to allow
- users to gather information from the article (e. g., add Vcard info to
- the bbdb database) or to do actions based on parts (e. g., automatically
- save all jpegs into some directory).
- Here's an example function the does the latter:
- @lisp
- (defun my-save-all-jpeg-parts (handle)
- (when (equal (car (mm-handle-type handle)) "image/jpeg")
- (with-temp-buffer
- (insert (mm-get-part handle))
- (write-region (point-min) (point-max)
- (read-file-name "Save jpeg to: ")))))
- (setq gnus-article-mime-part-function
- 'my-save-all-jpeg-parts)
- @end lisp
- @vindex gnus-mime-multipart-functions
- @item gnus-mime-multipart-functions
- Alist of @sc{mime} multipart types and functions to handle them.
- @end table
- @node Charsets
- @section Charsets
- @cindex charsets
- People use different charsets, and we have @sc{mime} to let us know what
- charsets they use. Or rather, we wish we had. Many people use
- newsreaders and mailers that do not understand or use @sc{mime}, and
- just send out messages without saying what character sets they use. To
- help a bit with this, some local news hierarchies have policies that say
- what character set is the default. For instance, the @samp{fj}
- hierarchy uses @code{iso-2022-jp-2}.
- @vindex gnus-group-charset-alist
- This knowledge is encoded in the @code{gnus-group-charset-alist}
- variable, which is an alist of regexps (to match group names) and
- default charsets to be used when reading these groups.
- In addition, some people do use soi-disant @sc{mime}-aware agents that
- aren't. These blithely mark messages as being in @code{iso-8859-1} even
- if they really are in @code{koi-8}. To help here, the
- @code{gnus-newsgroup-ignored-charsets} variable can be used. The
- charsets that are listed here will be ignored. The variable can be set
- on a group-by-group basis using the group parameters (@pxref{Group
- Parameters}). The default value is @code{(unknown-8bit)}, which is
- something some agents insist on having in there.
- @vindex gnus-group-posting-charset-alist
- When posting, @code{gnus-group-posting-charset-alist} is used to
- determine which charsets should not be encoded using the @sc{mime}
- encodings. For instance, some hierarchies discourage using
- quoted-printable header encoding.
- This variable is an alist of regexps and permitted unencoded charsets
- for posting. Each element of the alist has the form @code{(}@var{test
- header body-list}@code{)}, where:
- @table @var
- @item test
- is either a regular expression matching the newsgroup header or a
- variable to query,
- @item header
- is the charset which may be left unencoded in the header (@code{nil}
- means encode all charsets),
- @item body-list
- is a list of charsets which may be encoded using 8bit content-transfer
- encoding in the body, or one of the special values @code{nil} (always
- encode using quoted-printable) or @code{t} (always use 8bit).
- @end table
- @cindex Russian
- @cindex koi8-r
- @cindex koi8-u
- @cindex iso-8859-5
- @cindex coding system aliases
- @cindex preferred charset
- Other charset tricks that may be useful, although not Gnus-specific:
- If there are several @sc{mime} charsets that encode the same Emacs
- charset, you can choose what charset to use by saying the following:
- @lisp
- (put-charset-property 'cyrillic-iso8859-5
- 'preferred-coding-system 'koi8-r)
- @end lisp
- This means that Russian will be encoded using @code{koi8-r} instead of
- the default @code{iso-8859-5} @sc{mime} charset.
- If you want to read messages in @code{koi8-u}, you can cheat and say
- @lisp
- (define-coding-system-alias 'koi8-u 'koi8-r)
- @end lisp
- This will almost do the right thing.
- And finally, to read charsets like @code{windows-1251}, you can say
- something like
- @lisp
- (codepage-setup 1251)
- (define-coding-system-alias 'windows-1251 'cp1251)
- @end lisp
- while if you use a non-Latin-1 language environment you could see the
- Latin-1 subset of @code{windows-1252} using:
- @lisp
- (define-coding-system-alias 'windows-1252 'latin-1)
- @end lisp
- @node Article Commands
- @section Article Commands
- @table @kbd
- @item A P
- @cindex PostScript
- @cindex printing
- @kindex A P @r{(Summary)}
- @vindex gnus-ps-print-hook
- @findex gnus-summary-print-article
- Generate and print a PostScript image of the article buffer
- (@code{gnus-summary-print-article}). @code{gnus-ps-print-hook} will be
- run just before printing the buffer.
- @end table
- @node Summary Sorting
- @section Summary Sorting
- @cindex summary sorting
- You can have the summary buffer sorted in various ways, even though I
- can't really see why you'd want that.
- @table @kbd
- @item C-c C-s C-n
- @kindex C-c C-s C-n @r{(Summary)}
- @findex gnus-summary-sort-by-number
- Sort by article number (@code{gnus-summary-sort-by-number}).
- @item C-c C-s C-a
- @kindex C-c C-s C-a @r{(Summary)}
- @findex gnus-summary-sort-by-author
- Sort by author (@code{gnus-summary-sort-by-author}).
- @item C-c C-s C-s
- @kindex C-c C-s C-s @r{(Summary)}
- @findex gnus-summary-sort-by-subject
- Sort by subject (@code{gnus-summary-sort-by-subject}).
- @item C-c C-s C-d
- @kindex C-c C-s C-d @r{(Summary)}
- @findex gnus-summary-sort-by-date
- Sort by date (@code{gnus-summary-sort-by-date}).
- @item C-c C-s C-l
- @kindex C-c C-s C-l @r{(Summary)}
- @findex gnus-summary-sort-by-lines
- Sort by lines (@code{gnus-summary-sort-by-lines}).
- @item C-c C-s C-c
- @kindex C-c C-s C-c @r{(Summary)}
- @findex gnus-summary-sort-by-chars
- Sort by article length (@code{gnus-summary-sort-by-chars}).
- @item C-c C-s C-i
- @kindex C-c C-s C-i @r{(Summary)}
- @findex gnus-summary-sort-by-score
- Sort by score (@code{gnus-summary-sort-by-score}).
- @end table
- These functions will work both when you use threading and when you don't
- use threading. In the latter case, all summary lines will be sorted,
- line by line. In the former case, sorting will be done on a
- root-by-root basis, which might not be what you were looking for. To
- toggle whether to use threading, type @kbd{T T} (@pxref{Thread
- Commands}).
- @node Finding the Parent
- @section Finding the Parent
- @cindex parent articles
- @cindex referring articles
- @table @kbd
- @item ^
- @kindex ^ @r{(Summary)}
- @findex gnus-summary-refer-parent-article
- If you'd like to read the parent of the current article, and it is not
- displayed in the summary buffer, you might still be able to. That is,
- if the current group is fetched by @sc{nntp}, the parent hasn't expired
- and the @code{References} in the current article are not mangled, you
- can just press @kbd{^} or @kbd{A r}
- (@code{gnus-summary-refer-parent-article}). If everything goes well,
- you'll get the parent. If the parent is already displayed in the
- summary buffer, point will just move to this article.
- If given a positive numerical prefix, fetch that many articles back into
- the ancestry. If given a negative numerical prefix, fetch just that
- ancestor. So if you say @kbd{3 ^}, Gnus will fetch the parent, the
- grandparent and the grandgrandparent of the current article. If you say
- @kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
- article.
- @item A R @r{(Summary)}
- @findex gnus-summary-refer-references
- @kindex A R @r{(Summary)}
- Fetch all articles mentioned in the @code{References} header of the
- article (@code{gnus-summary-refer-references}).
- @item A T @r{(Summary)}
- @findex gnus-summary-refer-thread
- @kindex A T @r{(Summary)}
- Display the full thread where the current article appears
- (@code{gnus-summary-refer-thread}). This command has to fetch all the
- headers in the current group to work, so it usually takes a while. If
- you do it often, you may consider setting @code{gnus-fetch-old-headers}
- to @code{invisible} (@pxref{Filling In Threads}). This won't have any
- visible effects normally, but it'll make this command work a whole lot
- faster. Of course, it'll make group entry somewhat slow.
- @vindex gnus-refer-thread-limit
- The @code{gnus-refer-thread-limit} variable says how many old (i. e.,
- articles before the first displayed in the current group) headers to
- fetch when doing this command. The default is 200. If @code{t}, all
- the available headers will be fetched. This variable can be overridden
- by giving the @kbd{A T} command a numerical prefix.
- @item M-^ @r{(Summary)}
- @findex gnus-summary-refer-article
- @kindex M-^ @r{(Summary)}
- @cindex Message-ID
- @cindex fetching by Message-ID
- You can also ask the @sc{nntp} server for an arbitrary article, no
- matter what group it belongs to. @kbd{M-^}
- (@code{gnus-summary-refer-article}) will ask you for a
- @code{Message-ID}, which is one of those long, hard-to-read thingies
- that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}. You
- have to get it all exactly right. No fuzzy searches, I'm afraid.
- @end table
- The current select method will be used when fetching by
- @code{Message-ID} from non-news select method, but you can override this
- by giving this command a prefix.
- @vindex gnus-refer-article-method
- If the group you are reading is located on a back end that does not
- support fetching by @code{Message-ID} very well (like @code{nnspool}),
- you can set @code{gnus-refer-article-method} to an @sc{nntp} method. It
- would, perhaps, be best if the @sc{nntp} server you consult is the one
- updating the spool you are reading from, but that's not really
- necessary.
- It can also be a list of select methods, as well as the special symbol
- @code{current}, which means to use the current select method. If it
- is a list, Gnus will try all the methods in the list until it finds a
- match.
- Here's an example setting that will first try the current method, and
- then ask Deja if that fails:
- @lisp
- (setq gnus-refer-article-method
- '(current
- (nnweb "refer" (nnweb-type dejanews))))
- @end lisp
- Most of the mail back ends support fetching by @code{Message-ID}, but do
- not do a particularly excellent job at it. That is, @code{nnmbox} and
- @code{nnbabyl} are able to locate articles from any groups, while
- @code{nnml} and @code{nnfolder} are only able to locate articles that
- have been posted to the current group. (Anything else would be too time
- consuming.) @code{nnmh} does not support this at all.
- @node Alternative Approaches
- @section Alternative Approaches
- Different people like to read news using different methods. This being
- Gnus, we offer a small selection of minor modes for the summary buffers.
- @menu
- * Pick and Read:: First mark articles and then read them.
- * Binary Groups:: Auto-decode all articles.
- @end menu
- @node Pick and Read
- @subsection Pick and Read
- @cindex pick and read
- Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
- a two-phased reading interface. The user first marks in a summary
- buffer the articles she wants to read. Then she starts reading the
- articles with just an article buffer displayed.
- @findex gnus-pick-mode
- @kindex M-x gnus-pick-mode
- Gnus provides a summary buffer minor mode that allows
- this---@code{gnus-pick-mode}. This basically means that a few process
- mark commands become one-keystroke commands to allow easy marking, and
- it provides one additional command for switching to the summary buffer.
- Here are the available keystrokes when using pick mode:
- @table @kbd
- @item .
- @kindex . (Pick)
- @findex gnus-pick-article-or-thread
- Pick the article or thread on the current line
- (@code{gnus-pick-article-or-thread}). If the variable
- @code{gnus-thread-hide-subtree} is true, then this key selects the
- entire thread when used at the first article of the thread. Otherwise,
- it selects just the article. If given a numerical prefix, go to that
- thread or article and pick it. (The line number is normally displayed
- at the beginning of the summary pick lines.)
- @item @key{SPC}
- @kindex @key{SPC} (Pick)
- @findex gnus-pick-next-page
- Scroll the summary buffer up one page (@code{gnus-pick-next-page}). If
- at the end of the buffer, start reading the picked articles.
- @item u
- @kindex u (Pick)
- @findex gnus-pick-unmark-article-or-thread.
- Unpick the thread or article
- (@code{gnus-pick-unmark-article-or-thread}). If the variable
- @code{gnus-thread-hide-subtree} is true, then this key unpicks the
- thread if used at the first article of the thread. Otherwise it unpicks
- just the article. You can give this key a numerical prefix to unpick
- the thread or article at that line.
- @item @key{RET}
- @kindex @key{RET} (Pick)
- @findex gnus-pick-start-reading
- @vindex gnus-pick-display-summary
- Start reading the picked articles (@code{gnus-pick-start-reading}). If
- given a prefix, mark all unpicked articles as read first. If
- @code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
- will still be visible when you are reading.
- @end table
- All the normal summary mode commands are still available in the
- pick-mode, with the exception of @kbd{u}. However @kbd{!} is available
- which is mapped to the same function
- @code{gnus-summary-tick-article-forward}.
- If this sounds like a good idea to you, you could say:
- @lisp
- (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
- @end lisp
- @vindex gnus-pick-mode-hook
- @code{gnus-pick-mode-hook} is run in pick minor mode buffers.
- @vindex gnus-mark-unpicked-articles-as-read
- If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
- all unpicked articles as read. The default is @code{nil}.
- @vindex gnus-summary-pick-line-format
- The summary line format in pick mode is slightly different from the
- standard format. At the beginning of each line the line number is
- displayed. The pick mode line format is controlled by the
- @code{gnus-summary-pick-line-format} variable (@pxref{Formatting
- Variables}). It accepts the same format specs that
- @code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}).
- @node Binary Groups
- @subsection Binary Groups
- @cindex binary groups
- @findex gnus-binary-mode
- @kindex M-x gnus-binary-mode
- If you spend much time in binary groups, you may grow tired of hitting
- @kbd{X u}, @kbd{n}, @key{RET} all the time. @kbd{M-x gnus-binary-mode}
- is a minor mode for summary buffers that makes all ordinary Gnus article
- selection functions uudecode series of articles and display the result
- instead of just displaying the articles the normal way.
- @kindex g (Binary)
- @findex gnus-binary-show-article
- The only way, in fact, to see the actual articles is the @kbd{g}
- command, when you have turned on this mode
- (@code{gnus-binary-show-article}).
- @vindex gnus-binary-mode-hook
- @code{gnus-binary-mode-hook} is called in binary minor mode buffers.
- @node Tree Display
- @section Tree Display
- @cindex trees
- @vindex gnus-use-trees
- If you don't like the normal Gnus summary display, you might try setting
- @code{gnus-use-trees} to @code{t}. This will create (by default) an
- additional @dfn{tree buffer}. You can execute all summary mode commands
- in the tree buffer.
- There are a few variables to customize the tree display, of course:
- @table @code
- @item gnus-tree-mode-hook
- @vindex gnus-tree-mode-hook
- A hook called in all tree mode buffers.
- @item gnus-tree-mode-line-format
- @vindex gnus-tree-mode-line-format
- A format string for the mode bar in the tree mode buffers (@pxref{Mode
- Line Formatting}). The default is @samp{Gnus: %%b %S %Z}. For a list
- of valid specs, @pxref{Summary Buffer Mode Line}.
- @item gnus-selected-tree-face
- @vindex gnus-selected-tree-face
- Face used for highlighting the selected article in the tree buffer. The
- default is @code{modeline}.
- @item gnus-tree-line-format
- @vindex gnus-tree-line-format
- A format string for the tree nodes. The name is a bit of a misnomer,
- though---it doesn't define a line, but just the node. The default value
- is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
- the name of the poster. It is vital that all nodes are of the same
- length, so you @emph{must} use @samp{%4,4n}-like specifiers.
- Valid specs are:
- @table @samp
- @item n
- The name of the poster.
- @item f
- The @code{From} header.
- @item N
- The number of the article.
- @item [
- The opening bracket.
- @item ]
- The closing bracket.
- @item s
- The subject.
- @end table
- @xref{Formatting Variables}.
- Variables related to the display are:
- @table @code
- @item gnus-tree-brackets
- @vindex gnus-tree-brackets
- This is used for differentiating between ``real'' articles and
- ``sparse'' articles. The format is @code{((@var{real-open} . @var{real-close})
- (@var{sparse-open} . @var{sparse-close}) (@var{dummy-open} . @var{dummy-close}))}, and the
- default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.
- @item gnus-tree-parent-child-edges
- @vindex gnus-tree-parent-child-edges
- This is a list that contains the characters used for connecting parent
- nodes to their children. The default is @code{(?- ?\\ ?|)}.
- @end table
- @item gnus-tree-minimize-window
- @vindex gnus-tree-minimize-window
- If this variable is non-@code{nil}, Gnus will try to keep the tree
- buffer as small as possible to allow more room for the other Gnus
- windows. If this variable is a number, the tree buffer will never be
- higher than that number. The default is @code{t}. Note that if you
- have several windows displayed side-by-side in a frame and the tree
- buffer is one of these, minimizing the tree window will also resize all
- other windows displayed next to it.
- @item gnus-generate-tree-function
- @vindex gnus-generate-tree-function
- @findex gnus-generate-horizontal-tree
- @findex gnus-generate-vertical-tree
- The function that actually generates the thread tree. Two predefined
- functions are available: @code{gnus-generate-horizontal-tree} and
- @code{gnus-generate-vertical-tree} (which is the default).
- @end table
- Here's an example from a horizontal tree buffer:
- @example
- @{***@}-(***)-[odd]-[Gun]
- | \[Jan]
- | \[odd]-[Eri]
- | \(***)-[Eri]
- | \[odd]-[Paa]
- \[Bjo]
- \[Gun]
- \[Gun]-[Jor]
- @end example
- Here's the same thread displayed in a vertical tree buffer:
- @example
- @{***@}
- |--------------------------\-----\-----\
- (***) [Bjo] [Gun] [Gun]
- |--\-----\-----\ |
- [odd] [Jan] [odd] (***) [Jor]
- | | |--\
- [Gun] [Eri] [Eri] [odd]
- |
- [Paa]
- @end example
- If you're using horizontal trees, it might be nice to display the trees
- side-by-side with the summary buffer. You could add something like the
- following to your @file{.gnus.el} file:
- @lisp
- (setq gnus-use-trees t
- gnus-generate-tree-function 'gnus-generate-horizontal-tree
- gnus-tree-minimize-window nil)
- (gnus-add-configuration
- '(article
- (vertical 1.0
- (horizontal 0.25
- (summary 0.75 point)
- (tree 1.0))
- (article 1.0))))
- @end lisp
- @xref{Windows Configuration}.
- @node Mail Group Commands
- @section Mail Group Commands
- @cindex mail group commands
- Some commands only make sense in mail groups. If these commands are
- invalid in the current group, they will raise a hell and let you know.
- All these commands (except the expiry and edit commands) use the
- process/prefix convention (@pxref{Process/Prefix}).
- @table @kbd
- @item B e
- @kindex B e @r{(Summary)}
- @findex gnus-summary-expire-articles
- Expire all expirable articles in the group
- (@code{gnus-summary-expire-articles}).
- @item B C-M-e
- @kindex B C-M-e @r{(Summary)}
- @findex gnus-summary-expire-articles-now
- Delete all the expirable articles in the group
- (@code{gnus-summary-expire-articles-now}). This means that @strong{all}
- articles eligible for expiry in the current group will
- disappear forever into that big @file{/dev/null} in the sky.
- @item B @key{DEL}
- @kindex B @key{DEL} @r{(Summary)}
- @findex gnus-summary-delete-article
- @c @icon{gnus-summary-mail-delete}
- Delete the mail article. This is ``delete'' as in ``delete it from your
- disk forever and ever, never to return again.'' Use with caution.
- (@code{gnus-summary-delete-article}).
- @item B m
- @kindex B m @r{(Summary)}
- @cindex move mail
- @findex gnus-summary-move-article
- @vindex gnus-preserve-marks
- Move the article from one mail group to another
- (@code{gnus-summary-move-article}). Marks will be preserved if
- @var{gnus-preserve-marks} is non-@code{nil} (which is the default).
- @item B c
- @kindex B c @r{(Summary)}
- @cindex copy mail
- @findex gnus-summary-copy-article
- @c @icon{gnus-summary-mail-copy}
- Copy the article from one group (mail group or not) to a mail group
- (@code{gnus-summary-copy-article}). Marks will be preserved if
- @var{gnus-preserve-marks} is non-@code{nil} (which is the default).
- @item B B
- @kindex B B @r{(Summary)}
- @cindex crosspost mail
- @findex gnus-summary-crosspost-article
- Crosspost the current article to some other group
- (@code{gnus-summary-crosspost-article}). This will create a new copy of
- the article in the other group, and the Xref headers of the article will
- be properly updated.
- @item B i
- @kindex B i @r{(Summary)}
- @findex gnus-summary-import-article
- Import an arbitrary file into the current mail newsgroup
- (@code{gnus-summary-import-article}). You will be prompted for a file
- name, a @code{From} header and a @code{Subject} header.
- @item B r
- @kindex B r @r{(Summary)}
- @findex gnus-summary-respool-article
- Respool the mail article (@code{gnus-summary-respool-article}).
- @code{gnus-summary-respool-default-method} will be used as the default
- select method when respooling. This variable is @code{nil} by default,
- which means that the current group select method will be used instead.
- Marks will be preserved if @var{gnus-preserve-marks} is non-@code{nil}
- (which is the default).
- @item B w
- @itemx e
- @kindex B w @r{(Summary)}
- @kindex e @r{(Summary)}
- @findex gnus-summary-edit-article
- @kindex C-c C-c @r{(Article)}
- Edit the current article (@code{gnus-summary-edit-article}). To finish
- editing and make the changes permanent, type @kbd{C-c C-c}
- (@kbd{gnus-summary-edit-article-done}). If you give a prefix to the
- @kbd{C-c C-c} command, Gnus won't re-highlight the article.
- @item B q
- @kindex B q @r{(Summary)}
- @findex gnus-summary-respool-query
- If you want to re-spool an article, you might be curious as to what group
- the article will end up in before you do the re-spooling. This command
- will tell you (@code{gnus-summary-respool-query}).
- @item B t
- @kindex B t @r{(Summary)}
- @findex gnus-summary-respool-trace
- Similarly, this command will display all fancy splitting patterns used
- when repooling, if any (@code{gnus-summary-respool-trace}).
- @item B p
- @kindex B p @r{(Summary)}
- @findex gnus-summary-article-posted-p
- Some people have a tendency to send you "courtesy" copies when they
- follow up to articles you have posted. These usually have a
- @code{Newsgroups} header in them, but not always. This command
- (@code{gnus-summary-article-posted-p}) will try to fetch the current
- article from your news server (or rather, from
- @code{gnus-refer-article-method} or @code{gnus-select-method}) and will
- report back whether it found the article or not. Even if it says that
- it didn't find the article, it may have been posted anyway---mail
- propagation is much faster than news propagation, and the news copy may
- just not have arrived yet.
- @end table
- @vindex gnus-move-split-methods
- @cindex moving articles
- If you move (or copy) articles regularly, you might wish to have Gnus
- suggest where to put the articles. @code{gnus-move-split-methods} is a
- variable that uses the same syntax as @code{gnus-split-methods}
- (@pxref{Saving Articles}). You may customize that variable to create
- suggestions you find reasonable. (Note that
- @code{gnus-move-split-methods} uses group names where
- @code{gnus-split-methods} uses file names.)
- @lisp
- (setq gnus-move-split-methods
- '(("^From:.*Lars Magne" "nnml:junk")
- ("^Subject:.*gnus" "nnfolder:important")
- (".*" "nnml:misc")))
- @end lisp
- @node Various Summary Stuff
- @section Various Summary Stuff
- @menu
- * Summary Group Information:: Information oriented commands.
- * Searching for Articles:: Multiple article commands.
- * Summary Generation Commands:: (Re)generating the summary buffer.
- * Really Various Summary Commands:: Those pesky non-conformant commands.
- @end menu
- @table @code
- @vindex gnus-summary-mode-hook
- @item gnus-summary-mode-hook
- This hook is called when creating a summary mode buffer.
- @vindex gnus-summary-generate-hook
- @item gnus-summary-generate-hook
- This is called as the last thing before doing the threading and the
- generation of the summary buffer. It's quite convenient for customizing
- the threading variables based on what data the newsgroup has. This hook
- is called from the summary buffer after most summary buffer variables
- have been set.
- @vindex gnus-summary-prepare-hook
- @item gnus-summary-prepare-hook
- It is called after the summary buffer has been generated. You might use
- it to, for instance, highlight lines or modify the look of the buffer in
- some other ungodly manner. I don't care.
- @vindex gnus-summary-prepared-hook
- @item gnus-summary-prepared-hook
- A hook called as the very last thing after the summary buffer has been
- generated.
- @vindex gnus-summary-ignore-duplicates
- @item gnus-summary-ignore-duplicates
- When Gnus discovers two articles that have the same @code{Message-ID},
- it has to do something drastic. No articles are allowed to have the
- same @code{Message-ID}, but this may happen when reading mail from some
- sources. Gnus allows you to customize what happens with this variable.
- If it is @code{nil} (which is the default), Gnus will rename the
- @code{Message-ID} (for display purposes only) and display the article as
- any other article. If this variable is @code{t}, it won't display the
- article---it'll be as if it never existed.
- @vindex gnus-alter-articles-to-read-function
- @item gnus-alter-articles-to-read-function
- This function, which takes two parameters (the group name and the list
- of articles to be selected), is called to allow the user to alter the
- list of articles to be selected.
- For instance, the following function adds the list of cached articles to
- the list in one particular group:
- @lisp
- (defun my-add-cached-articles (group articles)
- (if (string= group "some.group")
- (append gnus-newsgroup-cached articles)
- articles))
- @end lisp
- @end table
- @node Summary Group Information
- @subsection Summary Group Information
- @table @kbd
- @item H f
- @kindex H f @r{(Summary)}
- @findex gnus-summary-fetch-faq
- @vindex gnus-group-faq-directory
- Try to fetch the FAQ (list of frequently asked questions) for the
- current group (@code{gnus-summary-fetch-faq}). Gnus will try to get the
- FAQ from @code{gnus-group-faq-directory}, which is usually a directory
- on a remote machine. This variable can also be a list of directories.
- In that case, giving a prefix to this command will allow you to choose
- between the various sites. @code{ange-ftp} or @code{efs} will probably
- be used for fetching the file.
- @item H d
- @kindex H d @r{(Summary)}
- @findex gnus-summary-describe-group
- Give a brief description of the current group
- (@code{gnus-summary-describe-group}). If given a prefix, force
- rereading the description from the server.
- @item H h
- @kindex H h @r{(Summary)}
- @findex gnus-summary-describe-briefly
- Give an extremely brief description of the most important summary
- keystrokes (@code{gnus-summary-describe-briefly}).
- @item H i
- @kindex H i @r{(Summary)}
- @findex gnus-info-find-node
- Go to the Gnus info node (@code{gnus-info-find-node}).
- @end table
- @node Searching for Articles
- @subsection Searching for Articles
- @table @kbd
- @item M-s
- @kindex M-s @r{(Summary)}
- @findex gnus-summary-search-article-forward
- Search through all subsequent articles for a regexp
- (@code{gnus-summary-search-article-forward}).
- @item M-r
- @kindex M-r @r{(Summary)}
- @findex gnus-summary-search-article-backward
- Search through all previous articles for a regexp
- (@code{gnus-summary-search-article-backward}).
- @item &
- @kindex & @r{(Summary)}
- @findex gnus-summary-execute-command
- This command will prompt you for a header, a regular expression to match
- on this field, and a command to be executed if the match is made
- (@code{gnus-summary-execute-command}). If the header is an empty
- string, the match is done on the entire article. If given a prefix,
- search backward instead.
- For instance, @kbd{& @key{RET} some.*string #} will put the process mark on
- all articles that have heads or bodies that match @samp{some.*string}.
- @item M-&
- @kindex M-& @r{(Summary)}
- @findex gnus-summary-universal-argument
- Perform any operation on all articles that have been marked with
- the process mark (@code{gnus-summary-universal-argument}).
- @end table
- @node Summary Generation Commands
- @subsection Summary Generation Commands
- @table @kbd
- @item Y g
- @kindex Y g @r{(Summary)}
- @findex gnus-summary-prepare
- Regenerate the current summary buffer (@code{gnus-summary-prepare}).
- @item Y c
- @kindex Y c @r{(Summary)}
- @findex gnus-summary-insert-cached-articles
- Pull all cached articles (for the current group) into the summary buffer
- (@code{gnus-summary-insert-cached-articles}).
- @end table
- @node Really Various Summary Commands
- @subsection Really Various Summary Commands
- @table @kbd
- @item A D
- @itemx C-d
- @kindex C-d @r{(Summary)}
- @kindex A D @r{(Summary)}
- @findex gnus-summary-enter-digest-group
- If the current article is a collection of other articles (for instance,
- a digest), you might use this command to enter a group based on the that
- article (@code{gnus-summary-enter-digest-group}). Gnus will try to
- guess what article type is currently displayed unless you give a prefix
- to this command, which forces a ``digest'' interpretation. Basically,
- whenever you see a message that is a collection of other messages of
- some format, you @kbd{C-d} and read these messages in a more convenient
- fashion.
- @item C-M-d
- @kindex C-M-d @r{(Summary)}
- @findex gnus-summary-read-document
- This command is very similar to the one above, but lets you gather
- several documents into one biiig group
- (@code{gnus-summary-read-document}). It does this by opening several
- @code{nndoc} groups for each document, and then opening an
- @code{nnvirtual} group on top of these @code{nndoc} groups. This
- command understands the process/prefix convention
- (@pxref{Process/Prefix}).
- @item C-t
- @kindex C-t @r{(Summary)}
- @findex gnus-summary-toggle-truncation
- Toggle truncation of summary lines
- (@code{gnus-summary-toggle-truncation}). This will probably confuse the
- line centering function in the summary buffer, so it's not a good idea
- to have truncation switched off while reading articles.
- @item =
- @kindex = @r{(Summary)}
- @findex gnus-summary-expand-window
- Expand the summary buffer window (@code{gnus-summary-expand-window}).
- If given a prefix, force an @code{article} window configuration.
- @item C-M-e
- @kindex C-M-e @r{(Summary)}
- @findex gnus-summary-edit-parameters
- Edit the group parameters (@pxref{Group Parameters}) of the current
- group (@code{gnus-summary-edit-parameters}).
- @item C-M-a
- @kindex C-M-a @r{(Summary)}
- @findex gnus-summary-customize-parameters
- Customize the group parameters (@pxref{Group Parameters}) of the current
- group (@code{gnus-summary-customize-parameters}).
- @end table
- @node Exiting the Summary Buffer
- @section Exiting the Summary Buffer
- @cindex summary exit
- @cindex exiting groups
- Exiting from the summary buffer will normally update all info on the
- group and return you to the group buffer.
- @table @kbd
- @item Z Z
- @itemx q
- @kindex Z Z @r{(Summary)}
- @kindex q @r{(Summary)}
- @findex gnus-summary-exit
- @vindex gnus-summary-exit-hook
- @vindex gnus-summary-prepare-exit-hook
- @c @icon{gnus-summary-exit}
- Exit the current group and update all information on the group
- (@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is
- called before doing much of the exiting, which calls
- @code{gnus-summary-expire-articles} by default.
- @code{gnus-summary-exit-hook} is called after finishing the exit
- process. @code{gnus-group-no-more-groups-hook} is run when returning to
- group mode having no more (unread) groups.
- @item Z E
- @itemx Q
- @kindex Z E @r{(Summary)}
- @kindex Q @r{(Summary)}
- @findex gnus-summary-exit-no-update
- Exit the current group without updating any information on the group
- (@code{gnus-summary-exit-no-update}).
- @item Z c
- @itemx c
- @kindex Z c @r{(Summary)}
- @kindex c @r{(Summary)}
- @findex gnus-summary-catchup-and-exit
- @c @icon{gnus-summary-catchup-and-exit}
- Mark all unticked articles in the group as read and then exit
- (@code{gnus-summary-catchup-and-exit}).
- @item Z C
- @kindex Z C @r{(Summary)}
- @findex gnus-summary-catchup-all-and-exit
- Mark all articles, even the ticked ones, as read and then exit
- (@code{gnus-summary-catchup-all-and-exit}).
- @item Z n
- @kindex Z n @r{(Summary)}
- @findex gnus-summary-catchup-and-goto-next-group
- Mark all articles as read and go to the next group
- (@code{gnus-summary-catchup-and-goto-next-group}).
- @item Z R
- @kindex Z R @r{(Summary)}
- @findex gnus-summary-reselect-current-group
- Exit this group, and then enter it again
- (@code{gnus-summary-reselect-current-group}). If given a prefix, select
- all articles, both read and unread.
- @item Z G
- @itemx M-g
- @kindex Z G @r{(Summary)}
- @kindex M-g @r{(Summary)}
- @findex gnus-summary-rescan-group
- @c @icon{gnus-summary-mail-get}
- Exit the group, check for new articles in the group, and select the
- group (@code{gnus-summary-rescan-group}). If given a prefix, select all
- articles, both read and unread.
- @item Z N
- @kindex Z N @r{(Summary)}
- @findex gnus-summary-next-group
- Exit the group and go to the next group
- (@code{gnus-summary-next-group}).
- @item Z P
- @kindex Z P @r{(Summary)}
- @findex gnus-summary-prev-group
- Exit the group and go to the previous group
- (@code{gnus-summary-prev-group}).
- @item Z s
- @kindex Z s @r{(Summary)}
- @findex gnus-summary-save-newsrc
- Save the current number of read/marked articles in the dribble buffer
- and then save the dribble buffer (@code{gnus-summary-save-newsrc}). If
- given a prefix, also save the @file{.newsrc} file(s). Using this
- command will make exit without updating (the @kbd{Q} command) worthless.
- @end table
- @vindex gnus-exit-group-hook
- @code{gnus-exit-group-hook} is called when you exit the current group
- with an ``updating'' exit. For instance @kbd{Q}
- (@code{gnus-summary-exit-no-update}) does not call this hook.
- @findex gnus-summary-wake-up-the-dead
- @findex gnus-dead-summary-mode
- @vindex gnus-kill-summary-on-exit
- If you're in the habit of exiting groups, and then changing your mind
- about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
- If you do that, Gnus won't kill the summary buffer when you exit it.
- (Quelle surprise!) Instead it will change the name of the buffer to
- something like @samp{*Dead Summary ... *} and install a minor mode
- called @code{gnus-dead-summary-mode}. Now, if you switch back to this
- buffer, you'll find that all keys are mapped to a function called
- @code{gnus-summary-wake-up-the-dead}. So tapping any keys in a dead
- summary buffer will result in a live, normal summary buffer.
- There will never be more than one dead summary buffer at any one time.
- @vindex gnus-use-cross-reference
- The data on the current group will be updated (which articles you have
- read, which articles you have replied to, etc.) when you exit the
- summary buffer. If the @code{gnus-use-cross-reference} variable is
- @code{t} (which is the default), articles that are cross-referenced to
- this group and are marked as read, will also be marked as read in the
- other subscribed groups they were cross-posted to. If this variable is
- neither @code{nil} nor @code{t}, the article will be marked as read in
- both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
- @node Crosspost Handling
- @section Crosspost Handling
- @cindex velveeta
- @cindex spamming
- Marking cross-posted articles as read ensures that you'll never have to
- read the same article more than once. Unless, of course, somebody has
- posted it to several groups separately. Posting the same article to
- several groups (not cross-posting) is called @dfn{spamming}, and you are
- by law required to send nasty-grams to anyone who perpetrates such a
- heinous crime. You may want to try NoCeM handling to filter out spam
- (@pxref{NoCeM}).
- Remember: Cross-posting is kinda ok, but posting the same article
- separately to several groups is not. Massive cross-posting (aka.
- @dfn{velveeta}) is to be avoided at all costs, and you can even use the
- @code{gnus-summary-mail-crosspost-complaint} command to complain about
- excessive crossposting (@pxref{Summary Mail Commands}).
- @cindex cross-posting
- @cindex Xref
- @cindex @sc{nov}
- One thing that may cause Gnus to not do the cross-posting thing
- correctly is if you use an @sc{nntp} server that supports @sc{xover}
- (which is very nice, because it speeds things up considerably) which
- does not include the @code{Xref} header in its @sc{nov} lines. This is
- Evil, but all too common, alas, alack. Gnus tries to Do The Right Thing
- even with @sc{xover} by registering the @code{Xref} lines of all
- articles you actually read, but if you kill the articles, or just mark
- them as read without reading them, Gnus will not get a chance to snoop
- the @code{Xref} lines out of these articles, and will be unable to use
- the cross reference mechanism.
- @cindex LIST overview.fmt
- @cindex overview.fmt
- To check whether your @sc{nntp} server includes the @code{Xref} header
- in its overview files, try @samp{telnet your.nntp.server nntp},
- @samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
- overview.fmt}. This may not work, but if it does, and the last line you
- get does not read @samp{Xref:full}, then you should shout and whine at
- your news admin until she includes the @code{Xref} header in the
- overview files.
- @vindex gnus-nov-is-evil
- If you want Gnus to get the @code{Xref}s right all the time, you have to
- set @code{gnus-nov-is-evil} to @code{t}, which slows things down
- considerably.
- C'est la vie.
- For an alternative approach, @pxref{Duplicate Suppression}.
- @node Duplicate Suppression
- @section Duplicate Suppression
- By default, Gnus tries to make sure that you don't have to read the same
- article more than once by utilizing the crossposting mechanism
- (@pxref{Crosspost Handling}). However, that simple and efficient
- approach may not work satisfactory for some users for various
- reasons.
- @enumerate
- @item
- The @sc{nntp} server may fail to generate the @code{Xref} header. This
- is evil and not very common.
- @item
- The @sc{nntp} server may fail to include the @code{Xref} header in the
- @file{.overview} data bases. This is evil and all too common, alas.
- @item
- You may be reading the same group (or several related groups) from
- different @sc{nntp} servers.
- @item
- You may be getting mail that duplicates articles posted to groups.
- @end enumerate
- I'm sure there are other situations where @code{Xref} handling fails as
- well, but these four are the most common situations.
- If, and only if, @code{Xref} handling fails for you, then you may
- consider switching on @dfn{duplicate suppression}. If you do so, Gnus
- will remember the @code{Message-ID}s of all articles you have read or
- otherwise marked as read, and then, as if by magic, mark them as read
- all subsequent times you see them---in @emph{all} groups. Using this
- mechanism is quite likely to be somewhat inefficient, but not overly
- so. It's certainly preferable to reading the same articles more than
- once.
- Duplicate suppression is not a very subtle instrument. It's more like a
- sledge hammer than anything else. It works in a very simple
- fashion---if you have marked an article as read, it adds this Message-ID
- to a cache. The next time it sees this Message-ID, it will mark the
- article as read with the @samp{M} mark. It doesn't care what group it
- saw the article in.
- @table @code
- @item gnus-suppress-duplicates
- @vindex gnus-suppress-duplicates
- If non-@code{nil}, suppress duplicates.
- @item gnus-save-duplicate-list
- @vindex gnus-save-duplicate-list
- If non-@code{nil}, save the list of duplicates to a file. This will
- make startup and shutdown take longer, so the default is @code{nil}.
- However, this means that only duplicate articles read in a single Gnus
- session are suppressed.
- @item gnus-duplicate-list-length
- @vindex gnus-duplicate-list-length
- This variable says how many @code{Message-ID}s to keep in the duplicate
- suppression list. The default is 10000.
- @item gnus-duplicate-file
- @vindex gnus-duplicate-file
- The name of the file to store the duplicate suppression list in. The
- default is @file{~/News/suppression}.
- @end table
- If you have a tendency to stop and start Gnus often, setting
- @code{gnus-save-duplicate-list} to @code{t} is probably a good idea. If
- you leave Gnus running for weeks on end, you may have it @code{nil}. On
- the other hand, saving the list makes startup and shutdown much slower,
- so that means that if you stop and start Gnus often, you should set
- @code{gnus-save-duplicate-list} to @code{nil}. Uhm. I'll leave this up
- to you to figure out, I think.
- @node The Article Buffer
- @chapter The Article Buffer
- @cindex article buffer
- The articles are displayed in the article buffer, of which there is only
- one. All the summary buffers share the same article buffer unless you
- tell Gnus otherwise.
- @menu
- * Hiding Headers:: Deciding what headers should be displayed.
- * Using MIME:: Pushing articles through @sc{mime} before reading them.
- * Customizing Articles:: Tailoring the look of the articles.
- * Article Keymap:: Keystrokes available in the article buffer.
- * Misc Article:: Other stuff.
- @end menu
- @node Hiding Headers
- @section Hiding Headers
- @cindex hiding headers
- @cindex deleting headers
- The top section of each article is the @dfn{head}. (The rest is the
- @dfn{body}, but you may have guessed that already.)
- @vindex gnus-show-all-headers
- There is a lot of useful information in the head: the name of the person
- who wrote the article, the date it was written and the subject of the
- article. That's well and nice, but there's also lots of information
- most people do not want to see---what systems the article has passed
- through before reaching you, the @code{Message-ID}, the
- @code{References}, etc. ad nauseum---and you'll probably want to get rid
- of some of those lines. If you want to keep all those lines in the
- article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
- Gnus provides you with two variables for sifting headers:
- @table @code
- @item gnus-visible-headers
- @vindex gnus-visible-headers
- If this variable is non-@code{nil}, it should be a regular expression
- that says what headers you wish to keep in the article buffer. All
- headers that do not match this variable will be hidden.
- For instance, if you only want to see the name of the person who wrote
- the article and the subject, you'd say:
- @lisp
- (setq gnus-visible-headers "^From:\\|^Subject:")
- @end lisp
- This variable can also be a list of regexps to match headers to
- remain visible.
- @item gnus-ignored-headers
- @vindex gnus-ignored-headers
- This variable is the reverse of @code{gnus-visible-headers}. If this
- variable is set (and @code{gnus-visible-headers} is @code{nil}), it
- should be a regular expression that matches all lines that you want to
- hide. All lines that do not match this variable will remain visible.
- For instance, if you just want to get rid of the @code{References} line
- and the @code{Xref} line, you might say:
- @lisp
- (setq gnus-ignored-headers "^References:\\|^Xref:")
- @end lisp
- This variable can also be a list of regexps to match headers to
- be removed.
- Note that if @code{gnus-visible-headers} is non-@code{nil}, this
- variable will have no effect.
- @end table
- @vindex gnus-sorted-header-list
- Gnus can also sort the headers for you. (It does this by default.) You
- can control the sorting by setting the @code{gnus-sorted-header-list}
- variable. It is a list of regular expressions that says in what order
- the headers are to be displayed.
- For instance, if you want the name of the author of the article first,
- and then the subject, you might say something like:
- @lisp
- (setq gnus-sorted-header-list '("^From:" "^Subject:"))
- @end lisp
- Any headers that are to remain visible, but are not listed in this
- variable, will be displayed in random order after all the headers listed in this variable.
- @findex gnus-article-hide-boring-headers
- @vindex gnus-boring-article-headers
- You can hide further boring headers by setting
- @code{gnus-treat-hide-boring-header} to @code{head}. What this function
- does depends on the @code{gnus-boring-article-headers} variable. It's a
- list, but this list doesn't actually contain header names. Instead is
- lists various @dfn{boring conditions} that Gnus can check and remove
- from sight.
- These conditions are:
- @table @code
- @item empty
- Remove all empty headers.
- @item followup-to
- Remove the @code{Followup-To} header if it is identical to the
- @code{Newsgroups} header.
- @item reply-to
- Remove the @code{Reply-To} header if it lists the same address as the
- @code{From} header.
- @item newsgroups
- Remove the @code{Newsgroups} header if it only contains the current group
- name.
- @item date
- Remove the @code{Date} header if the article is less than three days
- old.
- @item long-to
- Remove the @code{To} header if it is very long.
- @item many-to
- Remove all @code{To} headers if there are more than one.
- @end table
- To include the four three elements, you could say something like;
- @lisp
- (setq gnus-boring-article-headers
- '(empty followup-to reply-to))
- @end lisp
- This is also the default value for this variable.
- @node Using MIME
- @section Using @sc{mime}
- @cindex @sc{mime}
- Mime is a standard for waving your hands through the air, aimlessly,
- while people stand around yawning.
- @sc{mime}, however, is a standard for encoding your articles, aimlessly,
- while all newsreaders die of fear.
- @sc{mime} may specify what character set the article uses, the encoding
- of the characters, and it also makes it possible to embed pictures and
- other naughty stuff in innocent-looking articles.
- @vindex gnus-display-mime-function
- @findex gnus-display-mime
- Gnus pushes @sc{mime} articles through @code{gnus-display-mime-function}
- to display the @sc{mime} parts. This is @code{gnus-display-mime} by
- default, which creates a bundle of clickable buttons that can be used to
- display, save and manipulate the @sc{mime} objects.
- The following commands are available when you have placed point over a
- @sc{mime} button:
- @table @kbd
- @findex gnus-article-press-button
- @item @key{RET} @r{(Article)}
- @itemx Mouse-2 @r{(Article)}
- Toggle displaying of the @sc{mime} object
- (@code{gnus-article-press-button}).
- @findex gnus-mime-view-part
- @item M-@key{RET} @r{(Article)}
- @itemx v @r{(Article)}
- Prompt for a method, and then view the @sc{mime} object using this
- method (@code{gnus-mime-view-part}).
- @findex gnus-mime-save-part
- @item o @r{(Article)}
- Prompt for a file name, and then save the @sc{mime} object
- (@code{gnus-mime-save-part}).
- @findex gnus-mime-copy-part
- @item c @r{(Article)}
- Copy the @sc{mime} object to a fresh buffer and display this buffer
- (@code{gnus-mime-copy-part}).
- @findex gnus-mime-view-part-as-type
- @item t @r{(Article)}
- View the @sc{mime} object as if it were a different @sc{mime} media type
- (@code{gnus-mime-view-part-as-type}).
- @findex gnus-mime-pipe-part
- @item | @r{(Article)}
- Output the @sc{mime} object to a process (@code{gnus-mime-pipe-part}).
- @findex gnus-mime-inline-part
- @item i @r{(Article)}
- Insert the contents of the @sc{mime} object into the buffer
- (@code{gnus-mime-inline-part}) as text/plain. If given a prefix, insert
- the raw contents without decoding. If given a numerical prefix, you can
- do semi-manual charset stuff (see
- @code{gnus-summary-show-article-charset-alist} in @pxref{Paging the
- Article}).
- @findex gnus-mime-action-on-part
- @item . @r{(Article)}
- Interactively run an action on the @sc{mime} object
- (@code{gnus-mime-action-on-part}).
- @end table
- Gnus will display some @sc{mime} objects automatically. The way Gnus
- determines which parts to do this with is described in the Emacs MIME
- manual.
- It might be best to just use the toggling functions from the article
- buffer to avoid getting nasty surprises. (For instance, you enter the
- group @samp{alt.sing-a-long} and, before you know it, @sc{mime} has
- decoded the sound file in the article and some horrible sing-a-long song
- comes screaming out your speakers, and you can't find the volume button,
- because there isn't one, and people are starting to look at you, and you
- try to stop the program, but you can't, and you can't find the program
- to control the volume, and everybody else in the room suddenly decides
- to look at you disdainfully, and you'll feel rather stupid.)
- Any similarity to real events and people is purely coincidental. Ahem.
- Also see @pxref{MIME Commands}.
- @node Customizing Articles
- @section Customizing Articles
- @cindex article customization
- A slew of functions for customizing how the articles are to look like
- exist. You can call these functions interactively, or you can have them
- called automatically when you select the articles.
- To have them called automatically, you should set the corresponding
- ``treatment'' variable. For instance, to have headers hidden, you'd set
- @code{gnus-treat-hide-headers}. Below is a list of variables that can
- be set, but first we discuss the values these variables can have.
- Note: Some values, while valid, make little sense. Check the list below
- for sensible values.
- @enumerate
- @item
- @code{nil}: Don't do this treatment.
- @item
- @code{t}: Do this treatment on all body parts.
- @item
- @code{head}: Do the treatment on the headers.
- @item
- @code{last}: Do this treatment on the last part.
- @item
- An integer: Do this treatment on all body parts that have a length less
- than this number.
- @item
- A list of strings: Do this treatment on all body parts that are in
- articles that are read in groups that have names that match one of the
- regexps in the list.
- @item
- A list where the first element is not a string:
- The list is evaluated recursively. The first element of the list is a
- predicate. The following predicates are recognized: @code{or},
- @code{and}, @code{not} and @code{typep}. Here's an example:
- @lisp
- (or last
- (typep "text/x-vcard"))
- @end lisp
- @end enumerate
- You may have noticed that the word @dfn{part} is used here. This refers
- to the fact that some messages are @sc{mime} multipart articles that may
- be divided into several parts. Articles that are not multiparts are
- considered to contain just a single part.
- @vindex gnus-article-treat-types
- Are the treatments applied to all sorts of multipart parts? Yes, if you
- want to, but by default, only @samp{text/plain} parts are given the
- treatment. This is controlled by the @code{gnus-article-treat-types}
- variable, which is a list of regular expressions that are matched to the
- type of the part. This variable is ignored if the value of the
- controlling variable is a predicate list, as described above.
- The following treatment options are available. The easiest way to
- customize this is to examine the @code{gnus-article-treat} customization
- group. Values in parenthesis are suggested sensible values. Others are
- possible but those listed are probably sufficient for most people.
- @table @code
- @item gnus-treat-highlight-signature (t, last)
- @item gnus-treat-buttonize (t, integer)
- @item gnus-treat-buttonize-head (head)
- @item gnus-treat-emphasize (t, head, integer)
- @item gnus-treat-fill-article (t, integer)
- @item gnus-treat-strip-cr (t, integer)
- @item gnus-treat-hide-headers (head)
- @item gnus-treat-hide-boring-headers (head)
- @item gnus-treat-hide-signature (t, last)
- @item gnus-treat-hide-citation (t, integer)
- @item gnus-treat-strip-pgp (t, last, integer)
- @item gnus-treat-strip-pem (t, last, integer)
- @item gnus-treat-highlight-headers (head)
- @item gnus-treat-highlight-citation (t, integer)
- @item gnus-treat-highlight-signature (t, last, integer)
- @item gnus-treat-date-ut (head)
- @item gnus-treat-date-local (head)
- @item gnus-treat-date-lapsed (head)
- @item gnus-treat-date-original (head)
- @item gnus-treat-strip-headers-in-body (t, integer)
- @item gnus-treat-strip-trailing-blank-lines (t, last, integer)
- @item gnus-treat-strip-leading-blank-lines (t, integer)
- @item gnus-treat-strip-multiple-blank-lines (t, integer)
- @item gnus-treat-overstrike (t, integer)
- @item gnus-treat-display-xface (head)
- @item gnus-treat-display-smileys (t, integer)
- @item gnus-treat-display-picons (head)
- @item gnus-treat-capitalize-sentences (t, integer)
- @item gnus-treat-fill-long-lines (t, integer)
- @item gnus-treat-play-sounds
- @item gnus-treat-translate
- @end table
- @vindex gnus-part-display-hook
- You can, of course, write your own functions to be called from
- @code{gnus-part-display-hook}. The functions are called narrowed to the
- part, and you can do anything you like, pretty much. There is no
- information that you have to keep in the buffer---you can change
- everything.
- @node Article Keymap
- @section Article Keymap
- Most of the keystrokes in the summary buffer can also be used in the
- article buffer. They should behave as if you typed them in the summary
- buffer, which means that you don't actually have to have a summary
- buffer displayed while reading. You can do it all from the article
- buffer.
- A few additional keystrokes are available:
- @table @kbd
- @item @key{SPC}
- @kindex @key{SPC} @r{(Article)}
- @findex gnus-article-next-page
- Scroll forwards one page (@code{gnus-article-next-page}).
- @item @key{DEL}
- @kindex @key{DEL} @r{(Article)}
- @findex gnus-article-prev-page
- Scroll backwards one page (@code{gnus-article-prev-page}).
- @item C-c ^
- @kindex C-c ^ @r{(Article)}
- @findex gnus-article-refer-article
- If point is in the neighborhood of a @code{Message-ID} and you press
- @kbd{C-c ^}, Gnus will try to get that article from the server
- (@code{gnus-article-refer-article}).
- @item C-c C-m
- @kindex C-c C-m @r{(Article)}
- @findex gnus-article-mail
- Send a reply to the address near point (@code{gnus-article-mail}). If
- given a prefix, include the mail.
- @item s
- @kindex s @r{(Article)}
- @findex gnus-article-show-summary
- Reconfigure the buffers so that the summary buffer becomes visible
- (@code{gnus-article-show-summary}).
- @item ?
- @kindex ? @r{(Article)}
- @findex gnus-article-describe-briefly
- Give a very brief description of the available keystrokes
- (@code{gnus-article-describe-briefly}).
- @item TAB
- @kindex TAB @r{(Article)}
- @findex gnus-article-next-button
- Go to the next button, if any (@code{gnus-article-next-button}). This
- only makes sense if you have buttonizing turned on.
- @item M-TAB
- @kindex M-TAB @r{(Article)}
- @findex gnus-article-prev-button
- Go to the previous button, if any (@code{gnus-article-prev-button}).
- @end table
- @node Misc Article
- @section Misc Article
- @table @code
- @item gnus-single-article-buffer
- @vindex gnus-single-article-buffer
- If non-@code{nil}, use the same article buffer for all the groups.
- (This is the default.) If @code{nil}, each group will have its own
- article buffer.
- @vindex gnus-article-decode-hook
- @item gnus-article-decode-hook
- @cindex MIME
- Hook used to decode @sc{mime} articles. The default value is
- @code{(article-decode-charset article-decode-encoded-words)}
- @vindex gnus-article-prepare-hook
- @item gnus-article-prepare-hook
- This hook is called right after the article has been inserted into the
- article buffer. It is mainly intended for functions that do something
- depending on the contents; it should probably not be used for changing
- the contents of the article buffer.
- @item gnus-article-mode-hook
- @vindex gnus-article-mode-hook
- Hook called in article mode buffers.
- @item gnus-article-mode-syntax-table
- @vindex gnus-article-mode-syntax-table
- Syntax table used in article buffers. It is initialized from
- @code{text-mode-syntax-table}.
- @vindex gnus-article-mode-line-format
- @item gnus-article-mode-line-format
- This variable is a format string along the same lines as
- @code{gnus-summary-mode-line-format} (@pxref{Mode Line Formatting}). It
- accepts the same format specifications as that variable, with two
- extensions:
- @table @samp
- @item w
- The @dfn{wash status} of the article. This is a short string with one
- character for each possible article wash operation that may have been
- performed.
- @item m
- The number of @sc{mime} parts in the article.
- @end table
- @vindex gnus-break-pages
- @item gnus-break-pages
- Controls whether @dfn{page breaking} is to take place. If this variable
- is non-@code{nil}, the articles will be divided into pages whenever a
- page delimiter appears in the article. If this variable is @code{nil},
- paging will not be done.
- @item gnus-page-delimiter
- @vindex gnus-page-delimiter
- This is the delimiter mentioned above. By default, it is @samp{^L}
- (formfeed).
- @end table
- @node Composing Messages
- @chapter Composing Messages
- @cindex composing messages
- @cindex messages
- @cindex mail
- @cindex sending mail
- @cindex reply
- @cindex followup
- @cindex post
- @kindex C-c C-c (Post)
- All commands for posting and mailing will put you in a message buffer
- where you can edit the article all you like, before you send the
- article by pressing @kbd{C-c C-c}. @xref{Top, , Top, message, The
- Message Manual}. Where the message will be posted/mailed to depends
- on your setup (@pxref{Posting Server}).
- @menu
- * Mail:: Mailing and replying.
- * Posting Server:: What server should you post via?
- * Mail and Post:: Mailing and posting at the same time.
- * Archived Messages:: Where Gnus stores the messages you've sent.
- * Posting Styles:: An easier way to specify who you are.
- * Drafts:: Postponing messages and rejected messages.
- * Rejected Articles:: What happens if the server doesn't like your article?
- @end menu
- Also see @pxref{Canceling and Superseding} for information on how to
- remove articles you shouldn't have posted.
- @node Mail
- @section Mail
- Variables for customizing outgoing mail:
- @table @code
- @item gnus-uu-digest-headers
- @vindex gnus-uu-digest-headers
- List of regexps to match headers included in digested messages. The
- headers will be included in the sequence they are matched.
- @item gnus-add-to-list
- @vindex gnus-add-to-list
- If non-@code{nil}, add a @code{to-list} group parameter to mail groups
- that have none when you do a @kbd{a}.
- @end table
- @node Posting Server
- @section Posting Server
- When you press those magical @kbd{C-c C-c} keys to ship off your latest
- (extremely intelligent, of course) article, where does it go?
- Thank you for asking. I hate you.
- @vindex gnus-post-method
- It can be quite complicated. Normally, Gnus will use the same native
- server. However. If your native server doesn't allow posting, just
- reading, you probably want to use some other server to post your
- (extremely intelligent and fabulously interesting) articles. You can
- then set the @code{gnus-post-method} to some other method:
- @lisp
- (setq gnus-post-method '(nnspool ""))
- @end lisp
- Now, if you've done this, and then this server rejects your article, or
- this server is down, what do you do then? To override this variable you
- can use a non-zero prefix to the @kbd{C-c C-c} command to force using
- the ``current'' server for posting.
- If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
- Gnus will prompt you for what method to use for posting.
- You can also set @code{gnus-post-method} to a list of select methods.
- If that's the case, Gnus will always prompt you for what method to use
- for posting.
- Finally, if you want to always post using the same select method as
- you're reading from (which might be convenient if you're reading lots of
- groups from different private servers), you can set this variable to
- @code{current}.
- @node Mail and Post
- @section Mail and Post
- Here's a list of variables relevant to both mailing and
- posting:
- @table @code
- @item gnus-mailing-list-groups
- @findex gnus-mailing-list-groups
- @cindex mailing lists
- If your news server offers groups that are really mailing lists
- gatewayed to the @sc{nntp} server, you can read those groups without
- problems, but you can't post/followup to them without some difficulty.
- One solution is to add a @code{to-address} to the group parameters
- (@pxref{Group Parameters}). An easier thing to do is set the
- @code{gnus-mailing-list-groups} to a regexp that matches the groups that
- really are mailing lists. Then, at least, followups to the mailing
- lists will work most of the time. Posting to these groups (@kbd{a}) is
- still a pain, though.
- @end table
- You may want to do spell-checking on messages that you send out. Or, if
- you don't want to spell-check by hand, you could add automatic
- spell-checking via the @code{ispell} package:
- @cindex ispell
- @findex ispell-message
- @lisp
- (add-hook 'message-send-hook 'ispell-message)
- @end lisp
- If you want to change the @code{ispell} dictionary based on what group
- you're in, you could say something like the following:
- @lisp
- (add-hook 'gnus-select-group-hook
- (lambda ()
- (cond
- ((string-match "^de\\." gnus-newsgroup-name)
- (ispell-change-dictionary "deutsch"))
- (t
- (ispell-change-dictionary "english")))))
- @end lisp
- Modify to suit your needs.
- @node Archived Messages
- @section Archived Messages
- @cindex archived messages
- @cindex sent messages
- Gnus provides a few different methods for storing the mail and news you
- send. The default method is to use the @dfn{archive virtual server} to
- store the messages. If you want to disable this completely, the
- @code{gnus-message-archive-group} variable should be @code{nil}, which
- is the default.
- @vindex gnus-message-archive-method
- @code{gnus-message-archive-method} says what virtual server Gnus is to
- use to store sent messages. The default is:
- @lisp
- (nnfolder "archive"
- (nnfolder-directory "~/Mail/archive")
- (nnfolder-active-file "~/Mail/archive/active")
- (nnfolder-get-new-mail nil)
- (nnfolder-inhibit-expiry t))
- @end lisp
- You can, however, use any mail select method (@code{nnml},
- @code{nnmbox}, etc.). @code{nnfolder} is a quite likable select method
- for doing this sort of thing, though. If you don't like the default
- directory chosen, you could say something like:
- @lisp
- (setq gnus-message-archive-method
- '(nnfolder "archive"
- (nnfolder-inhibit-expiry t)
- (nnfolder-active-file "~/News/sent-mail/active")
- (nnfolder-directory "~/News/sent-mail/")))
- @end lisp
- @vindex gnus-message-archive-group
- @cindex Gcc
- Gnus will insert @code{Gcc} headers in all outgoing messages that point
- to one or more group(s) on that server. Which group to use is
- determined by the @code{gnus-message-archive-group} variable.
- This variable can be used to do the following:
- @itemize @bullet
- @item a string
- Messages will be saved in that group.
- Note that you can include a select method in the group name, then the
- message will not be stored in the select method given by
- @code{gnus-message-archive-method}, but in the select method specified
- by the group name, instead. Suppose @code{gnus-message-archive-method}
- has the default value shown above. Then setting
- @code{gnus-message-archive-group} to @code{"foo"} means that outgoing
- messages are stored in @samp{nnfolder+archive:foo}, but if you use the
- value @code{"nnml:foo"}, then outgoing messages will be stored in
- @samp{nnml:foo}.
- @item a list of strings
- Messages will be saved in all those groups.
- @item an alist of regexps, functions and forms
- When a key ``matches'', the result is used.
- @item @code{nil}
- No message archiving will take place. This is the default.
- @end itemize
- Let's illustrate:
- Just saving to a single group called @samp{MisK}:
- @lisp
- (setq gnus-message-archive-group "MisK")
- @end lisp
- Saving to two groups, @samp{MisK} and @samp{safe}:
- @lisp
- (setq gnus-message-archive-group '("MisK" "safe"))
- @end lisp
- Save to different groups based on what group you are in:
- @lisp
- (setq gnus-message-archive-group
- '(("^alt" "sent-to-alt")
- ("mail" "sent-to-mail")
- (".*" "sent-to-misc")))
- @end lisp
- More complex stuff:
- @lisp
- (setq gnus-message-archive-group
- '((if (message-news-p)
- "misc-news"
- "misc-mail")))
- @end lisp
- How about storing all news messages in one file, but storing all mail
- messages in one file per month:
- @lisp
- (setq gnus-message-archive-group
- '((if (message-news-p)
- "misc-news"
- (concat "mail." (format-time-string "%Y-%m")))))
- @end lisp
- (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
- use a different value for @code{gnus-message-archive-group} there.)
- Now, when you send a message off, it will be stored in the appropriate
- group. (If you want to disable storing for just one particular message,
- you can just remove the @code{Gcc} header that has been inserted.) The
- archive group will appear in the group buffer the next time you start
- Gnus, or the next time you press @kbd{F} in the group buffer. You can
- enter it and read the articles in it just like you'd read any other
- group. If the group gets really big and annoying, you can simply rename
- if (using @kbd{G r} in the group buffer) to something
- nice---@samp{misc-mail-september-1995}, or whatever. New messages will
- continue to be stored in the old (now empty) group.
- That's the default method of archiving sent messages. Gnus offers a
- different way for the people who don't like the default method. In that
- case you should set @code{gnus-message-archive-group} to @code{nil};
- this will disable archiving.
- @table @code
- @item gnus-outgoing-message-group
- @vindex gnus-outgoing-message-group
- All outgoing messages will be put in this group. If you want to store
- all your outgoing mail and articles in the group @samp{nnml:archive},
- you set this variable to that value. This variable can also be a list of
- group names.
- If you want to have greater control over what group to put each
- message in, you can set this variable to a function that checks the
- current newsgroup name and then returns a suitable group name (or list
- of names).
- This variable can be used instead of @code{gnus-message-archive-group},
- but the latter is the preferred method.
- @end table
- @node Posting Styles
- @section Posting Styles
- @cindex posting styles
- @cindex styles
- All them variables, they make my head swim.
- So what if you want a different @code{Organization} and signature based
- on what groups you post to? And you post both from your home machine
- and your work machine, and you want different @code{From} lines, and so
- on?
- @vindex gnus-posting-styles
- One way to do stuff like that is to write clever hooks that change the
- variables you need to have changed. That's a bit boring, so somebody
- came up with the bright idea of letting the user specify these things in
- a handy alist. Here's an example of a @code{gnus-posting-styles}
- variable:
- @lisp
- ((".*"
- (signature "Peace and happiness")
- (organization "What me?"))
- ("^comp"
- (signature "Death to everybody"))
- ("comp.emacs.i-love-it"
- (organization "Emacs is it")))
- @end lisp
- As you might surmise from this example, this alist consists of several
- @dfn{styles}. Each style will be applicable if the first element
- ``matches'', in some form or other. The entire alist will be iterated
- over, from the beginning towards the end, and each match will be
- applied, which means that attributes in later styles that match override
- the same attributes in earlier matching styles. So
- @samp{comp.programming.literate} will have the @samp{Death to everybody}
- signature and the @samp{What me?} @code{Organization} header.
- The first element in each style is called the @code{match}. If it's a
- string, then Gnus will try to regexp match it against the group name.
- If it is the symbol @code{header}, then Gnus will look for header that
- match the next element in the match, and compare that to the last header
- in the match. If it's a function symbol, that function will be called
- with no arguments. If it's a variable symbol, then the variable will be
- referenced. If it's a list, then that list will be @code{eval}ed. In
- any case, if this returns a non-@code{nil} value, then the style is said
- to @dfn{match}.
- Each style may contain a arbitrary amount of @dfn{attributes}. Each
- attribute consists of a @code{(@var{name} . @var{value})} pair. The
- attribute name can be one of @code{signature}, @code{signature-file},
- @code{organization}, @code{address}, @code{name} or @code{body}. The
- attribute name can also be a string. In that case, this will be used as
- a header name, and the value will be inserted in the headers of the
- article; if the value is @code{nil}, the header name will be removed.
- If the attribute name is @code{eval}, the form is evaluated, and the
- result is thrown away.
- The attribute value can be a string (used verbatim), a function with
- zero arguments (the return value will be used), a variable (its value
- will be used) or a list (it will be @code{eval}ed and the return value
- will be used). The functions and sexps are called/@code{eval}ed in the
- message buffer that is being set up. The headers of the current article
- are available through the @code{message-reply-headers} variable.
- If you wish to check whether the message you are about to compose is
- meant to be a news article or a mail message, you can check the values
- of the @code{message-news-p} and @code{message-mail-p} functions.
- @findex message-mail-p
- @findex message-news-p
- So here's a new example:
- @lisp
- (setq gnus-posting-styles
- '((".*"
- (signature-file "~/.signature")
- (name "User Name")
- ("X-Home-Page" (getenv "WWW_HOME"))
- (organization "People's Front Against MWM"))
- ("^rec.humor"
- (signature my-funny-signature-randomizer))
- ((equal (system-name) "gnarly")
- (signature my-quote-randomizer))
- ((message-news-p)
- (signature my-news-signature))
- (header "From\\|To" "larsi.*org"
- (Organization "Somewhere, Inc."))
- ((posting-from-work-p)
- (signature-file "~/.work-signature")
- (address "user@@bar.foo")
- (body "You are fired.\n\nSincerely, your boss.")
- (organization "Important Work, Inc"))
- ("nnml:.*"
- (From (save-excursion
- (set-buffer gnus-article-buffer)
- (message-fetch-field "to"))))
- ("^nn.+:"
- (signature-file "~/.mail-signature"))))
- @end lisp
- The @samp{nnml:.*} rule means that you use the @code{To} address as the
- @code{From} address in all your outgoing replies, which might be handy
- if you fill many roles.
- @node Drafts
- @section Drafts
- @cindex drafts
- If you are writing a message (mail or news) and suddenly remember that
- you have a steak in the oven (or some pesto in the food processor, you
- craaazy vegetarians), you'll probably wish there was a method to save
- the message you are writing so that you can continue editing it some
- other day, and send it when you feel its finished.
- Well, don't worry about it. Whenever you start composing a message of
- some sort using the Gnus mail and post commands, the buffer you get will
- automatically associate to an article in a special @dfn{draft} group.
- If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
- article will be saved there. (Auto-save files also go to the draft
- group.)
- @cindex nndraft
- @vindex nndraft-directory
- The draft group is a special group (which is implemented as an
- @code{nndraft} group, if you absolutely have to know) called
- @samp{nndraft:drafts}. The variable @code{nndraft-directory} says where
- @code{nndraft} is to store its files. What makes this group special is
- that you can't tick any articles in it or mark any articles as
- read---all articles in the group are permanently unread.
- If the group doesn't exist, it will be created and you'll be subscribed
- to it. The only way to make it disappear from the Group buffer is to
- unsubscribe it.
- @c @findex gnus-dissociate-buffer-from-draft
- @c @kindex C-c M-d (Mail)
- @c @kindex C-c M-d (Post)
- @c @findex gnus-associate-buffer-with-draft
- @c @kindex C-c C-d (Mail)
- @c @kindex C-c C-d (Post)
- @c If you're writing some super-secret message that you later want to
- @c encode with PGP before sending, you may wish to turn the auto-saving
- @c (and association with the draft group) off. You never know who might be
- @c interested in reading all your extremely valuable and terribly horrible
- @c and interesting secrets. The @kbd{C-c M-d}
- @c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
- @c If you change your mind and want to turn the auto-saving back on again,
- @c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
- @c
- @c @vindex gnus-use-draft
- @c To leave association with the draft group off by default, set
- @c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default.
- @findex gnus-draft-edit-message
- @kindex D e (Draft)
- When you want to continue editing the article, you simply enter the
- draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do
- that. You will be placed in a buffer where you left off.
- Rejected articles will also be put in this draft group (@pxref{Rejected
- Articles}).
- @findex gnus-draft-send-all-messages
- @findex gnus-draft-send-message
- If you have lots of rejected messages you want to post (or mail) without
- doing further editing, you can use the @kbd{D s} command
- (@code{gnus-draft-send-message}). This command understands the
- process/prefix convention (@pxref{Process/Prefix}). The @kbd{D S}
- command (@code{gnus-draft-send-all-messages}) will ship off all messages
- in the buffer.
- If you have some messages that you wish not to send, you can use the
- @kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message
- as unsendable. This is a toggling command.
- @node Rejected Articles
- @section Rejected Articles
- @cindex rejected articles
- Sometimes a news server will reject an article. Perhaps the server
- doesn't like your face. Perhaps it just feels miserable. Perhaps
- @emph{there be demons}. Perhaps you have included too much cited text.
- Perhaps the disk is full. Perhaps the server is down.
- These situations are, of course, totally beyond the control of Gnus.
- (Gnus, of course, loves the way you look, always feels great, has angels
- fluttering around inside of it, doesn't care about how much cited text
- you include, never runs full and never goes down.) So Gnus saves these
- articles until some later time when the server feels better.
- The rejected articles will automatically be put in a special draft group
- (@pxref{Drafts}). When the server comes back up again, you'd then
- typically enter that group and send all the articles off.
- @node Select Methods
- @chapter Select Methods
- @cindex foreign groups
- @cindex select methods
- A @dfn{foreign group} is a group not read by the usual (or
- default) means. It could be, for instance, a group from a different
- @sc{nntp} server, it could be a virtual group, or it could be your own
- personal mail group.
- A foreign group (or any group, really) is specified by a @dfn{name} and
- a @dfn{select method}. To take the latter first, a select method is a
- list where the first element says what back end to use (e.g. @code{nntp},
- @code{nnspool}, @code{nnml}) and the second element is the @dfn{server
- name}. There may be additional elements in the select method, where the
- value may have special meaning for the back end in question.
- One could say that a select method defines a @dfn{virtual server}---so
- we do just that (@pxref{The Server Buffer}).
- The @dfn{name} of the group is the name the back end will recognize the
- group as.
- For instance, the group @samp{soc.motss} on the @sc{nntp} server
- @samp{some.where.edu} will have the name @samp{soc.motss} and select
- method @code{(nntp "some.where.edu")}. Gnus will call this group
- @samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
- back end just knows this group as @samp{soc.motss}.
- The different methods all have their peculiarities, of course.
- @menu
- * The Server Buffer:: Making and editing virtual servers.
- * Getting News:: Reading USENET news with Gnus.
- * Getting Mail:: Reading your personal mail with Gnus.
- * Browsing the Web:: Getting messages from a plethora of Web sources.
- * Other Sources:: Reading directories, files, SOUP packets.
- * Combined Groups:: Combining groups into one group.
- * Gnus Unplugged:: Reading news and mail offline.
- @end menu
- @node The Server Buffer
- @section The Server Buffer
- Traditionally, a @dfn{server} is a machine or a piece of software that
- one connects to, and then requests information from. Gnus does not
- connect directly to any real servers, but does all transactions through
- one back end or other. But that's just putting one layer more between
- the actual media and Gnus, so we might just as well say that each
- back end represents a virtual server.
- For instance, the @code{nntp} back end may be used to connect to several
- different actual @sc{nntp} servers, or, perhaps, to many different ports
- on the same actual @sc{nntp} server. You tell Gnus which back end to
- use, and what parameters to set by specifying a @dfn{select method}.
- These select method specifications can sometimes become quite
- complicated---say, for instance, that you want to read from the
- @sc{nntp} server @samp{news.funet.fi} on port number 13, which
- hangs if queried for @sc{nov} headers and has a buggy select. Ahem.
- Anyway, if you had to specify that for each group that used this
- server, that would be too much work, so Gnus offers a way of naming
- select methods, which is what you do in the server buffer.
- To enter the server buffer, use the @kbd{^}
- (@code{gnus-group-enter-server-mode}) command in the group buffer.
- @menu
- * Server Buffer Format:: You can customize the look of this buffer.
- * Server Commands:: Commands to manipulate servers.
- * Example Methods:: Examples server specifications.
- * Creating a Virtual Server:: An example session.
- * Server Variables:: Which variables to set.
- * Servers and Methods:: You can use server names as select methods.
- * Unavailable Servers:: Some servers you try to contact may be down.
- @end menu
- @vindex gnus-server-mode-hook
- @code{gnus-server-mode-hook} is run when creating the server buffer.
- @node Server Buffer Format
- @subsection Server Buffer Format
- @cindex server buffer format
- @vindex gnus-server-line-format
- You can change the look of the server buffer lines by changing the
- @code{gnus-server-line-format} variable. This is a @code{format}-like
- variable, with some simple extensions:
- @table @samp
- @item h
- How the news is fetched---the back end name.
- @item n
- The name of this server.
- @item w
- Where the news is to be fetched from---the address.
- @item s
- The opened/closed/denied status of the server.
- @end table
- @vindex gnus-server-mode-line-format
- The mode line can also be customized by using the
- @code{gnus-server-mode-line-format} variable (@pxref{Mode Line
- Formatting}). The following specs are understood:
- @table @samp
- @item S
- Server name.
- @item M
- Server method.
- @end table
- Also @pxref{Formatting Variables}.
- @node Server Commands
- @subsection Server Commands
- @cindex server commands
- @table @kbd
- @item a
- @kindex a (Server)
- @findex gnus-server-add-server
- Add a new server (@code{gnus-server-add-server}).
- @item e
- @kindex e (Server)
- @findex gnus-server-edit-server
- Edit a server (@code{gnus-server-edit-server}).
- @item @key{SPC}
- @kindex @key{SPC} (Server)
- @findex gnus-server-read-server
- Browse the current server (@code{gnus-server-read-server}).
- @item q
- @kindex q (Server)
- @findex gnus-server-exit
- Return to the group buffer (@code{gnus-server-exit}).
- @item k
- @kindex k (Server)
- @findex gnus-server-kill-server
- Kill the current server (@code{gnus-server-kill-server}).
- @item y
- @kindex y (Server)
- @findex gnus-server-yank-server
- Yank the previously killed server (@code{gnus-server-yank-server}).
- @item c
- @kindex c (Server)
- @findex gnus-server-copy-server
- Copy the current server (@code{gnus-server-copy-server}).
- @item l
- @kindex l (Server)
- @findex gnus-server-list-servers
- List all servers (@code{gnus-server-list-servers}).
- @item s
- @kindex s (Server)
- @findex gnus-server-scan-server
- Request that the server scan its sources for new articles
- (@code{gnus-server-scan-server}). This is mainly sensible with mail
- servers.
- @item g
- @kindex g (Server)
- @findex gnus-server-regenerate-server
- Request that the server regenerate all its data structures
- (@code{gnus-server-regenerate-server}). This can be useful if you have
- a mail back end that has gotten out of sync.
- @end table
- @node Example Methods
- @subsection Example Methods
- Most select methods are pretty simple and self-explanatory:
- @lisp
- (nntp "news.funet.fi")
- @end lisp
- Reading directly from the spool is even simpler:
- @lisp
- (nnspool "")
- @end lisp
- As you can see, the first element in a select method is the name of the
- back end, and the second is the @dfn{address}, or @dfn{name}, if you
- will.
- After these two elements, there may be an arbitrary number of
- @code{(@var{variable} @var{form})} pairs.
- To go back to the first example---imagine that you want to read from
- port 15 on that machine. This is what the select method should
- look like then:
- @lisp
- (nntp "news.funet.fi" (nntp-port-number 15))
- @end lisp
- You should read the documentation to each back end to find out what
- variables are relevant, but here's an @code{nnmh} example:
- @code{nnmh} is a mail back end that reads a spool-like structure. Say
- you have two structures that you wish to access: One is your private
- mail spool, and the other is a public one. Here's the possible spec for
- your private mail:
- @lisp
- (nnmh "private" (nnmh-directory "~/private/mail/"))
- @end lisp
- (This server is then called @samp{private}, but you may have guessed
- that.)
- Here's the method for a public spool:
- @lisp
- (nnmh "public"
- (nnmh-directory "/usr/information/spool/")
- (nnmh-get-new-mail nil))
- @end lisp
- @cindex proxy
- @cindex firewall
- If you are behind a firewall and only have access to the @sc{nntp}
- server from the firewall machine, you can instruct Gnus to @code{rlogin}
- on the firewall machine and telnet from there to the @sc{nntp} server.
- Doing this can be rather fiddly, but your virtual server definition
- should probably look something like this:
- @lisp
- (nntp "firewall"
- (nntp-address "the.firewall.machine")
- (nntp-open-connection-function nntp-open-rlogin)
- (nntp-end-of-line "\n")
- (nntp-rlogin-parameters
- ("telnet" "the.real.nntp.host" "nntp")))
- @end lisp
- If you want to use the wonderful @code{ssh} program to provide a
- compressed connection over the modem line, you could create a virtual
- server that would look something like this:
- @lisp
- (nntp "news"
- (nntp-address "copper.uio.no")
- (nntp-rlogin-program "ssh")
- (nntp-open-connection-function nntp-open-rlogin)
- (nntp-end-of-line "\n")
- (nntp-rlogin-parameters
- ("telnet" "news.uio.no" "nntp")))
- @end lisp
- This means that you have to have set up @code{ssh-agent} correctly to
- provide automatic authorization, of course. And to get a compressed
- connection, you have to have the @samp{Compression} option in the
- @code{ssh} @file{config} file.
- @node Creating a Virtual Server
- @subsection Creating a Virtual Server
- If you're saving lots of articles in the cache by using persistent
- articles, you may want to create a virtual server to read the cache.
- First you need to add a new server. The @kbd{a} command does that. It
- would probably be best to use @code{nnspool} to read the cache. You
- could also use @code{nnml} or @code{nnmh}, though.
- Type @kbd{a nnspool @key{RET} cache @key{RET}}.
- You should now have a brand new @code{nnspool} virtual server called
- @samp{cache}. You now need to edit it to have the right definitions.
- Type @kbd{e} to edit the server. You'll be entered into a buffer that
- will contain the following:
- @lisp
- (nnspool "cache")
- @end lisp
- Change that to:
- @lisp
- (nnspool "cache"
- (nnspool-spool-directory "~/News/cache/")
- (nnspool-nov-directory "~/News/cache/")
- (nnspool-active-file "~/News/cache/active"))
- @end lisp
- Type @kbd{C-c C-c} to return to the server buffer. If you now press
- @key{RET} over this virtual server, you should be entered into a browse
- buffer, and you should be able to enter any of the groups displayed.
- @node Server Variables
- @subsection Server Variables
- One sticky point when defining variables (both on back ends and in Emacs
- in general) is that some variables are typically initialized from other
- variables when the definition of the variables is being loaded. If you
- change the "base" variable after the variables have been loaded, you
- won't change the "derived" variables.
- This typically affects directory and file variables. For instance,
- @code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}
- directory variables are initialized from that variable, so
- @code{nnml-active-file} will be @file{~/Mail/active}. If you define a
- new virtual @code{nnml} server, it will @emph{not} suffice to set just
- @code{nnml-directory}---you have to explicitly set all the file
- variables to be what you want them to be. For a complete list of
- variables for each back end, see each back end's section later in this
- manual, but here's an example @code{nnml} definition:
- @lisp
- (nnml "public"
- (nnml-directory "~/my-mail/")
- (nnml-active-file "~/my-mail/active")
- (nnml-newsgroups-file "~/my-mail/newsgroups"))
- @end lisp
- @node Servers and Methods
- @subsection Servers and Methods
- Wherever you would normally use a select method
- (e.g. @code{gnus-secondary-select-method}, in the group select method,
- when browsing a foreign server) you can use a virtual server name
- instead. This could potentially save lots of typing. And it's nice all
- over.
- @node Unavailable Servers
- @subsection Unavailable Servers
- If a server seems to be unreachable, Gnus will mark that server as
- @code{denied}. That means that any subsequent attempt to make contact
- with that server will just be ignored. ``It can't be opened,'' Gnus
- will tell you, without making the least effort to see whether that is
- actually the case or not.
- That might seem quite naughty, but it does make sense most of the time.
- Let's say you have 10 groups subscribed to on server
- @samp{nephelococcygia.com}. This server is located somewhere quite far
- away from you and the machine is quite slow, so it takes 1 minute just
- to find out that it refuses connection to you today. If Gnus were to
- attempt to do that 10 times, you'd be quite annoyed, so Gnus won't
- attempt to do that. Once it has gotten a single ``connection refused'',
- it will regard that server as ``down''.
- So, what happens if the machine was only feeling unwell temporarily?
- How do you test to see whether the machine has come up again?
- You jump to the server buffer (@pxref{The Server Buffer}) and poke it
- with the following commands:
- @table @kbd
- @item O
- @kindex O (Server)
- @findex gnus-server-open-server
- Try to establish connection to the server on the current line
- (@code{gnus-server-open-server}).
- @item C
- @kindex C (Server)
- @findex gnus-server-close-server
- Close the connection (if any) to the server
- (@code{gnus-server-close-server}).
- @item D
- @kindex D (Server)
- @findex gnus-server-deny-server
- Mark the current server as unreachable
- (@code{gnus-server-deny-server}).
- @item M-o
- @kindex M-o (Server)
- @findex gnus-server-open-all-servers
- Open the connections to all servers in the buffer
- (@code{gnus-server-open-all-servers}).
- @item M-c
- @kindex M-c (Server)
- @findex gnus-server-close-all-servers
- Close the connections to all servers in the buffer
- (@code{gnus-server-close-all-servers}).
- @item R
- @kindex R (Server)
- @findex gnus-server-remove-denials
- Remove all marks to whether Gnus was denied connection from any servers
- (@code{gnus-server-remove-denials}).
- @end table
- @node Getting News
- @section Getting News
- @cindex reading news
- @cindex news back ends
- A newsreader is normally used for reading news. Gnus currently provides
- only two methods of getting news---it can read from an @sc{nntp} server,
- or it can read from a local spool.
- @menu
- * NNTP:: Reading news from an @sc{nntp} server.
- * News Spool:: Reading news from the local spool.
- @end menu
- @node NNTP
- @subsection @sc{nntp}
- @cindex nntp
- Subscribing to a foreign group from an @sc{nntp} server is rather easy.
- You just specify @code{nntp} as method and the address of the @sc{nntp}
- server as the, uhm, address.
- If the @sc{nntp} server is located at a non-standard port, setting the
- third element of the select method to this port number should allow you
- to connect to the right port. You'll have to edit the group info for
- that (@pxref{Foreign Groups}).
- The name of the foreign group can be the same as a native group. In
- fact, you can subscribe to the same group from as many different servers
- you feel like. There will be no name collisions.
- The following variables can be used to create a virtual @code{nntp}
- server:
- @table @code
- @item nntp-server-opened-hook
- @vindex nntp-server-opened-hook
- @cindex @sc{mode reader}
- @cindex authinfo
- @cindex authentification
- @cindex nntp authentification
- @findex nntp-send-authinfo
- @findex nntp-send-mode-reader
- is run after a connection has been made. It can be used to send
- commands to the @sc{nntp} server after it has been contacted. By
- default it sends the command @code{MODE READER} to the server with the
- @code{nntp-send-mode-reader} function. This function should always be
- present in this hook.
- @item nntp-authinfo-function
- @vindex nntp-authinfo-function
- @findex nntp-send-authinfo
- @vindex nntp-authinfo-file
- This function will be used to send @samp{AUTHINFO} to the @sc{nntp}
- server. The default function is @code{nntp-send-authinfo}, which looks
- through your @file{~/.authinfo} (or whatever you've set the
- @code{nntp-authinfo-file} variable to) for applicable entries. If none
- are found, it will prompt you for a login name and a password. The
- format of the @file{~/.authinfo} file is (almost) the same as the
- @code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}
- manual page, but here are the salient facts:
- @enumerate
- @item
- The file contains one or more line, each of which define one server.
- @item
- Each line may contain an arbitrary number of token/value pairs.
- The valid tokens include @samp{machine}, @samp{login}, @samp{password},
- @samp{default}. In addition Gnus introduces two new tokens, not present
- in the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and
- @samp{force}. (This is the only way the @file{.authinfo} file format
- deviates from the @file{.netrc} file format.) @samp{port} is used to
- indicate what port on the server the credentials apply to and
- @samp{force} is explained below.
- @end enumerate
- Here's an example file:
- @example
- machine news.uio.no login larsi password geheimnis
- machine nntp.ifi.uio.no login larsi force yes
- @end example
- The token/value pairs may appear in any order; @samp{machine} doesn't
- have to be first, for instance.
- In this example, both login name and password have been supplied for the
- former server, while the latter has only the login name listed, and the
- user will be prompted for the password. The latter also has the
- @samp{force} tag, which means that the authinfo will be sent to the
- @var{nntp} server upon connection; the default (i.e., when there is not
- @samp{force} tag) is to not send authinfo to the @var{nntp} server
- until the @var{nntp} server asks for it.
- You can also add @samp{default} lines that will apply to all servers
- that don't have matching @samp{machine} lines.
- @example
- default force yes
- @end example
- This will force sending @samp{AUTHINFO} commands to all servers not
- previously mentioned.
- Remember to not leave the @file{~/.authinfo} file world-readable.
- @item nntp-server-action-alist
- @vindex nntp-server-action-alist
- This is a list of regexps to match on server types and actions to be
- taken when matches are made. For instance, if you want Gnus to beep
- every time you connect to innd, you could say something like:
- @lisp
- (setq nntp-server-action-alist
- '(("innd" (ding))))
- @end lisp
- You probably don't want to do that, though.
- The default value is
- @lisp
- '(("nntpd 1\\.5\\.11t"
- (remove-hook 'nntp-server-opened-hook
- 'nntp-send-mode-reader)))
- @end lisp
- This ensures that Gnus doesn't send the @code{MODE READER} command to
- nntpd 1.5.11t, since that command chokes that server, I've been told.
- @item nntp-maximum-request
- @vindex nntp-maximum-request
- If the @sc{nntp} server doesn't support @sc{nov} headers, this back end
- will collect headers by sending a series of @code{head} commands. To
- speed things up, the back end sends lots of these commands without
- waiting for reply, and then reads all the replies. This is controlled
- by the @code{nntp-maximum-request} variable, and is 400 by default. If
- your network is buggy, you should set this to 1.
- @item nntp-connection-timeout
- @vindex nntp-connection-timeout
- If you have lots of foreign @code{nntp} groups that you connect to
- regularly, you're sure to have problems with @sc{nntp} servers not
- responding properly, or being too loaded to reply within reasonable
- time. This is can lead to awkward problems, which can be helped
- somewhat by setting @code{nntp-connection-timeout}. This is an integer
- that says how many seconds the @code{nntp} back end should wait for a
- connection before giving up. If it is @code{nil}, which is the default,
- no timeouts are done.
- @c @item nntp-command-timeout
- @c @vindex nntp-command-timeout
- @c @cindex PPP connections
- @c @cindex dynamic IP addresses
- @c If you're running Gnus on a machine that has a dynamically assigned
- @c address, Gnus may become confused. If the address of your machine
- @c changes after connecting to the @sc{nntp} server, Gnus will simply sit
- @c waiting forever for replies from the server. To help with this
- @c unfortunate problem, you can set this command to a number. Gnus will
- @c then, if it sits waiting for a reply from the server longer than that
- @c number of seconds, shut down the connection, start a new one, and resend
- @c the command. This should hopefully be transparent to the user. A
- @c likely number is 30 seconds.
- @c
- @c @item nntp-retry-on-break
- @c @vindex nntp-retry-on-break
- @c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus
- @c hangs. This will have much the same effect as the command timeout
- @c described above.
- @item nntp-server-hook
- @vindex nntp-server-hook
- This hook is run as the last step when connecting to an @sc{nntp}
- server.
- @findex nntp-open-rlogin
- @findex nntp-open-telnet
- @findex nntp-open-network-stream
- @item nntp-open-connection-function
- @vindex nntp-open-connection-function
- This function is used to connect to the remote system. Four pre-made
- functions are supplied:
- @table @code
- @item nntp-open-network-stream
- This is the default, and simply connects to some port or other on the
- remote system.
- @item nntp-open-rlogin
- Does an @samp{rlogin} on the
- remote system, and then does a @samp{telnet} to the @sc{nntp} server
- available there.
- @code{nntp-open-rlogin}-related variables:
- @table @code
- @item nntp-rlogin-program
- @vindex nntp-rlogin-program
- Program used to log in on remote machines. The default is @samp{rsh},
- but @samp{ssh} is a popular alternative.
- @item nntp-rlogin-parameters
- @vindex nntp-rlogin-parameters
- This list will be used as the parameter list given to @code{rsh}.
- @item nntp-rlogin-user-name
- @vindex nntp-rlogin-user-name
- User name on the remote system.
- @end table
- @item nntp-open-telnet
- Does a @samp{telnet} to the remote system and then another @samp{telnet}
- to get to the @sc{nntp} server.
- @code{nntp-open-telnet}-related variables:
- @table @code
- @item nntp-telnet-command
- @vindex nntp-telnet-command
- Command used to start @code{telnet}.
- @item nntp-telnet-switches
- @vindex nntp-telnet-switches
- List of strings to be used as the switches to the @code{telnet} command.
- @item nntp-telnet-user-name
- @vindex nntp-telnet-user-name
- User name for log in on the remote system.
- @item nntp-telnet-passwd
- @vindex nntp-telnet-passwd
- Password to use when logging in.
- @item nntp-telnet-parameters
- @vindex nntp-telnet-parameters
- A list of strings executed as a command after logging in
- via @code{telnet}.
- @item nntp-telnet-shell-prompt
- @vindex nntp-telnet-shell-prompt
- Regexp matching the shell prompt on the remote machine. The default is
- @samp{bash\\|\$ *\r?$\\|> *\r?}.
- @item nntp-open-telnet-envuser
- @vindex nntp-open-telnet-envuser
- If non-@code{nil}, the @code{telnet} session (client and server both)
- will support the @code{ENVIRON} option and not prompt for login name.
- This works for Solaris @code{telnet}, for instance.
- @end table
- @findex nntp-open-ssl-stream
- @item nntp-open-ssl-stream
- Opens a connection to a server over a @dfn{secure} channel. To use this
- you must have SSLay installed
- (@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL}, and you also need
- @file{ssl.el} (from the W3 distribution, for instance). You then
- define a server as follows:
- @lisp
- ;; Type `C-c C-c' after you've finished editing.
- ;;
- ;; "snews" is port 563 and is predefined
- ;; in our /etc/services
- ;;
- (nntp "snews.bar.com"
- (nntp-open-connection-function
- nntp-open-ssl-stream)
- (nntp-port-number "snews")
- (nntp-address "snews.bar.com"))
- @end lisp
- @end table
- @item nntp-end-of-line
- @vindex nntp-end-of-line
- String to use as end-of-line marker when talking to the @sc{nntp}
- server. This is @samp{\r\n} by default, but should be @samp{\n} when
- using @code{rlogin} to talk to the server.
- @item nntp-rlogin-user-name
- @vindex nntp-rlogin-user-name
- User name on the remote system when using the @code{rlogin} connect
- function.
- @item nntp-address
- @vindex nntp-address
- The address of the remote system running the @sc{nntp} server.
- @item nntp-port-number
- @vindex nntp-port-number
- Port number to connect to when using the @code{nntp-open-network-stream}
- connect function.
- @item nntp-buggy-select
- @vindex nntp-buggy-select
- Set this to non-@code{nil} if your select routine is buggy.
- @item nntp-nov-is-evil
- @vindex nntp-nov-is-evil
- If the @sc{nntp} server does not support @sc{nov}, you could set this
- variable to @code{t}, but @code{nntp} usually checks automatically whether @sc{nov}
- can be used.
- @item nntp-xover-commands
- @vindex nntp-xover-commands
- @cindex nov
- @cindex XOVER
- List of strings used as commands to fetch @sc{nov} lines from a
- server. The default value of this variable is @code{("XOVER"
- "XOVERVIEW")}.
- @item nntp-nov-gap
- @vindex nntp-nov-gap
- @code{nntp} normally sends just one big request for @sc{nov} lines to
- the server. The server responds with one huge list of lines. However,
- if you have read articles 2-5000 in the group, and only want to read
- article 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov}
- lines that you will not need. This variable says how
- big a gap between two consecutive articles is allowed to be before the
- @code{XOVER} request is split into several request. Note that if your
- network is fast, setting this variable to a really small number means
- that fetching will probably be slower. If this variable is @code{nil},
- @code{nntp} will never split requests. The default is 5.
- @item nntp-prepare-server-hook
- @vindex nntp-prepare-server-hook
- A hook run before attempting to connect to an @sc{nntp} server.
- @item nntp-warn-about-losing-connection
- @vindex nntp-warn-about-losing-connection
- If this variable is non-@code{nil}, some noise will be made when a
- server closes connection.
- @item nntp-record-commands
- @vindex nntp-record-commands
- If non-@code{nil}, @code{nntp} will log all commands it sends to the
- @sc{nntp} server (along with a timestamp) in the @samp{*nntp-log*}
- buffer. This is useful if you are debugging a Gnus/@sc{nntp} connection
- that doesn't seem to work.
- @end table
- @node News Spool
- @subsection News Spool
- @cindex nnspool
- @cindex news spool
- Subscribing to a foreign group from the local spool is extremely easy,
- and might be useful, for instance, to speed up reading groups that
- contain very big articles---@samp{alt.binaries.pictures.furniture}, for
- instance.
- Anyway, you just specify @code{nnspool} as the method and @code{""} (or
- anything else) as the address.
- If you have access to a local spool, you should probably use that as the
- native select method (@pxref{Finding the News}). It is normally faster
- than using an @code{nntp} select method, but might not be. It depends.
- You just have to try to find out what's best at your site.
- @table @code
- @item nnspool-inews-program
- @vindex nnspool-inews-program
- Program used to post an article.
- @item nnspool-inews-switches
- @vindex nnspool-inews-switches
- Parameters given to the inews program when posting an article.
- @item nnspool-spool-directory
- @vindex nnspool-spool-directory
- Where @code{nnspool} looks for the articles. This is normally
- @file{/usr/spool/news/}.
- @item nnspool-nov-directory
- @vindex nnspool-nov-directory
- Where @code{nnspool} will look for @sc{nov} files. This is normally
- @file{/usr/spool/news/over.view/}.
- @item nnspool-lib-dir
- @vindex nnspool-lib-dir
- Where the news lib dir is (@file{/usr/lib/news/} by default).
- @item nnspool-active-file
- @vindex nnspool-active-file
- The path to the active file.
- @item nnspool-newsgroups-file
- @vindex nnspool-newsgroups-file
- The path to the group descriptions file.
- @item nnspool-history-file
- @vindex nnspool-history-file
- The path to the news history file.
- @item nnspool-active-times-file
- @vindex nnspool-active-times-file
- The path to the active date file.
- @item nnspool-nov-is-evil
- @vindex nnspool-nov-is-evil
- If non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} files
- that it finds.
- @item nnspool-sift-nov-with-sed
- @vindex nnspool-sift-nov-with-sed
- @cindex sed
- If non-@code{nil}, which is the default, use @code{sed} to get the
- relevant portion from the overview file. If nil, @code{nnspool} will
- load the entire file into a buffer and process it there.
- @end table
- @node Getting Mail
- @section Getting Mail
- @cindex reading mail
- @cindex mail
- Reading mail with a newsreader---isn't that just plain WeIrD? But of
- course.
- @menu
- * Mail in a Newsreader:: Important introductory notes.
- * Getting Started Reading Mail:: A simple cookbook example.
- * Splitting Mail:: How to create mail groups.
- * Mail Sources:: How to tell Gnus where to get mail from.
- * Mail Back End Variables:: Variables for customizing mail handling.
- * Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
- * Group Mail Splitting:: Use group customize to drive mail splitting.
- * Incorporating Old Mail:: What about the old mail you have?
- * Expiring Mail:: Getting rid of unwanted mail.
- * Washing Mail:: Removing gruft from the mail you get.
- * Duplicates:: Dealing with duplicated mail.
- * Not Reading Mail:: Using mail back ends for reading other files.
- * Choosing a Mail Back End:: Gnus can read a variety of mail formats.
- @end menu
- @node Mail in a Newsreader
- @subsection Mail in a Newsreader
- If you are used to traditional mail readers, but have decided to switch
- to reading mail with Gnus, you may find yourself experiencing something
- of a culture shock.
- Gnus does not behave like traditional mail readers. If you want to make
- it behave that way, you can, but it's an uphill battle.
- Gnus, by default, handles all its groups using the same approach. This
- approach is very newsreaderly---you enter a group, see the new/unread
- messages, and when you read the messages, they get marked as read, and
- you don't see them any more. (Unless you explicitly ask for them.)
- In particular, you do not do anything explicitly to delete messages.
- Does this mean that all the messages that have been marked as read are
- deleted? How awful!
- But, no, it means that old messages are @dfn{expired} according to some
- scheme or other. For news messages, the expire process is controlled by
- the news administrator; for mail, the expire process is controlled by
- you. The expire process for mail is covered in depth in @pxref{Expiring
- Mail}.
- What many Gnus users find, after using it a while for both news and
- mail, is that the transport mechanism has very little to do with how
- they want to treat a message.
- Many people subscribe to several mailing lists. These are transported
- via SMTP, and are therefore mail. But we might go for weeks without
- answering, or even reading these messages very carefully. We may not
- need to save them because if we should need to read one again, they are
- archived somewhere else.
- Some people have local news groups which have only a handful of readers.
- These are transported via @sc{nntp}, and are therefore news. But we may need
- to read and answer a large fraction of the messages very carefully in
- order to do our work. And there may not be an archive, so we may need
- to save the interesting messages the same way we would personal mail.
- The important distinction turns out to be not the transport mechanism,
- but other factors such as how interested we are in the subject matter,
- or how easy it is to retrieve the message if we need to read it again.
- Gnus provides many options for sorting mail into ``groups'' which behave
- like newsgroups, and for treating each group (whether mail or news)
- differently.
- Some users never get comfortable using the Gnus (ahem) paradigm and wish
- that Gnus should grow up and be a male, er, mail reader. It is possible
- to whip Gnus into a more mailreaderly being, but, as said before, it's
- not easy. People who prefer proper mail readers should try @sc{vm}
- instead, which is an excellent, and proper, mail reader.
- I don't mean to scare anybody off, but I want to make it clear that you
- may be required to learn a new way of thinking about messages. After
- you've been subjected to The Gnus Way, you will come to love it. I can
- guarantee it. (At least the guy who sold me the Emacs Subliminal
- Brain-Washing Functions that I've put into Gnus did guarantee it. You
- Will Be Assimilated. You Love Gnus. You Love The Gnus Mail Way.
- You Do.)
- @node Getting Started Reading Mail
- @subsection Getting Started Reading Mail
- It's quite easy to use Gnus to read your new mail. You just plonk the
- mail back end of your choice into @code{gnus-secondary-select-methods},
- and things will happen automatically.
- For instance, if you want to use @code{nnml} (which is a "one file per
- mail" back end), you could put the following in your @file{.gnus} file:
- @lisp
- (setq gnus-secondary-select-methods
- '((nnml "private")))
- @end lisp
- Now, the next time you start Gnus, this back end will be queried for new
- articles, and it will move all the messages in your spool file to its
- directory, which is @code{~/Mail/} by default. The new group that will
- be created (@samp{mail.misc}) will be subscribed, and you can read it
- like any other group.
- You will probably want to split the mail into several groups, though:
- @lisp
- (setq nnmail-split-methods
- '(("junk" "^From:.*Lars Ingebrigtsen")
- ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
- ("other" "")))
- @end lisp
- This will result in three new @code{nnml} mail groups being created:
- @samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}. All the
- mail that doesn't fit into the first two groups will be placed in the
- last group.
- This should be sufficient for reading mail with Gnus. You might want to
- give the other sections in this part of the manual a perusal, though.
- Especially @pxref{Choosing a Mail Back End} and @pxref{Expiring Mail}.
- @node Splitting Mail
- @subsection Splitting Mail
- @cindex splitting mail
- @cindex mail splitting
- @vindex nnmail-split-methods
- The @code{nnmail-split-methods} variable says how the incoming mail is
- to be split into groups.
- @lisp
- (setq nnmail-split-methods
- '(("mail.junk" "^From:.*Lars Ingebrigtsen")
- ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
- ("mail.other" "")))
- @end lisp
- This variable is a list of lists, where the first element of each of
- these lists is the name of the mail group (they do not have to be called
- something beginning with @samp{mail}, by the way), and the second
- element is a regular expression used on the header of each mail to
- determine if it belongs in this mail group. The first string may
- contain @samp{\\1} forms, like the ones used by @code{replace-match} to
- insert sub-expressions from the matched text. For instance:
- @lisp
- ("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
- @end lisp
- The second element can also be a function. In that case, it will be
- called narrowed to the headers with the first element of the rule as the
- argument. It should return a non-@code{nil} value if it thinks that the
- mail belongs in that group.
- The last of these groups should always be a general one, and the regular
- expression should @emph{always} be @samp{} so that it matches any mails
- that haven't been matched by any of the other regexps. (These rules are
- processed from the beginning of the alist toward the end. The first
- rule to make a match will "win", unless you have crossposting enabled.
- In that case, all matching rules will "win".)
- If you like to tinker with this yourself, you can set this variable to a
- function of your choice. This function will be called without any
- arguments in a buffer narrowed to the headers of an incoming mail
- message. The function should return a list of group names that it
- thinks should carry this mail message.
- Note that the mail back ends are free to maul the poor, innocent,
- incoming headers all they want to. They all add @code{Lines} headers;
- some add @code{X-Gnus-Group} headers; most rename the Unix mbox
- @samp{From } line to something else.
- @vindex nnmail-crosspost
- The mail back ends all support cross-posting. If several regexps match,
- the mail will be ``cross-posted'' to all those groups.
- @code{nnmail-crosspost} says whether to use this mechanism or not. Note
- that no articles are crossposted to the general (@samp{}) group.
- @vindex nnmail-crosspost-link-function
- @cindex crosspost
- @cindex links
- @code{nnmh} and @code{nnml} makes crossposts by creating hard links to
- the crossposted articles. However, not all file systems support hard
- links. If that's the case for you, set
- @code{nnmail-crosspost-link-function} to @code{copy-file}. (This
- variable is @code{add-name-to-file} by default.)
- @kindex M-x nnmail-split-history
- @kindex nnmail-split-history
- If you wish to see where the previous mail split put the messages, you
- can use the @kbd{M-x nnmail-split-history} command. If you wish to see
- where re-spooling messages would put the messages, you can use
- @code{gnus-summary-respool-trace} and related commands (@pxref{Mail
- Group Commands}).
- Gnus gives you all the opportunity you could possibly want for shooting
- yourself in the foot. Let's say you create a group that will contain
- all the mail you get from your boss. And then you accidentally
- unsubscribe from the group. Gnus will still put all the mail from your
- boss in the unsubscribed group, and so, when your boss mails you ``Have
- that report ready by Monday or you're fired!'', you'll never see it and,
- come Tuesday, you'll still believe that you're gainfully employed while
- you really should be out collecting empty bottles to save up for next
- month's rent money.
- @node Mail Sources
- @subsection Mail Sources
- Mail can be gotten from many different sources---the mail spool, from a
- POP mail server, from a procmail directory, or from a maildir, for
- instance.
- @menu
- * Mail Source Specifiers:: How to specify what a mail source is.
- * Mail Source Customization:: Some variables that influence things.
- * Fetching Mail:: Using the mail source specifiers.
- @end menu
- @node Mail Source Specifiers
- @subsubsection Mail Source Specifiers
- @cindex POP
- @cindex mail server
- @cindex procmail
- @cindex mail spool
- @cindex mail source
- You tell Gnus how to fetch mail by setting @code{mail-sources}
- (@pxref{Fetching Mail}) to a @dfn{mail source specifier}.
- Here's an example:
- @lisp
- (pop :server "pop3.mailserver.com" :user "myname")
- @end lisp
- As can be observed, a mail source specifier is a list where the first
- element is a @dfn{mail source type}, followed by an arbitrary number of
- @dfn{keywords}. Keywords that are not explicitly specified are given
- default values.
- The following mail source types are available:
- @table @code
- @item file
- Get mail from a single file; typically from the mail spool.
- Keywords:
- @table @code
- @item :path
- The path of the file. Defaults to the value of the @code{MAIL}
- environment variable or @file{/usr/mail/spool/user-name}.
- @end table
- An example file mail source:
- @lisp
- (file :path "/usr/spool/mail/user-name")
- @end lisp
- Or using the default path:
- @lisp
- (file)
- @end lisp
- If the mail spool file is not located on the local machine, it's best to
- use POP or @sc{imap} or the like to fetch the mail. You can not use ange-ftp
- file names here---it has no way to lock the mail spool while moving the
- mail.
- If it's impossible to set up a proper server, you can use ssh instead.
- @lisp
- (setq mail-sources
- '((file :prescript "ssh host bin/getmail >%t")))
- @end lisp
- The @samp{getmail} script would look something like the following:
- @example
- #!/bin/sh
- # getmail - move mail from spool to stdout
- # flu@@iki.fi
- MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail
- TMP=$HOME/Mail/tmp
- rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP
- @end example
- Alter this script to fit find the @samp{movemail} you want to use.
- @item directory
- Get mail from several files in a directory. This is typically used when
- you have procmail split the incoming mail into several files. Setting
- @code{nnmail-scan-directory-mail-source-once} to non-nil force Gnus to
- scan the mail source only once.
- Keywords:
- @table @code
- @item :path
- The path of the directory where the files are. There is no default
- value.
- @item :suffix
- Only files ending with this suffix are used. The default is
- @samp{.spool}.
- @item :predicate
- Only files that have this predicate return non-@code{nil} are returned.
- The default is @code{identity}. This is used as an additional
- filter---only files that have the right suffix @emph{and} satisfy this
- predicate are considered.
- @item :prescript
- @itemx :postscript
- Script run before/after fetching mail.
- @end table
- An example directory mail source:
- @lisp
- (directory :path "/home/user-name/procmail-dir/"
- :suffix ".prcml")
- @end lisp
- @item pop
- Get mail from a POP server.
- Keywords:
- @table @code
- @item :server
- The name of the POP server. The default is taken from the
- @code{MAILHOST} environment variable.
- @item :port
- The port number of the POP server. This can be a number (e.g.@:
- @samp{:port 110}) or a string (e.g.@: @samp{:port "pop3"}). If it is a
- string, it should be a service name as listed in @file{/etc/services} on
- Unix systems. The default is @samp{"pop3"}. On some systems you might
- need to specify it as @samp{"pop-3"} instead.
- @item :user
- The user name to give to the POP server. The default is the login
- name.
- @item :password
- The password to give to the POP server. If not specified, the user is
- prompted.
- @item :program
- The program to use to fetch mail from the POP server. This should be
- a @code{format}-like string. Here's an example:
- @example
- fetchmail %u@@%s -P %p %t
- @end example
- The valid format specifier characters are:
- @table @samp
- @item t
- The name of the file the mail is to be moved to. This must always be
- included in this string.
- @item s
- The name of the server.
- @item P
- The port number of the server.
- @item u
- The user name to use.
- @item p
- The password to use.
- @end table
- The values used for these specs are taken from the values you give the
- corresponding keywords.
- @item :prescript
- A script to be run before fetching the mail. The syntax is the same as
- the @code{:program} keyword. This can also be a function to be run.
- @item :postscript
- A script to be run after fetching the mail. The syntax is the same as
- the @code{:program} keyword. This can also be a function to be run.
- @item :function
- The function to use to fetch mail from the POP server. The function is
- called with one parameter---the name of the file where the mail should
- be moved to.
- @item :authentication
- This can be either the symbol @code{password} or the symbol @code{apop}
- and says what authentication scheme to use. The default is
- @code{password}.
- @end table
- If the @code{:program} and @code{:function} keywords aren't specified,
- @code{pop3-movemail} will be used.
- Here are some examples. Fetch from the default POP server, using the
- default user name, and default fetcher:
- @lisp
- (pop)
- @end lisp
- Fetch from a named server with a named user and password:
- @lisp
- (pop :server "my.pop.server"
- :user "user-name" :password "secret")
- @end lisp
- Use @samp{movemail} to move the mail:
- @lisp
- (pop :program "movemail po:%u %t %p")
- @end lisp
- @item maildir
- Get mail from a maildir. This is a type of mailbox that is supported by
- at least qmail and postfix, where each file in a special directory
- contains exactly one mail.
- Keywords:
- @table @code
- @item :path
- The path of the directory where the mails are stored. The default is
- taken from the @code{MAILDIR} environment variable or
- @samp{~/Maildir/}.
- @item :subdirs
- The subdirectories of the Maildir. The default is
- @samp{("new" "cur")}.
- @c If you sometimes look at your mail through a pop3 daemon before fetching
- @c them with Gnus, you may also have to fetch your mails from the
- @c @code{cur} directory inside the maildir, like in the first example
- @c below.
- You can also get mails from remote hosts (because maildirs don't suffer
- from locking problems).
- @end table
- Two example maildir mail sources:
- @lisp
- (maildir :path "/home/user-name/Maildir/"
- :subdirs ("cur" "new"))
- @end lisp
- @lisp
- (maildir :path "/user@@remotehost.org:~/Maildir/"
- :subdirs ("new"))
- @end lisp
- @item imap
- Get mail from a @sc{imap} server. If you don't want to use @sc{imap}
- as intended, as a network mail reading protocol (ie with nnimap), for
- some reason or other, Gnus let you treat it similar to a POP server
- and fetches articles from a given @sc{imap} mailbox. @xref{IMAP}, for
- more information.
- Keywords:
- @table @code
- @item :server
- The name of the @sc{imap} server. The default is taken from the
- @code{MAILHOST} environment variable.
- @item :port
- The port number of the @sc{imap} server. The default is @samp{143}, or
- @samp{993} for SSL connections.
- @item :user
- The user name to give to the @sc{imap} server. The default is the login
- name.
- @item :password
- The password to give to the @sc{imap} server. If not specified, the user is
- prompted.
- @item :stream
- What stream to use for connecting to the server, this is one of the
- symbols in @code{imap-stream-alist}. Right now, this means
- @samp{kerberos4}, @samp{ssl} or the default @samp{network}.
- @item :authentication
- Which authenticator to use for authenticating to the server, this is one
- of the symbols in @code{imap-authenticator-alist}. Right now, this
- means @samp{kerberos4}, @samp{cram-md5}, @samp{anonymous} or the default
- @samp{login}.
- @item :program
- When using the `shell' :stream, the contents of this variable is
- mapped into the `imap-shell-program' variable. This should be a
- @code{format}-like string (or list of strings). Here's an example:
- @example
- ssh %s imapd
- @end example
- The valid format specifier characters are:
- @table @samp
- @item s
- The name of the server.
- @item l
- User name from `imap-default-user'.
- @item p
- The port number of the server.
- @end table
- The values used for these specs are taken from the values you give the
- corresponding keywords.
- @item :mailbox
- The name of the mailbox to get mail from. The default is @samp{INBOX}
- which normally is the mailbox which receive incoming mail.
- @item :predicate
- The predicate used to find articles to fetch. The default, @samp{UNSEEN
- UNDELETED}, is probably the best choice for most people, but if you
- sometimes peek in your mailbox with a @sc{imap} client and mark some
- articles as read (or; SEEN) you might want to set this to @samp{nil}.
- Then all articles in the mailbox is fetched, no matter what. For a
- complete list of predicates, see RFC 2060 §6.4.4.
- @item :fetchflag
- How to flag fetched articles on the server, the default @samp{\Deleted}
- will mark them as deleted, an alternative would be @samp{\Seen} which
- would simply mark them as read. These are the two most likely choices,
- but more flags are defined in RFC 2060 §2.3.2.
- @item :dontexpunge
- If non-nil, don't remove all articles marked as deleted in the mailbox
- after finishing the fetch.
- @end table
- An example @sc{imap} mail source:
- @lisp
- (imap :server "mail.mycorp.com"
- :stream kerberos4
- :fetchflag "\\Seen")
- @end lisp
- @item webmail
- Get mail from a webmail server, such as www.hotmail.com,
- webmail.netscape.com, www.netaddress.com, www.my-deja.com.
- NOTE: Now mail.yahoo.com provides POP3 service, so @sc{pop} mail source
- is suggested.
- NOTE: Webmail largely depends cookies. A "one-line-cookie" patch is
- required for url "4.0pre.46".
- WARNING: Mails may lost. NO WARRANTY.
- Keywords:
- @table @code
- @item :subtype
- The type of the webmail server. The default is @code{hotmail}. The
- alternatives are @code{netscape}, @code{netaddress}, @code{my-deja}.
- @item :user
- The user name to give to the webmail server. The default is the login
- name.
- @item :password
- The password to give to the webmail server. If not specified, the user is
- prompted.
- @item :dontexpunge
- If non-nil, only fetch unread articles and don't move them to trash
- folder after finishing the fetch.
- @end table
- An example webmail source:
- @lisp
- (webmail :subtype 'hotmail
- :user "user-name"
- :password "secret")
- @end lisp
- @end table
- @table @dfn
- @item Common Keywords
- Common keywords can be used in any type of mail source.
- Keywords:
- @table @code
- @item :plugged
- If non-nil, fetch the mail even when Gnus is unplugged. If you use
- directory source to get mail, you can specify it as in this example:
- @lisp
- (setq mail-sources
- '((directory :path "/home/pavel/.Spool/"
- :suffix ""
- :plugged t)))
- @end lisp
- Gnus will then fetch your mail even when you are unplugged. This is
- useful when you use local mail and news.
- @end table
- @end table
- @subsubsection Function Interface
- Some of the above keywords specify a Lisp function to be executed.
- For each keyword @code{:foo}, the Lisp variable @code{foo} is bound to
- the value of the keyword while the function is executing. For example,
- consider the following mail-source setting:
- @lisp
- (setq mail-sources '((pop :user "jrl"
- :server "pophost" :function fetchfunc)))
- @end lisp
- While the function @code{fetchfunc} is executing, the symbol @code{user}
- is bound to @code{"jrl"}, and the symbol @code{server} is bound to
- @code{"pophost"}. The symbols @code{port}, @code{password},
- @code{program}, @code{prescript}, @code{postscript}, @code{function},
- and @code{authentication} are also bound (to their default values).
- See above for a list of keywords for each type of mail source.
- @node Mail Source Customization
- @subsubsection Mail Source Customization
- The following is a list of variables that influence how the mail is
- fetched. You would normally not need to set or change any of these
- variables.
- @table @code
- @item mail-source-crash-box
- @vindex mail-source-crash-box
- File where mail will be stored while processing it. The default is
- @file{~/.emacs-mail-crash-box}.
- @item mail-source-delete-incoming
- @vindex mail-source-delete-incoming
- If non-@code{nil}, delete incoming files after handling them.
- @item mail-source-directory
- @vindex mail-source-directory
- Directory where files (if any) will be stored. The default is
- @file{~/Mail/}. At present, the only thing this is used for is to say
- where the incoming files will be stored if the previous variable is
- @code{nil}.
- @item mail-source-incoming-file-prefix
- @vindex mail-source-incoming-file-prefix
- Prefix for file name for storing incoming mail. The default is
- @file{Incoming}, in which case files will end up with names like
- @file{Incoming30630D_} or @file{Incoming298602ZD}. This is really only
- relevant if @code{mail-source-delete-incoming} is @code{nil}.
- @item mail-source-default-file-modes
- @vindex mail-source-default-file-modes
- All new mail files will get this file mode. The default is 384.
- @end table
- @node Fetching Mail
- @subsubsection Fetching Mail
- @vindex mail-sources
- @vindex nnmail-spool-file
- The way to actually tell Gnus where to get new mail from is to set
- @code{mail-sources} to a list of mail source specifiers
- (@pxref{Mail Source Specifiers}).
- If this variable (and the obsolescent @code{nnmail-spool-file}) is
- @code{nil}, the mail back ends will never attempt to fetch mail by
- themselves.
- If you want to fetch mail both from your local spool as well as a POP
- mail server, you'd say something like:
- @lisp
- (setq mail-sources
- '((file)
- (pop :server "pop3.mail.server"
- :password "secret")))
- @end lisp
- Or, if you don't want to use any of the keyword defaults:
- @lisp
- (setq mail-sources
- '((file :path "/var/spool/mail/user-name")
- (pop :server "pop3.mail.server"
- :user "user-name"
- :port "pop3"
- :password "secret")))
- @end lisp
- When you use a mail back end, Gnus will slurp all your mail from your
- inbox and plonk it down in your home directory. Gnus doesn't move any
- mail if you're not using a mail back end---you have to do a lot of magic
- invocations first. At the time when you have finished drawing the
- pentagram, lightened the candles, and sacrificed the goat, you really
- shouldn't be too surprised when Gnus moves your mail.
- @node Mail Back End Variables
- @subsection Mail Back End Variables
- These variables are (for the most part) pertinent to all the various
- mail back ends.
- @table @code
- @vindex nnmail-read-incoming-hook
- @item nnmail-read-incoming-hook
- The mail back ends all call this hook after reading new mail. You can
- use this hook to notify any mail watch programs, if you want to.
- @vindex nnmail-split-hook
- @item nnmail-split-hook
- @findex article-decode-encoded-words
- @findex RFC 1522 decoding
- @findex RFC 2047 decoding
- Hook run in the buffer where the mail headers of each message is kept
- just before the splitting based on these headers is done. The hook is
- free to modify the buffer contents in any way it sees fit---the buffer
- is discarded after the splitting has been done, and no changes performed
- in the buffer will show up in any files.
- @code{gnus-article-decode-encoded-words} is one likely function to add
- to this hook.
- @vindex nnmail-pre-get-new-mail-hook
- @vindex nnmail-post-get-new-mail-hook
- @item nnmail-pre-get-new-mail-hook
- @itemx nnmail-post-get-new-mail-hook
- These are two useful hooks executed when treating new incoming
- mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
- starting to handle the new mail) and
- @code{nnmail-post-get-new-mail-hook} (is called when the mail handling
- is done). Here's and example of using these two hooks to change the
- default file modes the new mail files get:
- @lisp
- (add-hook 'gnus-pre-get-new-mail-hook
- (lambda () (set-default-file-modes 511)))
- (add-hook 'gnus-post-get-new-mail-hook
- (lambda () (set-default-file-modes 551)))
- @end lisp
- @item nnmail-use-long-file-names
- @vindex nnmail-use-long-file-names
- If non-@code{nil}, the mail back ends will use long file and directory
- names. Groups like @samp{mail.misc} will end up in directories
- (assuming use of @code{nnml} back end) or files (assuming use of
- @code{nnfolder} back end) like @file{mail.misc}. If it is @code{nil},
- the same group will end up in @file{mail/misc}.
- @item nnmail-delete-file-function
- @vindex nnmail-delete-file-function
- @findex delete-file
- Function called to delete files. It is @code{delete-file} by default.
- @item nnmail-cache-accepted-message-ids
- @vindex nnmail-cache-accepted-message-ids
- If non-@code{nil}, put the @code{Message-ID}s of articles imported into
- the back end (via @code{Gcc}, for instance) into the mail duplication
- discovery cache. The default is @code{nil}.
- @end table
- @node Fancy Mail Splitting
- @subsection Fancy Mail Splitting
- @cindex mail splitting
- @cindex fancy mail splitting
- @vindex nnmail-split-fancy
- @findex nnmail-split-fancy
- If the rather simple, standard method for specifying how to split mail
- doesn't allow you to do what you want, you can set
- @code{nnmail-split-methods} to @code{nnmail-split-fancy}. Then you can
- play with the @code{nnmail-split-fancy} variable.
- Let's look at an example value of this variable first:
- @lisp
- ;; Messages from the mailer daemon are not crossposted to any of
- ;; the ordinary groups. Warnings are put in a separate group
- ;; from real errors.
- (| ("from" mail (| ("subject" "warn.*" "mail.warning")
- "mail.misc"))
- ;; Non-error messages are crossposted to all relevant
- ;; groups, but we don't crosspost between the group for the
- ;; (ding) list and the group for other (ding) related mail.
- (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
- ("subject" "ding" "ding.misc"))
- ;; Other mailing lists...
- (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
- (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
- ;; Both lists below have the same suffix, so prevent
- ;; cross-posting to mkpkg.list of messages posted only to
- ;; the bugs- list, but allow cross-posting when the
- ;; message was really cross-posted.
- (any "bugs-mypackage@@somewhere" "mypkg.bugs")
- (any "mypackage@@somewhere\" - "bugs-mypackage" "mypkg.list")
- ;; People...
- (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen"))
- ;; Unmatched mail goes to the catch all group.
- "misc.misc")
- @end lisp
- This variable has the format of a @dfn{split}. A split is a (possibly)
- recursive structure where each split may contain other splits. Here are
- the five possible split syntaxes:
- @enumerate
- @item
- @samp{group}: If the split is a string, that will be taken as a group
- name. Normal regexp match expansion will be done. See below for
- examples.
- @item
- @code{(@var{field} @var{value} @code{[-} @var{restrict}
- @code{[@dots{}]}@code{]} @var{split})}: If the split is a list, the
- first element of which is a string, then store the message as
- specified by @var{split}, if header @var{field} (a regexp) contains
- @var{value} (also a regexp). If @var{restrict} (yet another regexp)
- matches some string after @var{field} and before the end of the
- matched @var{value}, the @var{split} is ignored. If none of the
- @var{restrict} clauses match, @var{split} is processed.
- @item
- @code{(| @var{split}@dots{})}: If the split is a list, and the first
- element is @code{|} (vertical bar), then process each @var{split} until
- one of them matches. A @var{split} is said to match if it will cause
- the mail message to be stored in one or more groups.
- @item
- @code{(& @var{split}@dots{})}: If the split is a list, and the first
- element is @code{&}, then process all @var{split}s in the list.
- @item
- @code{junk}: If the split is the symbol @code{junk}, then don't save
- this message. Use with extreme caution.
- @item
- @code{(: @var{function} @var{arg1} @var{arg2} @dots{})}: If the split is
- a list, and the first element is @code{:}, then the second element will
- be called as a function with @var{args} given as arguments. The
- function should return a @var{split}.
- For instance, the following function could be used to split based on the
- body of the messages:
- @lisp
- (defun split-on-body ()
- (save-excursion
- (set-buffer " *nnmail incoming*")
- (goto-char (point-min))
- (when (re-search-forward "Some.*string" nil t)
- "string.group")))
- @end lisp
- @item
- @code{(! @var{func} @var{split})}: If the split is a list, and the first
- element is @code{!}, then SPLIT will be processed, and FUNC will be
- called as a function with the result of SPLIT as argument. FUNC should
- return a split.
- @item
- @code{nil}: If the split is @code{nil}, it is ignored.
- @end enumerate
- In these splits, @var{field} must match a complete field name.
- @var{value} must match a complete word according to the fundamental mode
- syntax table. You can use @code{.*} in the regexps to match partial
- field names or words. In other words, all @var{value}'s are wrapped in
- @samp{\<} and @samp{\>} pairs.
- @vindex nnmail-split-abbrev-alist
- @var{field} and @var{value} can also be lisp symbols, in that case they
- are expanded as specified by the variable
- @code{nnmail-split-abbrev-alist}. This is an alist of cons cells, where
- the @code{car} of a cell contains the key, and the @code{cdr} contains the associated
- value.
- @vindex nnmail-split-fancy-syntax-table
- @code{nnmail-split-fancy-syntax-table} is the syntax table in effect
- when all this splitting is performed.
- If you want to have Gnus create groups dynamically based on some
- information in the headers (i.e., do @code{replace-match}-like
- substitutions in the group names), you can say things like:
- @example
- (any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1")
- @end example
- In this example, messages sent to @samp{debian-foo@@lists.debian.org}
- will be filed in @samp{mail.debian.foo}.
- If the string contains the element @samp{\&}, then the previously
- matched string will be substituted. Similarly, the elements @samp{\\1}
- up to @samp{\\9} will be substituted with the text matched by the
- groupings 1 through 9.
- @findex nnmail-split-fancy-with-parent
- @code{nnmail-split-fancy-with-parent} is a function which allows you to
- split followups into the same groups their parents are in. Sometimes
- you can't make splitting rules for all your mail. For example, your
- boss might send you personal mail regarding different projects you are
- working on, and as you can't tell your boss to put a distinguishing
- string into the subject line, you have to resort to manually moving the
- messages into the right group. With this function, you only have to do
- it once per thread.
- To use this feature, you have to set @code{nnmail-treat-duplicates} to a
- non-nil value. And then you can include
- @code{nnmail-split-fancy-with-parent} using the colon feature, like so:
- @lisp
- (setq nnmail-split-fancy
- '(| (: nnmail-split-fancy-with-parent)
- ;; other splits go here
- ))
- @end lisp
- This feature works as follows: when @code{nnmail-treat-duplicates} is
- non-nil, Gnus records the message id of every message it sees in the
- file specified by the variable @code{nnmail-message-id-cache-file},
- together with the group it is in (the group is omitted for non-mail
- messages). When mail splitting is invoked, the function
- @code{nnmail-split-fancy-with-parent} then looks at the References (and
- In-Reply-To) header of each message to split and searches the file
- specified by @code{nnmail-message-id-cache-file} for the message ids.
- When it has found a parent, it returns the corresponding group name. It
- is recommended that you set @code{nnmail-message-id-cache-length} to a
- somewhat higher number than the default so that the message ids are
- still in the cache. (A value of 5000 appears to create a file some 300
- kBytes in size.)
- @vindex nnmail-cache-accepted-message-ids
- When @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnus
- also records the message ids of moved articles, so that the followup
- messages goes into the new group.
- @node Group Mail Splitting
- @subsection Group Mail Splitting
- @cindex mail splitting
- @cindex group mail splitting
- @findex gnus-group-split
- If you subscribe to dozens of mailing lists but you don't want to
- maintain mail splitting rules manually, group mail splitting is for you.
- You just have to set @var{to-list} and/or @var{to-address} in group
- parameters or group customization and set @code{nnmail-split-methods} to
- @code{gnus-group-split}. This splitting function will scan all groups
- for those parameters and split mail accordingly, i.e., messages posted
- from or to the addresses specified in the parameters @var{to-list} or
- @var{to-address} of a mail group will be stored in that group.
- Sometimes, mailing lists have multiple addresses, and you may want mail
- splitting to recognize them all: just set the @var{extra-aliases} group
- parameter to the list of additional addresses and it's done. If you'd
- rather use a regular expression, set @var{split-regexp}.
- All these parameters in a group will be used to create an
- @code{nnmail-split-fancy} split, in which the @var{field} is @samp{any},
- the @var{value} is a single regular expression that matches
- @var{to-list}, @var{to-address}, all of @var{extra-aliases} and all
- matches of @var{split-regexp}, and the @var{split} is the name of the
- group. @var{restrict}s are also supported: just set the
- @var{split-exclude} parameter to a list of regular expressions.
- If you can't get the right split to be generated using all these
- parameters, or you just need something fancier, you can set the
- parameter @var{split-spec} to an @code{nnmail-split-fancy} split. In
- this case, all other aforementioned parameters will be ignored by
- @code{gnus-group-split}. In particular, @var{split-spec} may be set to
- @code{nil}, in which case the group will be ignored by
- @code{gnus-group-split}.
- @vindex gnus-group-split-default-catch-all-group
- @code{gnus-group-split} will do cross-posting on all groups that match,
- by defining a single @code{&} fancy split containing one split for each
- group. If a message doesn't match any split, it will be stored in the
- group named in @code{gnus-group-split-default-catch-all-group}, unless
- some group has @var{split-spec} set to @code{catch-all}, in which case
- that group is used as the catch-all group. Even though this variable is
- often used just to name a group, it may also be set to an arbitrarily
- complex fancy split (after all, a group name is a fancy split), and this
- may be useful to split mail that doesn't go to any mailing list to
- personal mail folders. Note that this fancy split is added as the last
- element of a @code{|} split list that also contains a @code{&} split
- with the rules extracted from group parameters.
- It's time for an example. Assume the following group parameters have
- been defined:
- @example
- nnml:mail.bar:
- ((to-address . "bar@@femail.com")
- (split-regexp . ".*@@femail\\.com"))
- nnml:mail.foo:
- ((to-list . "foo@@nowhere.gov")
- (extra-aliases "foo@@localhost" "foo-redist@@home")
- (split-exclude "bugs-foo" "rambling-foo")
- (admin-address . "foo-request@@nowhere.gov"))
- nnml:mail.others:
- ((split-spec . catch-all))
- @end example
- Setting @code{nnmail-split-methods} to @code{gnus-group-split} will
- behave as if @code{nnmail-split-fancy} had been selected and variable
- @code{nnmail-split-fancy} had been set as follows:
- @lisp
- (| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar")
- (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)"
- - "bugs-foo" - "rambling-foo" "mail.foo"))
- "mail.others")
- @end lisp
- @findex gnus-group-split-fancy
- If you'd rather not use group splitting for all your mail groups, you
- may use it for only some of them, by using @code{nnmail-split-fancy}
- splits like this:
- @lisp
- (: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL)
- @end lisp
- @var{groups} may be a regular expression or a list of group names whose
- parameters will be scanned to generate the output split.
- @var{no-crosspost} can be used to disable cross-posting; in this case, a
- single @code{|} split will be output. @var{catch-all} is the fallback
- fancy split, used like @var{gnus-group-split-default-catch-all-group}.
- If @var{catch-all} is @code{nil}, or if @var{split-regexp} matches the
- empty string in any selected group, no catch-all split will be issued.
- Otherwise, if some group has @var{split-spec} set to @code{catch-all},
- this group will override the value of the @var{catch-all} argument.
- @findex gnus-group-split-setup
- Unfortunately, scanning all groups and their parameters can be quite
- slow, especially considering that it has to be done for every message.
- But don't despair! The function @code{gnus-group-split-setup} can be
- used to enable @code{gnus-group-split} in a much more efficient way. It
- sets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets
- @code{nnmail-split-fancy} to the split produced by
- @code{gnus-group-split-fancy}. Thus, the group parameters are only
- scanned once, no matter how many messages are split.
- @findex gnus-group-split-update
- However, if you change group parameters, you have to update
- @code{nnmail-split-fancy} manually. You can do it by running
- @code{gnus-group-split-update}. If you'd rather have it updated
- automatically, just tell @code{gnus-group-split-setup} to do it for
- you. For example, add to your @file{.gnus}:
- @lisp
- (gnus-group-split-setup AUTO-UPDATE CATCH-ALL)
- @end lisp
- If @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update}
- will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't ever
- have to worry about updating @code{nnmail-split-fancy} again. If you
- don't omit @var{catch-all} (it's optional, equivalent to @code{nil}),
- @code{gnus-group-split-default-catch-all-group} will be set to its
- value.
- @vindex gnus-group-split-updated-hook
- Because you may want to change @code{nnmail-split-fancy} after it is set
- by @code{gnus-group-split-update}, this function will run
- @code{gnus-group-split-updated-hook} just before finishing.
- @node Incorporating Old Mail
- @subsection Incorporating Old Mail
- Most people have lots of old mail stored in various file formats. If
- you have set up Gnus to read mail using one of the spiffy Gnus mail
- back ends, you'll probably wish to have that old mail incorporated into
- your mail groups.
- Doing so can be quite easy.
- To take an example: You're reading mail using @code{nnml}
- (@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
- satisfactory value (@pxref{Splitting Mail}). You have an old Unix mbox
- file filled with important, but old, mail. You want to move it into
- your @code{nnml} groups.
- Here's how:
- @enumerate
- @item
- Go to the group buffer.
- @item
- Type @kbd{G f} and give the path to the mbox file when prompted to create an
- @code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
- @item
- Type @key{SPC} to enter the newly created group.
- @item
- Type @kbd{M P b} to process-mark all articles in this group's buffer
- (@pxref{Setting Process Marks}).
- @item
- Type @kbd{B r} to respool all the process-marked articles, and answer
- @samp{nnml} when prompted (@pxref{Mail Group Commands}).
- @end enumerate
- All the mail messages in the mbox file will now also be spread out over
- all your @code{nnml} groups. Try entering them and check whether things
- have gone without a glitch. If things look ok, you may consider
- deleting the mbox file, but I wouldn't do that unless I was absolutely
- sure that all the mail has ended up where it should be.
- Respooling is also a handy thing to do if you're switching from one mail
- back end to another. Just respool all the mail in the old mail groups
- using the new mail back end.
- @node Expiring Mail
- @subsection Expiring Mail
- @cindex article expiry
- Traditional mail readers have a tendency to remove mail articles when
- you mark them as read, in some way. Gnus takes a fundamentally
- different approach to mail reading.
- Gnus basically considers mail just to be news that has been received in
- a rather peculiar manner. It does not think that it has the power to
- actually change the mail, or delete any mail messages. If you enter a
- mail group, and mark articles as ``read'', or kill them in some other
- fashion, the mail articles will still exist on the system. I repeat:
- Gnus will not delete your old, read mail. Unless you ask it to, of
- course.
- To make Gnus get rid of your unwanted mail, you have to mark the
- articles as @dfn{expirable}. This does not mean that the articles will
- disappear right away, however. In general, a mail article will be
- deleted from your system if, 1) it is marked as expirable, AND 2) it is
- more than one week old. If you do not mark an article as expirable, it
- will remain on your system until hell freezes over. This bears
- repeating one more time, with some spurious capitalizations: IF you do
- NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
- @vindex gnus-auto-expirable-newsgroups
- You do not have to mark articles as expirable by hand. Groups that
- match the regular expression @code{gnus-auto-expirable-newsgroups} will
- have all articles that you read marked as expirable automatically. All
- articles marked as expirable have an @samp{E} in the first
- column in the summary buffer.
- By default, if you have auto expiry switched on, Gnus will mark all the
- articles you read as expirable, no matter if they were read or unread
- before. To avoid having articles marked as read marked as expirable
- automatically, you can put something like the following in your
- @file{.gnus} file:
- @vindex gnus-mark-article-hook
- @lisp
- (remove-hook 'gnus-mark-article-hook
- 'gnus-summary-mark-read-and-unread-as-read)
- (add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)
- @end lisp
- Note that making a group auto-expirable doesn't mean that all read
- articles are expired---only the articles marked as expirable
- will be expired. Also note that using the @kbd{d} command won't make
- groups expirable---only semi-automatic marking of articles as read will
- mark the articles as expirable in auto-expirable groups.
- Let's say you subscribe to a couple of mailing lists, and you want the
- articles you have read to disappear after a while:
- @lisp
- (setq gnus-auto-expirable-newsgroups
- "mail.nonsense-list\\|mail.nice-list")
- @end lisp
- Another way to have auto-expiry happen is to have the element
- @code{auto-expire} in the group parameters of the group.
- If you use adaptive scoring (@pxref{Adaptive Scoring}) and
- auto-expiring, you'll have problems. Auto-expiring and adaptive scoring
- don't really mix very well.
- @vindex nnmail-expiry-wait
- The @code{nnmail-expiry-wait} variable supplies the default time an
- expirable article has to live. Gnus starts counting days from when the
- message @emph{arrived}, not from when it was sent. The default is seven
- days.
- Gnus also supplies a function that lets you fine-tune how long articles
- are to live, based on what group they are in. Let's say you want to
- have one month expiry period in the @samp{mail.private} group, a one day
- expiry period in the @samp{mail.junk} group, and a six day expiry period
- everywhere else:
- @vindex nnmail-expiry-wait-function
- @lisp
- (setq nnmail-expiry-wait-function
- (lambda (group)
- (cond ((string= group "mail.private")
- 31)
- ((string= group "mail.junk")
- 1)
- ((string= group "important")
- 'never)
- (t
- 6))))
- @end lisp
- The group names this function is fed are ``unadorned'' group
- names---no @samp{nnml:} prefixes and the like.
- The @code{nnmail-expiry-wait} variable and
- @code{nnmail-expiry-wait-function} function can either be a number (not
- necessarily an integer) or one of the symbols @code{immediate} or
- @code{never}.
- You can also use the @code{expiry-wait} group parameter to selectively
- change the expiry period (@pxref{Group Parameters}).
- @vindex nnmail-expiry-target
- The normal action taken when expiring articles is to delete them.
- However, in some circumstances it might make more sense to move them to
- other groups instead of deleting them. The variable @code{nnmail-expiry-target}
- (and the @code{expiry-target} group parameter) controls this. The
- variable supplies a default value for all groups, which can be
- overridden for specific groups by the group parameter.
- default value is @code{delete}, but this can also be a string (which
- should be the name of the group the message should be moved to), or a
- function (which will be called in a buffer narrowed to the message in
- question, and with the name of the group being moved from as its
- parameter) which should return a target -- either a group name or
- @code{delete}.
- Here's an example for specifying a group name:
- @lisp
- (setq nnmail-expiry-target "nnml:expired")
- @end lisp
- @vindex nnmail-keep-last-article
- If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
- expire the final article in a mail newsgroup. This is to make life
- easier for procmail users.
- @vindex gnus-total-expirable-newsgroups
- By the way: That line up there, about Gnus never expiring non-expirable
- articles, is a lie. If you put @code{total-expire} in the group
- parameters, articles will not be marked as expirable, but all read
- articles will be put through the expiry process. Use with extreme
- caution. Even more dangerous is the
- @code{gnus-total-expirable-newsgroups} variable. All groups that match
- this regexp will have all read articles put through the expiry process,
- which means that @emph{all} old mail articles in the groups in question
- will be deleted after a while. Use with extreme caution, and don't come
- crying to me when you discover that the regexp you used matched the
- wrong group and all your important mail has disappeared. Be a
- @emph{man}! Or a @emph{woman}! Whatever you feel more comfortable
- with! So there!
- Most people make most of their mail groups total-expirable, though.
- @vindex gnus-inhibit-user-auto-expire
- If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking
- commands will not mark an article as expirable, even if the group has
- auto-expire turned on.
- @node Washing Mail
- @subsection Washing Mail
- @cindex mail washing
- @cindex list server brain damage
- @cindex incoming mail treatment
- Mailers and list servers are notorious for doing all sorts of really,
- really stupid things with mail. ``Hey, RFC 822 doesn't explicitly
- prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
- end of all lines passing through our server, so let's do that!!!!1!''
- Yes, but RFC 822 wasn't designed to be read by morons. Things that were
- considered to be self-evident were not discussed. So. Here we are.
- Case in point: The German version of Microsoft Exchange adds @samp{AW:
- } to the subjects of replies instead of @samp{Re: }. I could pretend to
- be shocked and dismayed by this, but I haven't got the energy. It is to
- laugh.
- Gnus provides a plethora of functions for washing articles while
- displaying them, but it might be nicer to do the filtering before
- storing the mail to disc. For that purpose, we have three hooks and
- various functions that can be put in these hooks.
- @table @code
- @item nnmail-prepare-incoming-hook
- @vindex nnmail-prepare-incoming-hook
- This hook is called before doing anything with the mail and is meant for
- grand, sweeping gestures. It is called in a buffer that contains all
- the new, incoming mail. Functions to be used include:
- @table @code
- @item nnheader-ms-strip-cr
- @findex nnheader-ms-strip-cr
- Remove trailing carriage returns from each line. This is default on
- Emacs running on MS machines.
- @end table
- @item nnmail-prepare-incoming-header-hook
- @vindex nnmail-prepare-incoming-header-hook
- This hook is called narrowed to each header. It can be used when
- cleaning up the headers. Functions that can be used include:
- @table @code
- @item nnmail-remove-leading-whitespace
- @findex nnmail-remove-leading-whitespace
- Clear leading white space that ``helpful'' listservs have added to the
- headers to make them look nice. Aaah.
- @item nnmail-remove-list-identifiers
- @findex nnmail-remove-list-identifiers
- Some list servers add an identifier---for example, @samp{(idm)}---to the
- beginning of all @code{Subject} headers. I'm sure that's nice for
- people who use stone age mail readers. This function will remove
- strings that match the @code{nnmail-list-identifiers} regexp, which can
- also be a list of regexp. @code{nnmail-list-identifiers} may not contain
- @code{\\(..\\)}.
- For instance, if you want to remove the @samp{(idm)} and the
- @samp{nagnagnag} identifiers:
- @lisp
- (setq nnmail-list-identifiers
- '("(idm)" "nagnagnag"))
- @end lisp
- This can also be done non-destructively with
- @code{gnus-list-identifiers}, @xref{Article Hiding}.
- @item nnmail-remove-tabs
- @findex nnmail-remove-tabs
- Translate all tab characters into space characters.
- @item nnmail-fix-eudora-headers
- @findex nnmail-fix-eudora-headers
- @cindex Eudora
- Eudora produces broken @code{References} headers, but OK
- @code{In-Reply-To} headers. This function will get rid of the
- @code{References} headers.
- @end table
- @item nnmail-prepare-incoming-message-hook
- @vindex nnmail-prepare-incoming-message-hook
- This hook is called narrowed to each message. Functions to be used
- include:
- @table @code
- @item article-de-quoted-unreadable
- @findex article-de-quoted-unreadable
- Decode Quoted Readable encoding.
- @end table
- @end table
- @node Duplicates
- @subsection Duplicates
- @vindex nnmail-treat-duplicates
- @vindex nnmail-message-id-cache-length
- @vindex nnmail-message-id-cache-file
- @cindex duplicate mails
- If you are a member of a couple of mailing lists, you will sometimes
- receive two copies of the same mail. This can be quite annoying, so
- @code{nnmail} checks for and treats any duplicates it might find. To do
- this, it keeps a cache of old @code{Message-ID}s---
- @code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
- default. The approximate maximum number of @code{Message-ID}s stored
- there is controlled by the @code{nnmail-message-id-cache-length}
- variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be
- stored.) If all this sounds scary to you, you can set
- @code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
- default), and @code{nnmail} won't delete duplicate mails. Instead it
- will insert a warning into the head of the mail saying that it thinks
- that this is a duplicate of a different message.
- This variable can also be a function. If that's the case, the function
- will be called from a buffer narrowed to the message in question with
- the @code{Message-ID} as a parameter. The function must return either
- @code{nil}, @code{warn}, or @code{delete}.
- You can turn this feature off completely by setting the variable to
- @code{nil}.
- If you want all the duplicate mails to be put into a special
- @dfn{duplicates} group, you could do that using the normal mail split
- methods:
- @lisp
- (setq nnmail-split-fancy
- '(| ;; Messages duplicates go to a separate group.
- ("gnus-warning" "duplication of message" "duplicate")
- ;; Message from daemons, postmaster, and the like to another.
- (any mail "mail.misc")
- ;; Other rules.
- [ ... ] ))
- @end lisp
- Or something like:
- @lisp
- (setq nnmail-split-methods
- '(("duplicates" "^Gnus-Warning:")
- ;; Other rules.
- [...]))
- @end lisp
- Here's a neat feature: If you know that the recipient reads her mail
- with Gnus, and that she has @code{nnmail-treat-duplicates} set to
- @code{delete}, you can send her as many insults as you like, just by
- using a @code{Message-ID} of a mail that you know that she's already
- received. Think of all the fun! She'll never see any of it! Whee!
- @node Not Reading Mail
- @subsection Not Reading Mail
- If you start using any of the mail back ends, they have the annoying
- habit of assuming that you want to read mail with them. This might not
- be unreasonable, but it might not be what you want.
- If you set @code{mail-sources} and @code{nnmail-spool-file} to
- @code{nil}, none of the back ends will ever attempt to read incoming
- mail, which should help.
- @vindex nnbabyl-get-new-mail
- @vindex nnmbox-get-new-mail
- @vindex nnml-get-new-mail
- @vindex nnmh-get-new-mail
- @vindex nnfolder-get-new-mail
- This might be too much, if, for instance, you are reading mail quite
- happily with @code{nnml} and just want to peek at some old @sc{rmail}
- file you have stashed away with @code{nnbabyl}. All back ends have
- variables called back-end-@code{get-new-mail}. If you want to disable
- the @code{nnbabyl} mail reading, you edit the virtual server for the
- group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
- All the mail back ends will call @code{nn}*@code{-prepare-save-mail-hook}
- narrowed to the article to be saved before saving it when reading
- incoming mail.
- @node Choosing a Mail Back End
- @subsection Choosing a Mail Back End
- Gnus will read the mail spool when you activate a mail group. The mail
- file is first copied to your home directory. What happens after that
- depends on what format you want to store your mail in.
- There are five different mail back ends in the standard Gnus, and more
- back ends are available separately. The mail back end most people use
- (because it is the fastest and most flexible) is @code{nnml}
- (@pxref{Mail Spool}).
- @menu
- * Unix Mail Box:: Using the (quite) standard Un*x mbox.
- * Rmail Babyl:: Emacs programs use the rmail babyl format.
- * Mail Spool:: Store your mail in a private spool?
- * MH Spool:: An mhspool-like back end.
- * Mail Folders:: Having one file for each group.
- * Comparing Mail Back Ends:: An in-depth looks at pros and cons.
- @end menu
- @node Unix Mail Box
- @subsubsection Unix Mail Box
- @cindex nnmbox
- @cindex unix mail box
- @vindex nnmbox-active-file
- @vindex nnmbox-mbox-file
- The @dfn{nnmbox} back end will use the standard Un*x mbox file to store
- mail. @code{nnmbox} will add extra headers to each mail article to say
- which group it belongs in.
- Virtual server settings:
- @table @code
- @item nnmbox-mbox-file
- @vindex nnmbox-mbox-file
- The name of the mail box in the user's home directory.
- @item nnmbox-active-file
- @vindex nnmbox-active-file
- The name of the active file for the mail box.
- @item nnmbox-get-new-mail
- @vindex nnmbox-get-new-mail
- If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
- into groups.
- @end table
- @node Rmail Babyl
- @subsubsection Rmail Babyl
- @cindex nnbabyl
- @cindex rmail mbox
- @vindex nnbabyl-active-file
- @vindex nnbabyl-mbox-file
- The @dfn{nnbabyl} back end will use a babyl mail box (aka. @dfn{rmail
- mbox}) to store mail. @code{nnbabyl} will add extra headers to each
- mail article to say which group it belongs in.
- Virtual server settings:
- @table @code
- @item nnbabyl-mbox-file
- @vindex nnbabyl-mbox-file
- The name of the rmail mbox file.
- @item nnbabyl-active-file
- @vindex nnbabyl-active-file
- The name of the active file for the rmail box.
- @item nnbabyl-get-new-mail
- @vindex nnbabyl-get-new-mail
- If non-@code{nil}, @code{nnbabyl} will read incoming mail.
- @end table
- @node Mail Spool
- @subsubsection Mail Spool
- @cindex nnml
- @cindex mail @sc{nov} spool
- The @dfn{nnml} spool mail format isn't compatible with any other known
- format. It should be used with some caution.
- @vindex nnml-directory
- If you use this back end, Gnus will split all incoming mail into files,
- one file for each mail, and put the articles into the corresponding
- directories under the directory specified by the @code{nnml-directory}
- variable. The default value is @file{~/Mail/}.
- You do not have to create any directories beforehand; Gnus will take
- care of all that.
- If you have a strict limit as to how many files you are allowed to store
- in your account, you should not use this back end. As each mail gets its
- own file, you might very well occupy thousands of inodes within a few
- weeks. If this is no problem for you, and it isn't a problem for you
- having your friendly systems administrator walking around, madly,
- shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
- know that this is probably the fastest format to use. You do not have
- to trudge through a big mbox file just to read your new mail.
- @code{nnml} is probably the slowest back end when it comes to article
- splitting. It has to create lots of files, and it also generates
- @sc{nov} databases for the incoming mails. This makes it the fastest
- back end when it comes to reading mail.
- Virtual server settings:
- @table @code
- @item nnml-directory
- @vindex nnml-directory
- All @code{nnml} directories will be placed under this directory.
- @item nnml-active-file
- @vindex nnml-active-file
- The active file for the @code{nnml} server.
- @item nnml-newsgroups-file
- @vindex nnml-newsgroups-file
- The @code{nnml} group descriptions file. @xref{Newsgroups File
- Format}.
- @item nnml-get-new-mail
- @vindex nnml-get-new-mail
- If non-@code{nil}, @code{nnml} will read incoming mail.
- @item nnml-nov-is-evil
- @vindex nnml-nov-is-evil
- If non-@code{nil}, this back end will ignore any @sc{nov} files.
- @item nnml-nov-file-name
- @vindex nnml-nov-file-name
- The name of the @sc{nov} files. The default is @file{.overview}.
- @item nnml-prepare-save-mail-hook
- @vindex nnml-prepare-save-mail-hook
- Hook run narrowed to an article before saving.
- @end table
- @findex nnml-generate-nov-databases
- If your @code{nnml} groups and @sc{nov} files get totally out of whack,
- you can do a complete update by typing @kbd{M-x
- nnml-generate-nov-databases}. This command will trawl through the
- entire @code{nnml} hierarchy, looking at each and every article, so it
- might take a while to complete. A better interface to this
- functionality can be found in the server buffer (@pxref{Server
- Commands}).
- @node MH Spool
- @subsubsection MH Spool
- @cindex nnmh
- @cindex mh-e mail spool
- @code{nnmh} is just like @code{nnml}, except that is doesn't generate
- @sc{nov} databases and it doesn't keep an active file. This makes
- @code{nnmh} a @emph{much} slower back end than @code{nnml}, but it also
- makes it easier to write procmail scripts for.
- Virtual server settings:
- @table @code
- @item nnmh-directory
- @vindex nnmh-directory
- All @code{nnmh} directories will be located under this directory.
- @item nnmh-get-new-mail
- @vindex nnmh-get-new-mail
- If non-@code{nil}, @code{nnmh} will read incoming mail.
- @item nnmh-be-safe
- @vindex nnmh-be-safe
- If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
- sure that the articles in the folder are actually what Gnus thinks they
- are. It will check date stamps and stat everything in sight, so
- setting this to @code{t} will mean a serious slow-down. If you never
- use anything but Gnus to read the @code{nnmh} articles, you do not have
- to set this variable to @code{t}.
- @end table
- @node Mail Folders
- @subsubsection Mail Folders
- @cindex nnfolder
- @cindex mbox folders
- @cindex mail folders
- @code{nnfolder} is a back end for storing each mail group in a separate
- file. Each file is in the standard Un*x mbox format. @code{nnfolder}
- will add extra headers to keep track of article numbers and arrival
- dates.
- Virtual server settings:
- @table @code
- @item nnfolder-directory
- @vindex nnfolder-directory
- All the @code{nnfolder} mail boxes will be stored under this directory.
- @item nnfolder-active-file
- @vindex nnfolder-active-file
- The name of the active file.
- @item nnfolder-newsgroups-file
- @vindex nnfolder-newsgroups-file
- The name of the group descriptions file. @xref{Newsgroups File Format}.
- @item nnfolder-get-new-mail
- @vindex nnfolder-get-new-mail
- If non-@code{nil}, @code{nnfolder} will read incoming mail.
- @item nnfolder-save-buffer-hook
- @vindex nnfolder-save-buffer-hook
- @cindex backup files
- Hook run before saving the folders. Note that Emacs does the normal
- backup renaming of files even with the @code{nnfolder} buffers. If you
- wish to switch this off, you could say something like the following in
- your @file{.emacs} file:
- @lisp
- (defun turn-off-backup ()
- (set (make-local-variable 'backup-inhibited) t))
- (add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)
- @end lisp
- @item nnfolder-delete-mail-hook
- @vindex nnfolder-delete-mail-hook
- Hook run in a buffer narrowed to the message that is to be deleted.
- This function can be used to copy the message to somewhere else, or to
- extract some information from it before removing it.
- @end table
- @findex nnfolder-generate-active-file
- @kindex M-x nnfolder-generate-active-file
- If you have lots of @code{nnfolder}-like files you'd like to read with
- @code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
- command to make @code{nnfolder} aware of all likely files in
- @code{nnfolder-directory}. This only works if you use long file names,
- though.
- @node Comparing Mail Back Ends
- @subsubsection Comparing Mail Back Ends
- First, just for terminology, the @dfn{back end} is the common word for a
- low-level access method---a transport, if you will, by which something
- is acquired. The sense is that one's mail has to come from somewhere,
- and so selection of a suitable back end is required in order to get that
- mail within spitting distance of Gnus.
- The same concept exists for Usenet itself: Though access to articles is
- typically done by @sc{nntp} these days, once upon a midnight dreary, everyone
- in the world got at Usenet by running a reader on the machine where the
- articles lay (the machine which today we call an @sc{nntp} server), and
- access was by the reader stepping into the articles' directory spool
- area directly. One can still select between either the @code{nntp} or
- @code{nnspool} back ends, to select between these methods, if one happens
- actually to live on the server (or can see its spool directly, anyway,
- via NFS).
- The goal in selecting a mail back end is to pick one which
- simultaneously represents a suitable way of dealing with the original
- format plus leaving mail in a form that is convenient to use in the
- future. Here are some high and low points on each:
- @table @code
- @item nnmbox
- UNIX systems have historically had a single, very common, and well-
- defined format. All messages arrive in a single @dfn{spool file}, and
- they are delineated by a line whose regular expression matches
- @samp{^From_}. (My notational use of @samp{_} is to indicate a space,
- to make it clear in this instance that this is not the RFC-specified
- @samp{From:} header.) Because Emacs and therefore Gnus emanate
- historically from the Unix environment, it is simplest if one does not
- mess a great deal with the original mailbox format, so if one chooses
- this back end, Gnus' primary activity in getting mail from the real spool
- area to Gnus' preferred directory is simply to copy it, with no
- (appreciable) format change in the process. It is the ``dumbest'' way
- to move mail into availability in the Gnus environment. This makes it
- fast to move into place, but slow to parse, when Gnus has to look at
- what's where.
- @item nnbabyl
- Once upon a time, there was the DEC-10 and DEC-20, running operating
- systems called TOPS and related things, and the usual (only?) mail
- reading environment was a thing called Babyl. I don't know what format
- was used for mail landing on the system, but Babyl had its own internal
- format to which mail was converted, primarily involving creating a
- spool-file-like entity with a scheme for inserting Babyl-specific
- headers and status bits above the top of each message in the file.
- RMAIL was Emacs' first mail reader, it was written by Richard Stallman,
- and Stallman came out of that TOPS/Babyl environment, so he wrote RMAIL
- to understand the mail files folks already had in existence. Gnus (and
- VM, for that matter) continue to support this format because it's
- perceived as having some good qualities in those mailer-specific
- headers/status bits stuff. RMAIL itself still exists as well, of
- course, and is still maintained by Stallman.
- Both of the above forms leave your mail in a single file on your
- filesystem, and they must parse that entire file each time you take a
- look at your mail.
- @item nnml
- @code{nnml} is the back end which smells the most as though you were
- actually operating with an @code{nnspool}-accessed Usenet system. (In
- fact, I believe @code{nnml} actually derived from @code{nnspool} code,
- lo these years ago.) One's mail is taken from the original spool file,
- and is then cut up into individual message files, 1:1. It maintains a
- Usenet-style active file (analogous to what one finds in an INN- or
- CNews-based news system in (for instance) @file{/var/lib/news/active},
- or what is returned via the @samp{NNTP LIST} verb) and also creates
- @dfn{overview} files for efficient group entry, as has been defined for
- @sc{nntp} servers for some years now. It is slower in mail-splitting,
- due to the creation of lots of files, updates to the @code{nnml} active
- file, and additions to overview files on a per-message basis, but it is
- extremely fast on access because of what amounts to the indexing support
- provided by the active file and overviews.
- @code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the
- resource which defines available places in the filesystem to put new
- files. Sysadmins take a dim view of heavy inode occupation within
- tight, shared filesystems. But if you live on a personal machine where
- the filesystem is your own and space is not at a premium, @code{nnml}
- wins big.
- It is also problematic using this back end if you are living in a
- FAT16-based Windows world, since much space will be wasted on all these
- tiny files.
- @item nnmh
- The Rand MH mail-reading system has been around UNIX systems for a very
- long time; it operates by splitting one's spool file of messages into
- individual files, but with little or no indexing support -- @code{nnmh}
- is considered to be semantically equivalent to ``@code{nnml} without
- active file or overviews''. This is arguably the worst choice, because
- one gets the slowness of individual file creation married to the
- slowness of access parsing when learning what's new in one's groups.
- @item nnfolder
- Basically the effect of @code{nnfolder} is @code{nnmbox} (the first
- method described above) on a per-group basis. That is, @code{nnmbox}
- itself puts *all* one's mail in one file; @code{nnfolder} provides a
- little bit of optimization to this so that each of one's mail groups has
- a Unix mail box file. It's faster than @code{nnmbox} because each group
- can be parsed separately, and still provides the simple Unix mail box
- format requiring minimal effort in moving the mail around. In addition,
- it maintains an ``active'' file making it much faster for Gnus to figure
- out how many messages there are in each separate group.
- If you have groups that are expected to have a massive amount of
- messages, @code{nnfolder} is not the best choice, but if you receive
- only a moderate amount of mail, @code{nnfolder} is probably the most
- friendly mail back end all over.
- @end table
- @node Browsing the Web
- @section Browsing the Web
- @cindex web
- @cindex browsing the web
- @cindex www
- @cindex http
- Web-based discussion forums are getting more and more popular. On many
- subjects, the web-based forums have become the most important forums,
- eclipsing the importance of mailing lists and news groups. The reason
- is easy to understand---they are friendly to new users; you just point
- and click, and there's the discussion. With mailing lists, you have to
- go through a cumbersome subscription procedure, and most people don't
- even know what a news group is.
- The problem with this scenario is that web browsers are not very good at
- being newsreaders. They do not keep track of what articles you've read;
- they do not allow you to score on subjects you're interested in; they do
- not allow off-line browsing; they require you to click around and drive
- you mad in the end.
- So---if web browsers suck at reading discussion forums, why not use Gnus
- to do it instead?
- Gnus has been getting a bit of a collection of back ends for providing
- interfaces to these sources.
- @menu
- * Web Searches:: Creating groups from articles that match a string.
- * Slashdot:: Reading the Slashdot comments.
- * Ultimate:: The Ultimate Bulletin Board systems.
- * Web Archive:: Reading mailing list archived on web.
- * Customizing w3:: Doing stuff to Emacs/w3 from Gnus.
- @end menu
- All the web sources require Emacs/w3 and the url library to work.
- The main caveat with all these web sources is that they probably won't
- work for a very long time. Gleaning information from the @sc{html} data
- is guesswork at best, and when the layout is altered, the Gnus back end
- will fail. If you have reasonably new versions of these back ends,
- though, you should be ok.
- One thing all these Web methods have in common is that the Web sources
- are often down, unavailable or just plain too slow to be fun. In those
- cases, it makes a lot of sense to let the Gnus Agent (@pxref{Gnus
- Unplugged}) handle downloading articles, and then you can read them at
- leisure from your local disk. No more World Wide Wait for you.
- @node Web Searches
- @subsection Web Searches
- @cindex nnweb
- @cindex DejaNews
- @cindex Alta Vista
- @cindex InReference
- @cindex Usenet searches
- @cindex searching the Usenet
- It's, like, too neat to search the Usenet for articles that match a
- string, but it, like, totally @emph{sucks}, like, totally, to use one of
- those, like, Web browsers, and you, like, have to, rilly, like, look at
- the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
- searches without having to use a browser.
- The @code{nnweb} back end allows an easy interface to the mighty search
- engine. You create an @code{nnweb} group, enter a search pattern, and
- then enter the group and read the articles like you would any normal
- group. The @kbd{G w} command in the group buffer (@pxref{Foreign
- Groups}) will do this in an easy-to-use fashion.
- @code{nnweb} groups don't really lend themselves to being solid
- groups---they have a very fleeting idea of article numbers. In fact,
- each time you enter an @code{nnweb} group (not even changing the search
- pattern), you are likely to get the articles ordered in a different
- manner. Not even using duplicate suppression (@pxref{Duplicate
- Suppression}) will help, since @code{nnweb} doesn't even know the
- @code{Message-ID} of the articles before reading them using some search
- engines (DejaNews, for instance). The only possible way to keep track
- of which articles you've read is by scoring on the @code{Date}
- header---mark all articles posted before the last date you read the
- group as read.
- If the search engine changes its output substantially, @code{nnweb}
- won't be able to parse it and will fail. One could hardly fault the Web
- providers if they were to do this---their @emph{raison d'être} is to
- make money off of advertisements, not to provide services to the
- community. Since @code{nnweb} washes the ads off all the articles, one
- might think that the providers might be somewhat miffed. We'll see.
- You must have the @code{url} and @code{w3} package installed to be able
- to use @code{nnweb}.
- Virtual server variables:
- @table @code
- @item nnweb-type
- @vindex nnweb-type
- What search engine type is being used. The currently supported types
- are @code{dejanews}, @code{dejanewsold}, @code{altavista} and
- @code{reference}.
- @item nnweb-search
- @vindex nnweb-search
- The search string to feed to the search engine.
- @item nnweb-max-hits
- @vindex nnweb-max-hits
- Advisory maximum number of hits per search to display. The default is
- 100.
- @item nnweb-type-definition
- @vindex nnweb-type-definition
- Type-to-definition alist. This alist says what @code{nnweb} should do
- with the various search engine types. The following elements must be
- present:
- @table @code
- @item article
- Function to decode the article and provide something that Gnus
- understands.
- @item map
- Function to create an article number to message header and URL alist.
- @item search
- Function to send the search string to the search engine.
- @item address
- The address the aforementioned function should send the search string
- to.
- @item id
- Format string URL to fetch an article by @code{Message-ID}.
- @end table
- @end table
- @node Slashdot
- @subsection Slashdot
- @cindex Slashdot
- @cindex nnslashdot
- Slashdot (@uref{http://slashdot.org/}) is a popular news site, with
- lively discussion following the news articles. @code{nnslashdot} will
- let you read this forum in a convenient manner.
- The easiest way to read this source is to put something like the
- following in your @file{.gnus.el} file:
- @lisp
- (setq gnus-secondary-select-methods
- '((nnslashdot "")))
- @end lisp
- This will make Gnus query the @code{nnslashdot} back end for new comments
- and groups. The @kbd{F} command will subscribe each new news article as
- a new Gnus group, and you can read the comments by entering these
- groups. (Note that the default subscription method is to subscribe new
- groups as zombies. Other methods are available (@pxref{Subscription
- Methods}).
- If you want to remove an old @code{nnslashdot} group, the @kbd{G @key{DEL}}
- command is the most handy tool (@pxref{Foreign Groups}).
- When following up to @code{nnslashdot} comments (or posting new
- comments), some light @sc{html}izations will be performed. In
- particular, text quoted with @samp{> } will be quoted with
- @code{blockquote} instead, and signatures will have @code{br} added to
- the end of each line. Other than that, you can just write @sc{html}
- directly into the message buffer. Note that Slashdot filters out some
- @sc{html} forms.
- The following variables can be altered to change its behavior:
- @table @code
- @item nnslashdot-threaded
- Whether @code{nnslashdot} should display threaded groups or not. The
- default is @code{t}. To be able to display threads, @code{nnslashdot}
- has to retrieve absolutely all comments in a group upon entry. If a
- threaded display is not required, @code{nnslashdot} will only retrieve
- the comments that are actually wanted by the user. Threading is nicer,
- but much, much slower than untreaded.
- @item nnslashdot-login-name
- @vindex nnslashdot-login-name
- The login name to use when posting.
- @item nnslashdot-password
- @vindex nnslashdot-password
- The password to use when posting.
- @item nnslashdot-directory
- @vindex nnslashdot-directory
- Where @code{nnslashdot} will store its files. The default is
- @samp{~/News/slashdot/}.
- @item nnslashdot-active-url
- @vindex nnslashdot-active-url
- The @sc{url} format string that will be used to fetch the information on
- news articles and comments. Default:
- @samp{http://slashdot.org/search.pl?section=&min=%d}.
- @item nnslashdot-comments-url
- @vindex nnslashdot-comments-url
- The @sc{url} format string that will be used to fetch comments. The
- default is
- @samp{http://slashdot.org/comments.pl?sid=%s&threshold=%d&commentsort=%d&mode=flat&startat=%d}.
- @item nnslashdot-article-url
- @vindex nnslashdot-article-url
- The @sc{url} format string that will be used to fetch the news article. The
- default is
- @samp{http://slashdot.org/article.pl?sid=%s&mode=nocomment}.
- @item nnslashdot-threshold
- @vindex nnslashdot-threshold
- The score threshold. The default is -1.
- @item nnslashdot-group-number
- @vindex nnslashdot-group-number
- The number of old groups, in addition to the ten latest, to keep
- updated. The default is 0.
- @end table
- @node Ultimate
- @subsection Ultimate
- @cindex nnultimate
- @cindex Ultimate Bulletin Board
- The Ultimate Bulletin Board (@uref{http://www.ultimatebb.com/}) is
- probably the most popular Web bulletin board system used. It has a
- quite regular and nice interface, and it's possible to get the
- information Gnus needs to keep groups updated.
- The easiest way to get started with @code{nnultimate} is to say
- something like the following in the group buffer: @kbd{B nnultimate @key{RET}
- http://www.tcj.com/messboard/ubbcgi/ @key{RET}}. (Substitute the @sc{url}
- (not including @samp{Ultimate.cgi} or the like at the end) for a forum
- you're interested in; there's quite a list of them on the Ultimate web
- site.) Then subscribe to the groups you're interested in from the
- server buffer, and read them from the group buffer.
- The following @code{nnultimate} variables can be altered:
- @table @code
- @item nnultimate-directory
- @vindex nnultimate-directory
- The directory where @code{nnultimate} stores its files. The default is
- @samp{~/News/ultimate/}.
- @end table
- @node Web Archive
- @subsection Web Archive
- @cindex nnwarchive
- @cindex Web Archive
- Some mailing lists only have archives on Web servers, such as
- @uref{http://www.egroups.com/} and
- @uref{http://www.mail-archive.com/}. It has a quite regular and nice
- interface, and it's possible to get the information Gnus needs to keep
- groups updated.
- The easiest way to get started with @code{nnwarchive} is to say
- something like the following in the group buffer: @kbd{M-x
- gnus-group-make-warchive-group @key{RET} an_egroup @key{RET} egroups @key{RET}
- www.egroups.com @key{RET} your@@email.address @key{RET}}. (Substitute the
- @sc{an_egroup} with the mailing list you subscribed, the
- @sc{your@@email.address} with your email address.), or to browse the
- back end by @kbd{B nnwarchive @key{RET} mail-archive @key{RET}}.
- The following @code{nnwarchive} variables can be altered:
- @table @code
- @item nnwarchive-directory
- @vindex nnwarchive-directory
- The directory where @code{nnwarchive} stores its files. The default is
- @samp{~/News/warchive/}.
- @item nnwarchive-login
- @vindex nnwarchive-login
- The account name on the web server.
- @item nnwarchive-passwd
- @vindex nnwarchive-passwd
- The password for your account on the web server.
- @end table
- @node Customizing w3
- @subsection Customizing w3
- @cindex w3
- @cindex html
- @cindex url
- @cindex Netscape
- Gnus uses the url library to fetch web pages and Emacs/w3 to display web
- pages. Emacs/w3 is documented in its own manual, but there are some
- things that may be more relevant for Gnus users.
- For instance, a common question is how to make Emacs/w3 follow links
- using the @code{browse-url} functions (which will call some external web
- browser like Netscape). Here's one way:
- @lisp
- (eval-after-load "w3"
- '(progn
- (fset 'w3-fetch-orig (symbol-function 'w3-fetch))
- (defun w3-fetch (&optional url target)
- (interactive (list (w3-read-url-with-default)))
- (if (eq major-mode 'gnus-article-mode)
- (browse-url url)
- (w3-fetch-orig url target)))))
- @end lisp
- Put that in your @file{.emacs} file, and hitting links in w3-rendered
- @sc{html} in the Gnus article buffers will use @code{browse-url} to
- follow the link.
- @node Other Sources
- @section Other Sources
- Gnus can do more than just read news or mail. The methods described
- below allow Gnus to view directories and files as if they were
- newsgroups.
- @menu
- * Directory Groups:: You can read a directory as if it was a newsgroup.
- * Anything Groups:: Dired? Who needs dired?
- * Document Groups:: Single files can be the basis of a group.
- * SOUP:: Reading @sc{soup} packets ``offline''.
- * Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
- * IMAP:: Using Gnus as a @sc{imap} client.
- @end menu
- @node Directory Groups
- @subsection Directory Groups
- @cindex nndir
- @cindex directory groups
- If you have a directory that has lots of articles in separate files in
- it, you might treat it as a newsgroup. The files have to have numerical
- names, of course.
- This might be an opportune moment to mention @code{ange-ftp} (and its
- successor @code{efs}), that most wonderful of all wonderful Emacs
- packages. When I wrote @code{nndir}, I didn't think much about it---a
- back end to read directories. Big deal.
- @code{ange-ftp} changes that picture dramatically. For instance, if you
- enter the @code{ange-ftp} file name
- @file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,
- @code{ange-ftp} or @code{efs} will actually allow you to read this
- directory over at @samp{sina} as a newsgroup. Distributed news ahoy!
- @code{nndir} will use @sc{nov} files if they are present.
- @code{nndir} is a ``read-only'' back end---you can't delete or expire
- articles with this method. You can use @code{nnmh} or @code{nnml} for
- whatever you use @code{nndir} for, so you could switch to any of those
- methods if you feel the need to have a non-read-only @code{nndir}.
- @node Anything Groups
- @subsection Anything Groups
- @cindex nneething
- From the @code{nndir} back end (which reads a single spool-like
- directory), it's just a hop and a skip to @code{nneething}, which
- pretends that any arbitrary directory is a newsgroup. Strange, but
- true.
- When @code{nneething} is presented with a directory, it will scan this
- directory and assign article numbers to each file. When you enter such
- a group, @code{nneething} must create ``headers'' that Gnus can use.
- After all, Gnus is a newsreader, in case you're forgetting.
- @code{nneething} does this in a two-step process. First, it snoops each
- file in question. If the file looks like an article (i.e., the first
- few lines look like headers), it will use this as the head. If this is
- just some arbitrary file without a head (e.g. a C source file),
- @code{nneething} will cobble up a header out of thin air. It will use
- file ownership, name and date and do whatever it can with these
- elements.
- All this should happen automatically for you, and you will be presented
- with something that looks very much like a newsgroup. Totally like a
- newsgroup, to be precise. If you select an article, it will be displayed
- in the article buffer, just as usual.
- If you select a line that represents a directory, Gnus will pop you into
- a new summary buffer for this @code{nneething} group. And so on. You can
- traverse the entire disk this way, if you feel like, but remember that
- Gnus is not dired, really, and does not intend to be, either.
- There are two overall modes to this action---ephemeral or solid. When
- doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
- will not store information on what files you have read, and what files
- are new, and so on. If you create a solid @code{nneething} group the
- normal way with @kbd{G m}, Gnus will store a mapping table between
- article numbers and file names, and you can treat this group like any
- other groups. When you activate a solid @code{nneething} group, you will
- be told how many unread articles it contains, etc., etc.
- Some variables:
- @table @code
- @item nneething-map-file-directory
- @vindex nneething-map-file-directory
- All the mapping files for solid @code{nneething} groups will be stored
- in this directory, which defaults to @file{~/.nneething/}.
- @item nneething-exclude-files
- @vindex nneething-exclude-files
- All files that match this regexp will be ignored. Nice to use to exclude
- auto-save files and the like, which is what it does by default.
- @item nneething-include-files
- @vindex nneething-include-files
- Regexp saying what files to include in the group. If this variable is
- non-@code{nil}, only files matching this regexp will be included.
- @item nneething-map-file
- @vindex nneething-map-file
- Name of the map files.
- @end table
- @node Document Groups
- @subsection Document Groups
- @cindex nndoc
- @cindex documentation group
- @cindex help group
- @code{nndoc} is a cute little thing that will let you read a single file
- as a newsgroup. Several files types are supported:
- @table @code
- @cindex babyl
- @cindex rmail mbox
- @item babyl
- The babyl (rmail) mail box.
- @cindex mbox
- @cindex Unix mbox
- @item mbox
- The standard Unix mbox file.
- @cindex MMDF mail box
- @item mmdf
- The MMDF mail box format.
- @item news
- Several news articles appended into a file.
- @item rnews
- @cindex rnews batch files
- The rnews batch transport format.
- @cindex forwarded messages
- @item forward
- Forwarded articles.
- @item nsmail
- Netscape mail boxes.
- @item mime-parts
- MIME multipart messages.
- @item standard-digest
- The standard (RFC 1153) digest format.
- @item slack-digest
- Non-standard digest format---matches most things, but does it badly.
- @end table
- You can also use the special ``file type'' @code{guess}, which means
- that @code{nndoc} will try to guess what file type it is looking at.
- @code{digest} means that @code{nndoc} should guess what digest type the
- file is.
- @code{nndoc} will not try to change the file or insert any extra headers into
- it---it will simply, like, let you use the file as the basis for a
- group. And that's it.
- If you have some old archived articles that you want to insert into your
- new & spiffy Gnus mail back end, @code{nndoc} can probably help you with
- that. Say you have an old @file{RMAIL} file with mail that you now want
- to split into your new @code{nnml} groups. You look at that file using
- @code{nndoc} (using the @kbd{G f} command in the group buffer
- (@pxref{Foreign Groups})), set the process mark on all the articles in
- the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
- using @code{nnml}. If all goes well, all the mail in the @file{RMAIL}
- file is now also stored in lots of @code{nnml} directories, and you can
- delete that pesky @file{RMAIL} file. If you have the guts!
- Virtual server variables:
- @table @code
- @item nndoc-article-type
- @vindex nndoc-article-type
- This should be one of @code{mbox}, @code{babyl}, @code{digest},
- @code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
- @code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
- @code{slack-digest}, @code{clari-briefs}, @code{nsmail} or @code{guess}.
- @item nndoc-post-type
- @vindex nndoc-post-type
- This variable says whether Gnus is to consider the group a news group or
- a mail group. There are two valid values: @code{mail} (the default)
- and @code{news}.
- @end table
- @menu
- * Document Server Internals:: How to add your own document types.
- @end menu
- @node Document Server Internals
- @subsubsection Document Server Internals
- Adding new document types to be recognized by @code{nndoc} isn't
- difficult. You just have to whip up a definition of what the document
- looks like, write a predicate function to recognize that document type,
- and then hook into @code{nndoc}.
- First, here's an example document type definition:
- @example
- (mmdf
- (article-begin . "^\^A\^A\^A\^A\n")
- (body-end . "^\^A\^A\^A\^A\n"))
- @end example
- The definition is simply a unique @dfn{name} followed by a series of
- regexp pseudo-variable settings. Below are the possible
- variables---don't be daunted by the number of variables; most document
- types can be defined with very few settings:
- @table @code
- @item first-article
- If present, @code{nndoc} will skip past all text until it finds
- something that match this regexp. All text before this will be
- totally ignored.
- @item article-begin
- This setting has to be present in all document type definitions. It
- says what the beginning of each article looks like.
- @item head-begin-function
- If present, this should be a function that moves point to the head of
- the article.
- @item nndoc-head-begin
- If present, this should be a regexp that matches the head of the
- article.
- @item nndoc-head-end
- This should match the end of the head of the article. It defaults to
- @samp{^$}---the empty line.
- @item body-begin-function
- If present, this function should move point to the beginning of the body
- of the article.
- @item body-begin
- This should match the beginning of the body of the article. It defaults
- to @samp{^\n}.
- @item body-end-function
- If present, this function should move point to the end of the body of
- the article.
- @item body-end
- If present, this should match the end of the body of the article.
- @item file-end
- If present, this should match the end of the file. All text after this
- regexp will be totally ignored.
- @end table
- So, using these variables @code{nndoc} is able to dissect a document
- file into a series of articles, each with a head and a body. However, a
- few more variables are needed since not all document types are all that
- news-like---variables needed to transform the head or the body into
- something that's palatable for Gnus:
- @table @code
- @item prepare-body-function
- If present, this function will be called when requesting an article. It
- will be called with point at the start of the body, and is useful if the
- document has encoded some parts of its contents.
- @item article-transform-function
- If present, this function is called when requesting an article. It's
- meant to be used for more wide-ranging transformation of both head and
- body of the article.
- @item generate-head-function
- If present, this function is called to generate a head that Gnus can
- understand. It is called with the article number as a parameter, and is
- expected to generate a nice head for the article in question. It is
- called when requesting the headers of all articles.
- @end table
- Let's look at the most complicated example I can come up with---standard
- digests:
- @example
- (standard-digest
- (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
- (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
- (prepare-body-function . nndoc-unquote-dashes)
- (body-end-function . nndoc-digest-body-end)
- (head-end . "^ ?$")
- (body-begin . "^ ?\n")
- (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
- (subtype digest guess))
- @end example
- We see that all text before a 70-width line of dashes is ignored; all
- text after a line that starts with that @samp{^End of} is also ignored;
- each article begins with a 30-width line of dashes; the line separating
- the head from the body may contain a single space; and that the body is
- run through @code{nndoc-unquote-dashes} before being delivered.
- To hook your own document definition into @code{nndoc}, use the
- @code{nndoc-add-type} function. It takes two parameters---the first is
- the definition itself and the second (optional) parameter says where in
- the document type definition alist to put this definition. The alist is
- 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
- is of @code{mmdf} type, and so on. These type predicates should return
- @code{nil} if the document is not of the correct type; @code{t} if it is
- of the correct type; and a number if the document might be of the
- correct type. A high number means high probability; a low number means
- low probability with @samp{0} being the lowest valid number.
- @node SOUP
- @subsection SOUP
- @cindex SOUP
- @cindex offline
- In the PC world people often talk about ``offline'' newsreaders. These
- are thingies that are combined reader/news transport monstrosities.
- With built-in modem programs. Yecchh!
- Of course, us Unix Weenie types of human beans use things like
- @code{uucp} and, like, @code{nntpd} and set up proper news and mail
- transport things like Ghod intended. And then we just use normal
- newsreaders.
- However, it can sometimes be convenient to do something that's a bit
- easier on the brain if you have a very slow modem, and you're not really
- that interested in doing things properly.
- A file format called @sc{soup} has been developed for transporting news
- and mail from servers to home machines and back again. It can be a bit
- fiddly.
- First some terminology:
- @table @dfn
- @item server
- This is the machine that is connected to the outside world and where you
- get news and/or mail from.
- @item home machine
- This is the machine that you want to do the actual reading and responding
- on. It is typically not connected to the rest of the world in any way.
- @item packet
- Something that contains messages and/or commands. There are two kinds
- of packets:
- @table @dfn
- @item message packets
- These are packets made at the server, and typically contain lots of
- messages for you to read. These are called @file{SoupoutX.tgz} by
- default, where @var{x} is a number.
- @item response packets
- These are packets made at the home machine, and typically contains
- replies that you've written. These are called @file{SoupinX.tgz} by
- default, where @var{x} is a number.
- @end table
- @end table
- @enumerate
- @item
- You log in on the server and create a @sc{soup} packet. You can either
- use a dedicated @sc{soup} thingie (like the @code{awk} program), or you
- can use Gnus to create the packet with its @sc{soup} commands (@kbd{O
- s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).
- @item
- You transfer the packet home. Rail, boat, car or modem will do fine.
- @item
- You put the packet in your home directory.
- @item
- You fire up Gnus on your home machine using the @code{nnsoup} back end as
- the native or secondary server.
- @item
- You read articles and mail and answer and followup to the things you
- want (@pxref{SOUP Replies}).
- @item
- You do the @kbd{G s r} command to pack these replies into a @sc{soup}
- packet.
- @item
- You transfer this packet to the server.
- @item
- You use Gnus to mail this packet out with the @kbd{G s s} command.
- @item
- You then repeat until you die.
- @end enumerate
- So you basically have a bipartite system---you use @code{nnsoup} for
- reading and Gnus for packing/sending these @sc{soup} packets.
- @menu
- * SOUP Commands:: Commands for creating and sending @sc{soup} packets
- * SOUP Groups:: A back end for reading @sc{soup} packets.
- * SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.
- @end menu
- @node SOUP Commands
- @subsubsection SOUP Commands
- These are commands for creating and manipulating @sc{soup} packets.
- @table @kbd
- @item G s b
- @kindex G s b @r{(Group)}
- @findex gnus-group-brew-soup
- Pack all unread articles in the current group
- (@code{gnus-group-brew-soup}). This command understands the
- process/prefix convention.
- @item G s w
- @kindex G s w @r{(Group)}
- @findex gnus-soup-save-areas
- Save all @sc{soup} data files (@code{gnus-soup-save-areas}).
- @item G s s
- @kindex G s s @r{(Group)}
- @findex gnus-soup-send-replies
- Send all replies from the replies packet
- (@code{gnus-soup-send-replies}).
- @item G s p
- @kindex G s p @r{(Group)}
- @findex gnus-soup-pack-packet
- Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}).
- @item G s r
- @kindex G s r @r{(Group)}
- @findex nnsoup-pack-replies
- Pack all replies into a replies packet (@code{nnsoup-pack-replies}).
- @item O s
- @kindex O s @r{(Summary)}
- @findex gnus-soup-add-article
- This summary-mode command adds the current article to a @sc{soup} packet
- (@code{gnus-soup-add-article}). It understands the process/prefix
- convention (@pxref{Process/Prefix}).
- @end table
- There are a few variables to customize where Gnus will put all these
- thingies:
- @table @code
- @item gnus-soup-directory
- @vindex gnus-soup-directory
- Directory where Gnus will save intermediate files while composing
- @sc{soup} packets. The default is @file{~/SoupBrew/}.
- @item gnus-soup-replies-directory
- @vindex gnus-soup-replies-directory
- This is what Gnus will use as a temporary directory while sending our
- reply packets. @file{~/SoupBrew/SoupReplies/} is the default.
- @item gnus-soup-prefix-file
- @vindex gnus-soup-prefix-file
- Name of the file where Gnus stores the last used prefix. The default is
- @samp{gnus-prefix}.
- @item gnus-soup-packer
- @vindex gnus-soup-packer
- A format string command for packing a @sc{soup} packet. The default is
- @samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}.
- @item gnus-soup-unpacker
- @vindex gnus-soup-unpacker
- Format string command for unpacking a @sc{soup} packet. The default is
- @samp{gunzip -c %s | tar xvf -}.
- @item gnus-soup-packet-directory
- @vindex gnus-soup-packet-directory
- Where Gnus will look for reply packets. The default is @file{~/}.
- @item gnus-soup-packet-regexp
- @vindex gnus-soup-packet-regexp
- Regular expression matching @sc{soup} reply packets in
- @code{gnus-soup-packet-directory}.
- @end table
- @node SOUP Groups
- @subsubsection @sc{soup} Groups
- @cindex nnsoup
- @code{nnsoup} is the back end for reading @sc{soup} packets. It will
- read incoming packets, unpack them, and put them in a directory where
- you can read them at leisure.
- These are the variables you can use to customize its behavior:
- @table @code
- @item nnsoup-tmp-directory
- @vindex nnsoup-tmp-directory
- When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
- directory. (@file{/tmp/} by default.)
- @item nnsoup-directory
- @vindex nnsoup-directory
- @code{nnsoup} then moves each message and index file to this directory.
- The default is @file{~/SOUP/}.
- @item nnsoup-replies-directory
- @vindex nnsoup-replies-directory
- All replies will be stored in this directory before being packed into a
- reply packet. The default is @file{~/SOUP/replies/"}.
- @item nnsoup-replies-format-type
- @vindex nnsoup-replies-format-type
- The @sc{soup} format of the replies packets. The default is @samp{?n}
- (rnews), and I don't think you should touch that variable. I probably
- shouldn't even have documented it. Drats! Too late!
- @item nnsoup-replies-index-type
- @vindex nnsoup-replies-index-type
- The index type of the replies packet. The default is @samp{?n}, which
- means ``none''. Don't fiddle with this one either!
- @item nnsoup-active-file
- @vindex nnsoup-active-file
- Where @code{nnsoup} stores lots of information. This is not an ``active
- file'' in the @code{nntp} sense; it's an Emacs Lisp file. If you lose
- this file or mess it up in any way, you're dead. The default is
- @file{~/SOUP/active}.
- @item nnsoup-packer
- @vindex nnsoup-packer
- Format string command for packing a reply @sc{soup} packet. The default
- is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}.
- @item nnsoup-unpacker
- @vindex nnsoup-unpacker
- Format string command for unpacking incoming @sc{soup} packets. The
- default is @samp{gunzip -c %s | tar xvf -}.
- @item nnsoup-packet-directory
- @vindex nnsoup-packet-directory
- Where @code{nnsoup} will look for incoming packets. The default is
- @file{~/}.
- @item nnsoup-packet-regexp
- @vindex nnsoup-packet-regexp
- Regular expression matching incoming @sc{soup} packets. The default is
- @samp{Soupout}.
- @item nnsoup-always-save
- @vindex nnsoup-always-save
- If non-@code{nil}, save the replies buffer after each posted message.
- @end table
- @node SOUP Replies
- @subsubsection SOUP Replies
- Just using @code{nnsoup} won't mean that your postings and mailings end
- up in @sc{soup} reply packets automagically. You have to work a bit
- more for that to happen.
- @findex nnsoup-set-variables
- The @code{nnsoup-set-variables} command will set the appropriate
- variables to ensure that all your followups and replies end up in the
- @sc{soup} system.
- In specific, this is what it does:
- @lisp
- (setq message-send-news-function 'nnsoup-request-post)
- (setq message-send-mail-function 'nnsoup-request-mail)
- @end lisp
- And that's it, really. If you only want news to go into the @sc{soup}
- system you just use the first line. If you only want mail to be
- @sc{soup}ed you use the second.
- @node Mail-To-News Gateways
- @subsection Mail-To-News Gateways
- @cindex mail-to-news gateways
- @cindex gateways
- If your local @code{nntp} server doesn't allow posting, for some reason
- or other, you can post using one of the numerous mail-to-news gateways.
- The @code{nngateway} back end provides the interface.
- Note that you can't read anything from this back end---it can only be
- used to post with.
- Server variables:
- @table @code
- @item nngateway-address
- @vindex nngateway-address
- This is the address of the mail-to-news gateway.
- @item nngateway-header-transformation
- @vindex nngateway-header-transformation
- News headers often have to be transformed in some odd way or other
- for the mail-to-news gateway to accept it. This variable says what
- transformation should be called, and defaults to
- @code{nngateway-simple-header-transformation}. The function is called
- narrowed to the headers to be transformed and with one parameter---the
- gateway address.
- This default function just inserts a new @code{To} header based on the
- @code{Newsgroups} header and the gateway address.
- For instance, an article with this @code{Newsgroups} header:
- @example
- Newsgroups: alt.religion.emacs
- @end example
- will get this @code{From} header inserted:
- @example
- To: alt-religion-emacs@@GATEWAY
- @end example
- The following pre-defined functions exist:
- @findex nngateway-simple-header-transformation
- @table @code
- @item nngateway-simple-header-transformation
- Creates a @code{To} header that looks like
- @var{newsgroup}@@@code{nngateway-address}.
- @findex nngateway-mail2news-header-transformation
- @item nngateway-mail2news-header-transformation
- Creates a @code{To} header that looks like
- @code{nngateway-address}.
- Here's an example:
- @lisp
- (setq gnus-post-method
- '(nngateway
- "mail2news@@replay.com"
- (nngateway-header-transformation
- nngateway-mail2news-header-transformation)))
- @end lisp
- @end table
- @end table
- So, to use this, simply say something like:
- @lisp
- (setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
- @end lisp
- @node IMAP
- @subsection @sc{imap}
- @cindex nnimap
- @cindex @sc{imap}
- @sc{imap} is a network protocol for reading mail (or news, or@dots{}),
- think of it as a modernized @sc{nntp}. Connecting to a @sc{imap}
- server is much similar to connecting to a news server, you just
- specify the network address of the server.
- @sc{imap} has two properties. First, @sc{imap} can do everything that
- POP can, it can hence be viewed as POP++. Secondly, @sc{imap} is a
- mail storage protocol, similar to @sc{nntp} being a news storage
- protocol. (@sc{imap} offers more features than @sc{nntp} because news
- is more or less read-only whereas mail is read-write.)
- If you want to use @sc{imap} as POP++, use an imap entry in
- mail-sources. With this, Gnus will fetch mails from the @sc{imap}
- server and store them on the local disk. This is not the usage
- described in this section. @xref{Mail Sources}.
- If you want to use @sc{imap} as a mail storage protocol, use an nnimap
- entry in gnus-secondary-select-methods. With this, Gnus will
- manipulate mails stored on the @sc{imap} server. This is the kind of
- usage explained in this section.
- A server configuration in @code{~/.gnus} with a few @sc{imap} servers
- might look something like this:
- @lisp
- (setq gnus-secondary-select-methods
- '((nnimap "simpleserver") ; no special configuration
- ; perhaps a ssh port forwarded server:
- (nnimap "dolk"
- (nnimap-address "localhost")
- (nnimap-server-port 1430))
- ; a UW server running on localhost
- (nnimap "barbar"
- (nnimap-server-port 143)
- (nnimap-address "localhost")
- (nnimap-list-pattern ("INBOX" "mail/*")))
- ; anonymous public cyrus server:
- (nnimap "cyrus.andrew.cmu.edu"
- (nnimap-authenticator anonymous)
- (nnimap-list-pattern "archive.*")
- (nnimap-stream network))
- ; a ssl server on a non-standard port:
- (nnimap "vic20"
- (nnimap-address "vic20.somewhere.com")
- (nnimap-server-port 9930)
- (nnimap-stream ssl))))
- @end lisp
- The following variables can be used to create a virtual @code{nnimap}
- server:
- @table @code
- @item nnimap-address
- @vindex nnimap-address
- The address of the remote @sc{imap} server. Defaults to the virtual
- server name if not specified.
- @item nnimap-server-port
- @vindex nnimap-server-port
- Port on server to contact. Defaults to port 143, or 993 for SSL.
- Note that this should be a integer, example server specification:
- @lisp
- (nnimap "mail.server.com"
- (nnimap-server-port 4711))
- @end lisp
- @item nnimap-list-pattern
- @vindex nnimap-list-pattern
- String or list of strings of mailboxes to limit available groups to.
- This is used when the server has very many mailboxes and you're only
- interested in a few -- some servers export your home directory via
- @sc{imap}, you'll probably want to limit the mailboxes to those in
- @file{~/Mail/*} then.
- The string can also be a cons of REFERENCE and the string as above, what
- REFERENCE is used for is server specific, but on the University of
- Washington server it's a directory that will be concatenated with the
- mailbox.
- Example server specification:
- @lisp
- (nnimap "mail.server.com"
- (nnimap-list-pattern ("INBOX" "Mail/*" "alt.sex.*"
- ("~friend/Mail/" . "list/*"))))
- @end lisp
- @item nnimap-stream
- @vindex nnimap-stream
- The type of stream used to connect to your server. By default, nnimap
- will detect and automatically use all of the below, with the exception
- of SSL. (SSL is being replaced by STARTTLS, which can be automatically
- detected, but it's not widely deployed yet).
- Example server specification:
- @lisp
- (nnimap "mail.server.com"
- (nnimap-stream ssl))
- @end lisp
- Please note that the value of @code{nnimap-stream} is a symbol!
- @itemize @bullet
- @item
- @dfn{gssapi:} Connect with GSSAPI (usually Kerberos 5). Requires the
- @command{imtest} program.
- @item
- @dfn{kerberos4:} Connect with Kerberos 4. Requires the
- @command{imtest} program.
- @item
- @dfn{starttls:} Connect via the STARTTLS extension (similar to
- SSL)@. Requires the library @file{starttls.el} and program
- @command{starttls}.
- @item
- @dfn{ssl:} Connect through SSL@. Requires OpenSSL (the
- program @command{openssl}) or SSLeay (@command{s_client}).
- @item
- @dfn{shell:} Use a shell command to start an @sc{imap} connection.
- @item
- @dfn{network:} Plain, TCP/IP network connection.
- @end itemize
- @vindex imap-kerberos4-program
- The @command{imtest} program is shipped with Cyrus IMAPD@. Nnimap supports
- both @command{imtest} version 1.5.x and version 1.6.x. The variable
- @code{imap-kerberos4-program} contains parameters to pass to the
- @command{imtest} program.
- @vindex imap-ssl-program
- For SSL connections, the OpenSSL program is available from
- @uref{http://www.openssl.org/}. OpenSSL was formerly known as SSLeay,
- and nnimap supports it too. However, the most recent versions of
- SSLeay, 0.9.x, are known to have serious bugs making it
- useless. Earlier versions, especially 0.8.x, of SSLeay are known to
- work. The variable @code{imap-ssl-program} contains parameters to pass
- to OpenSSL/SSLeay.
- @vindex imap-shell-program
- @vindex imap-shell-host
- For @sc{imap} connections using the @code{shell} stream, the variable
- @code{imap-shell-program} specifies what program to call.
- @item nnimap-authenticator
- @vindex nnimap-authenticator
- The authenticator used to connect to the server. By default, nnimap
- will use the most secure authenticator your server supports.
- Example server specification:
- @lisp
- (nnimap "mail.server.com"
- (nnimap-authenticator anonymous))
- @end lisp
- Please note that the value of @code{nnimap-authenticator} is a symbol!
- @itemize @bullet
- @item
- @dfn{gssapi:} GSSAPI (usually Kerberos 5) authentication. Requires the
- external program @command{imtest}.
- @item
- @dfn{kerberos4:} Kerberos authentication. Requires the external program
- @command{imtest}.
- @item
- @dfn{digest-md5:} Encrypted username/password via DIGEST-MD5@. Requires
- external library @command{digest-md5.el}.
- @item
- @dfn{cram-md5:} Encrypted username/password via CRAM-MD5.
- @item
- @dfn{login:} Plain-text username/password via LOGIN.
- @item
- @dfn{anonymous:} Login as `anonymous', supplying your email address as
- password.
- @end itemize
- @item nnimap-expunge-on-close
- @cindex Expunging
- @vindex nnimap-expunge-on-close
- Unlike Parmenides, the @sc{imap} designers decided that things that
- don't exist actually do exist. More specifically, @sc{imap} has
- the concept of marking articles @code{Deleted} which doesn't actually
- delete them, and this (marking them @code{Deleted}, that is) is what
- nnimap does when you delete a article in Gnus (with @kbd{G @key{DEL}} or
- similar).
- Since the articles aren't really removed when we mark them with the
- @code{Deleted} flag we'll need a way to actually delete them. Feel like
- running in circles yet?
- Traditionally, nnimap has removed all articles marked as @code{Deleted}
- when closing a mailbox but this is now configurable by this server
- variable.
- The possible options are:
- @table @code
- @item always
- The default behavior, delete all articles marked as "Deleted" when
- closing a mailbox.
- @item never
- Never actually delete articles. Currently there is no way of showing
- the articles marked for deletion in nnimap, but other @sc{imap} clients
- may allow you to do this. If you ever want to run the EXPUNGE command
- manually, @xref{Expunging mailboxes}.
- @item ask
- When closing mailboxes, nnimap will ask if you wish to expunge deleted
- articles or not.
- @end table
- @item nnimap-authinfo-file
- @vindex nnimap-authinfo-file
- A file containing credentials used to log in on servers. The format
- is (almost) the same as the @code{ftp} @file{~/.netrc} file. See
- `nntp-authinfo-file' for exact syntax.
- A file containing credentials used to log in on servers. The format is
- (almost) the same as the @code{ftp} @file{~/.netrc} file. See the
- variable @code{nntp-authinfo-file} for exact syntax; also see
- @xref{NNTP}.
- @end table
- @menu
- * Splitting in IMAP:: Splitting mail with nnimap.
- * Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.
- * Expunging mailboxes:: Equivalent of a "compress mailbox" button.
- @end menu
- @node Splitting in IMAP
- @subsubsection Splitting in @sc{imap}
- @cindex splitting imap mail
- Splitting is something Gnus users have loved and used for years, and now
- the rest of the world is catching up. Yeah, dream on; not many
- @sc{imap} servers have server side splitting and those that have splitting
- seem to use some non-standard protocol. This means that @sc{imap}
- support for Gnus has to do its own splitting.
- And it does.
- Here are the variables of interest:
- @table @code
- @item nnimap-split-crosspost
- @cindex splitting, crosspost
- @cindex crosspost
- @vindex nnimap-split-crosspost
- If non-nil, do crossposting if several split methods match the mail. If
- nil, the first match in @code{nnimap-split-rule} found will be used.
- Nnmail equivalent: @code{nnmail-crosspost}.
- @item nnimap-split-inbox
- @cindex splitting, inbox
- @cindex inbox
- @vindex nnimap-split-inbox
- A string or a list of strings that gives the name(s) of @sc{imap}
- mailboxes to split from. Defaults to @code{nil}, which means that
- splitting is disabled!
- @lisp
- (setq nnimap-split-inbox
- '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap"))
- @end lisp
- No nnmail equivalent.
- @item nnimap-split-rule
- @cindex Splitting, rules
- @vindex nnimap-split-rule
- New mail found in @code{nnimap-split-inbox} will be split according to
- this variable.
- This variable contains a list of lists, where the first element in the
- sublist gives the name of the @sc{imap} mailbox to move articles
- matching the regexp in the second element in the sublist. Got that?
- Neither did I, we need examples.
- @lisp
- (setq nnimap-split-rule
- '(("INBOX.nnimap"
- "^Sender: owner-nnimap@@vic20.globalcom.se")
- ("INBOX.junk" "^Subject:.*MAKE MONEY")
- ("INBOX.private" "")))
- @end lisp
- This will put all articles from the nnimap mailing list into mailbox
- INBOX.nnimap, all articles containing MAKE MONEY in the Subject: line
- into INBOX.spam and everything else in INBOX.private.
- The first string may contain @samp{\\@var{digit}} forms, like the ones used by
- replace-match to insert sub-expressions from the matched text. For
- instance:
- @lisp
- ("INBOX.lists.\\1" "^Sender: owner-\\([a-z-]+\\)@@")
- @end lisp
- The second element can also be a function. In that case, it will be
- called with the first element of the rule as the argument, in a buffer
- containing the headers of the article. It should return a non-nil value
- if it thinks that the mail belongs in that group.
- Nnmail users might recollect that the last regexp had to be empty to
- match all articles (like in the example above). This is not required in
- nnimap. Articles not matching any of the regexps will not be moved out
- of your inbox. (This might affect performance if you keep lots of
- unread articles in your inbox, since the splitting code would go over
- them every time you fetch new mail.)
- These rules are processed from the beginning of the alist toward the
- end. The first rule to make a match will `win', unless you have
- crossposting enabled. In that case, all matching rules will `win'.
- This variable can also have a function as its value, the function will
- be called with the headers narrowed and should return a group to where
- it thinks the article should be split. See @code{nnimap-split-fancy}.
- The splitting code tries to create mailboxes if it needs too.
- To allow for different split rules on different virtual servers, and
- even different split rules in different inboxes on the same server,
- the syntax of this variable has been extended along the lines of:
- @lisp
- (setq nnimap-split-rule
- '(("my1server" (".*" (("ding" "ding@@gnus.org")
- ("junk" "From:.*Simon")))
- ("my2server" ("INBOX" nnimap-split-fancy))
- ("my[34]server" (".*" (("private" "To:.*Simon")
- ("junk" my-junk-func)))))
- @end lisp
- The virtual server name is in fact a regexp, so that the same rules
- may apply to several servers. In the example, the servers
- @code{my3server} and @code{my4server} both use the same rules.
- Similarly, the inbox string is also a regexp. The actual splitting
- rules are as before, either a function, or a list with group/regexp or
- group/function elements.
- Nnmail equivalent: @code{nnmail-split-methods}.
- @item nnimap-split-predicate
- @cindex splitting
- @vindex nnimap-split-predicate
- Mail matching this predicate in @code{nnimap-split-inbox} will be
- split; it is a string and the default is @samp{UNSEEN UNDELETED}.
- This might be useful if you use another @sc{imap} client to read mail in
- your inbox but would like Gnus to split all articles in the inbox
- regardless of readedness. Then you might change this to
- @samp{UNDELETED}.
- @item nnimap-split-fancy
- @cindex splitting, fancy
- @findex nnimap-split-fancy
- @vindex nnimap-split-fancy
- It's possible to set @code{nnimap-split-rule} to
- @code{nnmail-split-fancy} if you want to use fancy
- splitting. @xref{Fancy Mail Splitting}.
- However, to be able to have different fancy split rules for nnmail and
- nnimap back ends you can set @code{nnimap-split-rule} to
- @code{nnimap-split-fancy} and define the nnimap specific fancy split
- rule in @code{nnimap-split-fancy}.
- Example:
- @lisp
- (setq nnimap-split-rule 'nnimap-split-fancy
- nnimap-split-fancy ...)
- @end lisp
- Nnmail equivalent: @code{nnmail-split-fancy}.
- @end table
- @node Editing IMAP ACLs
- @subsubsection Editing @sc{imap} ACLs
- @cindex editing imap acls
- @cindex Access Control Lists
- @cindex Editing @sc{imap} ACLs
- @kindex G l
- @findex gnus-group-nnimap-edit-acl
- ACL stands for Access Control List. ACLs are used in @sc{imap} for
- limiting (or enabling) other users access to your mail boxes. Not all
- @sc{imap} servers support this, this function will give an error if it
- doesn't.
- To edit a ACL for a mailbox, type @kbd{G l}
- (@code{gnus-group-edit-nnimap-acl}) and you'll be presented with a ACL
- editing window with detailed instructions.
- Some possible uses:
- @itemize @bullet
- @item
- Giving "anyone" the "lrs" rights (lookup, read, keep seen/unseen flags)
- on your mailing list mailboxes enables other users on the same server to
- follow the list without subscribing to it.
- @item
- At least with the Cyrus server, you are required to give the user
- "anyone" posting ("p") capabilities to have "plussing" work (that is,
- mail sent to user+mailbox@@domain ending up in the @sc{imap} mailbox
- INBOX.mailbox).
- @end itemize
- @node Expunging mailboxes
- @subsubsection Expunging mailboxes
- @cindex expunging
- @cindex Expunge
- @cindex Manual expunging
- @kindex G x
- @findex gnus-group-nnimap-expunge
- If you're using the @code{never} setting of @code{nnimap-expunge-close},
- you may want the option of expunging all deleted articles in a mailbox
- manually. This is exactly what @kbd{G x} does.
- Currently there is no way of showing deleted articles, you can just
- delete them.
- @node Combined Groups
- @section Combined Groups
- Gnus allows combining a mixture of all the other group types into bigger
- groups.
- @menu
- * Virtual Groups:: Combining articles from many groups.
- * Kibozed Groups:: Looking through parts of the newsfeed for articles.
- @end menu
- @node Virtual Groups
- @subsection Virtual Groups
- @cindex nnvirtual
- @cindex virtual groups
- @cindex merging groups
- An @dfn{nnvirtual group} is really nothing more than a collection of
- other groups.
- For instance, if you are tired of reading many small groups, you can
- put them all in one big group, and then grow tired of reading one
- big, unwieldy group. The joys of computing!
- You specify @code{nnvirtual} as the method. The address should be a
- regexp to match component groups.
- All marks in the virtual group will stick to the articles in the
- component groups. So if you tick an article in a virtual group, the
- article will also be ticked in the component group from whence it came.
- (And vice versa---marks from the component groups will also be shown in
- the virtual group.)
- Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
- newsgroups into one, big, happy newsgroup:
- @lisp
- (nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
- @end lisp
- The component groups can be native or foreign; everything should work
- smoothly, but if your computer explodes, it was probably my fault.
- Collecting the same group from several servers might actually be a good
- idea if users have set the Distribution header to limit distribution.
- If you would like to read @samp{soc.motss} both from a server in Japan
- and a server in Norway, you could use the following as the group regexp:
- @example
- "^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$"
- @end example
- (Remember, though, that if you're creating the group with @kbd{G m}, you
- shouldn't double the backslashes, and you should leave off the quote
- characters at the beginning and the end of the string.)
- This should work kinda smoothly---all articles from both groups should
- end up in this one, and there should be no duplicates. Threading (and
- the rest) will still work as usual, but there might be problems with the
- sequence of articles. Sorting on date might be an option here
- (@pxref{Selecting a Group}).
- One limitation, however---all groups included in a virtual
- group have to be alive (i.e., subscribed or unsubscribed). Killed or
- zombie groups can't be component groups for @code{nnvirtual} groups.
- @vindex nnvirtual-always-rescan
- If the @code{nnvirtual-always-rescan} is non-@code{nil},
- @code{nnvirtual} will always scan groups for unread articles when
- entering a virtual group. If this variable is @code{nil} (which is the
- default) and you read articles in a component group after the virtual
- group has been activated, the read articles from the component group
- will show up when you enter the virtual group. You'll also see this
- effect if you have two virtual groups that have a component group in
- common. If that's the case, you should set this variable to @code{t}.
- Or you can just tap @code{M-g} on the virtual group every time before
- you enter it---it'll have much the same effect.
- @code{nnvirtual} can have both mail and news groups as component groups.
- When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
- has to ask the back end of the component group the article comes from
- whether it is a news or mail back end. However, when you do a @kbd{^},
- there is typically no sure way for the component back end to know this,
- and in that case @code{nnvirtual} tells Gnus that the article came from a
- not-news back end. (Just to be on the safe side.)
- @kbd{C-c C-t} in the message buffer will insert the @code{Newsgroups}
- line from the article you respond to in these cases.
- @node Kibozed Groups
- @subsection Kibozed Groups
- @cindex nnkiboze
- @cindex kibozing
- @dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of)
- the news feed''. @code{nnkiboze} is a back end that will do this for
- you. Oh joy! Now you can grind any @sc{nntp} server down to a halt
- with useless requests! Oh happiness!
- @kindex G k @r{(Group)}
- To create a kibozed group, use the @kbd{G k} command in the group
- buffer.
- The address field of the @code{nnkiboze} method is, as with
- @code{nnvirtual}, a regexp to match groups to be ``included'' in the
- @code{nnkiboze} group. That's where most similarities between @code{nnkiboze}
- and @code{nnvirtual} end.
- In addition to this regexp detailing component groups, an @code{nnkiboze} group
- must have a score file to say what articles are to be included in
- the group (@pxref{Scoring}).
- @kindex M-x nnkiboze-generate-groups
- @findex nnkiboze-generate-groups
- You must run @kbd{M-x nnkiboze-generate-groups} after creating the
- @code{nnkiboze} groups you want to have. This command will take time. Lots of
- time. Oodles and oodles of time. Gnus has to fetch the headers from
- all the articles in all the component groups and run them through the
- scoring process to determine if there are any articles in the groups
- that are to be part of the @code{nnkiboze} groups.
- Please limit the number of component groups by using restrictive
- regexps. Otherwise your sysadmin may become annoyed with you, and the
- @sc{nntp} site may throw you off and never let you back in again.
- Stranger things have happened.
- @code{nnkiboze} component groups do not have to be alive---they can be dead,
- and they can be foreign. No restrictions.
- @vindex nnkiboze-directory
- The generation of an @code{nnkiboze} group means writing two files in
- @code{nnkiboze-directory}, which is @file{~/News/} by default. One
- contains the @sc{nov} header lines for all the articles in the group,
- and the other is an additional @file{.newsrc} file to store information
- on what groups have been searched through to find component articles.
- Articles marked as read in the @code{nnkiboze} group will have
- their @sc{nov} lines removed from the @sc{nov} file.
- @node Gnus Unplugged
- @section Gnus Unplugged
- @cindex offline
- @cindex unplugged
- @cindex Agent
- @cindex Gnus Agent
- @cindex Gnus Unplugged
- In olden times (ca. February '88), people used to run their newsreaders
- on big machines with permanent connections to the net. News transport
- was dealt with by news servers, and all the newsreaders had to do was to
- read news. Believe it or not.
- Nowadays most people read news and mail at home, and use some sort of
- modem to connect to the net. To avoid running up huge phone bills, it
- would be nice to have a way to slurp down all the news and mail, hang up
- the phone, read for several hours, and then upload any responses you
- have to make. And then you repeat the procedure.
- Of course, you can use news servers for doing this as well. I've used
- @code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}
- for some years, but doing that's a bore. Moving the news server
- functionality up to the newsreader makes sense if you're the only person
- reading news on a machine.
- Using Gnus as an ``offline'' newsreader is quite simple.
- @itemize @bullet
- @item
- First, set up Gnus as you would do if you were running it on a machine
- that has full connection to the net. Go ahead. I'll still be waiting
- here.
- @item
- Then, put the following magical incantation at the end of your
- @file{.gnus.el} file:
- @lisp
- (gnus-agentize)
- @end lisp
- @end itemize
- That's it. Gnus is now an ``offline'' newsreader.
- Of course, to use it as such, you have to learn a few new commands.
- @menu
- * Agent Basics:: How it all is supposed to work.
- * Agent Categories:: How to tell the Gnus Agent what to download.
- * Agent Commands:: New commands for all the buffers.
- * Agent Expiry:: How to make old articles go away.
- * Agent and IMAP:: How to use the Agent with IMAP.
- * Outgoing Messages:: What happens when you post/mail something?
- * Agent Variables:: Customizing is fun.
- * Example Setup:: An example @file{.gnus.el} file for offline people.
- * Batching Agents:: How to fetch news from a @code{cron} job.
- * Agent Caveats:: What you think it'll do and what it does.
- @end menu
- @node Agent Basics
- @subsection Agent Basics
- First, let's get some terminology out of the way.
- The Gnus Agent is said to be @dfn{unplugged} when you have severed the
- connection to the net (and notified the Agent that this is the case).
- When the connection to the net is up again (and Gnus knows this), the
- Agent is @dfn{plugged}.
- The @dfn{local} machine is the one you're running on, and which isn't
- connected to the net continuously.
- @dfn{Downloading} means fetching things from the net to your local
- machine. @dfn{Uploading} is doing the opposite.
- Let's take a typical Gnus session using the Agent.
- @itemize @bullet
- @item
- You start Gnus with @code{gnus-unplugged}. This brings up the Gnus
- Agent in a disconnected state. You can read all the news that you have
- already fetched while in this mode.
- @item
- You then decide to see whether any new news has arrived. You connect
- your machine to the net (using PPP or whatever), and then hit @kbd{J j}
- to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mail
- as usual. To check for new mail in unplugged mode, see (@pxref{Mail
- Source Specifiers}).
- @item
- You can then read the new news immediately, or you can download the news
- onto your local machine. If you want to do the latter, you press @kbd{g}
- to check if there are any new news and then @kbd{J
- s} to fetch all the eligible articles in all the groups. (To let Gnus
- know which articles you want to download, @pxref{Agent Categories}.)
- @item
- After fetching the articles, you press @kbd{J j} to make Gnus become
- unplugged again, and you shut down the PPP thing (or whatever). And
- then you read the news offline.
- @item
- And then you go to step 2.
- @end itemize
- Here are some things you should do the first time (or so) that you use
- the Agent.
- @itemize @bullet
- @item
- Decide which servers should be covered by the Agent. If you have a mail
- back end, it would probably be nonsensical to have it covered by the
- Agent. Go to the server buffer (@kbd{^} in the group buffer) and press
- @kbd{J a} the server (or servers) that you wish to have covered by the
- Agent (@pxref{Server Agent Commands}). This will typically be only the
- primary select method, which is listed on the bottom in the buffer.
- @item
- Decide on download policy. @xref{Agent Categories}.
- @item
- Uhm... that's it.
- @end itemize
- @node Agent Categories
- @subsection Agent Categories
- One of the main reasons to integrate the news transport layer into the
- newsreader is to allow greater control over what articles to download.
- There's not much point in downloading huge amounts of articles, just to
- find out that you're not interested in reading any of them. It's better
- to be somewhat more conservative in choosing what to download, and then
- mark the articles for downloading manually if it should turn out that
- you're interested in the articles anyway.
- The main way to control what is to be downloaded is to create a
- @dfn{category} and then assign some (or all) groups to this category.
- Groups that do not belong in any other category belong to the
- @code{default} category. Gnus has its own buffer for creating and
- managing categories.
- @menu
- * Category Syntax:: What a category looks like.
- * The Category Buffer:: A buffer for maintaining categories.
- * Category Variables:: Customize'r'Us.
- @end menu
- @node Category Syntax
- @subsubsection Category Syntax
- A category consists of two things.
- @enumerate
- @item
- A predicate which (generally) gives a rough outline of which articles
- are eligible for downloading; and
- @item
- a score rule which (generally) gives you a finer granularity when
- deciding what articles to download. (Note that this @dfn{download
- score} is not necessarily related to normal scores.)
- @end enumerate
- A predicate in its simplest form can be a single predicate such as
- @code{true} or @code{false}. These two will download every available
- article or nothing respectively. In the case of these two special
- predicates an additional score rule is superfluous.
- Predicates of @code{high} or @code{low} download articles in respect of
- their scores in relationship to @code{gnus-agent-high-score} and
- @code{gnus-agent-low-score} as described below.
- To gain even finer control of what is to be regarded eligible for
- download a predicate can consist of a number of predicates with logical
- operators sprinkled in between.
- Perhaps some examples are in order.
- Here's a simple predicate. (It's the default predicate, in fact, used
- for all groups that don't belong to any other category.)
- @lisp
- short
- @end lisp
- Quite simple, eh? This predicate is true if and only if the article is
- short (for some value of ``short'').
- Here's a more complex predicate:
- @lisp
- (or high
- (and
- (not low)
- (not long)))
- @end lisp
- This means that an article should be downloaded if it has a high score,
- or if the score is not low and the article is not long. You get the
- drift.
- The available logical operators are @code{or}, @code{and} and
- @code{not}. (If you prefer, you can use the more ``C''-ish operators
- @samp{|}, @code{&} and @code{!} instead.)
- The following predicates are pre-defined, but if none of these fit what
- you want to do, you can write your own.
- @table @code
- @item short
- True iff the article is shorter than @code{gnus-agent-short-article}
- lines; default 100.
- @item long
- True iff the article is longer than @code{gnus-agent-long-article}
- lines; default 200.
- @item low
- True iff the article has a download score less than
- @code{gnus-agent-low-score}; default 0.
- @item high
- True iff the article has a download score greater than
- @code{gnus-agent-high-score}; default 0.
- @item spam
- True iff the Gnus Agent guesses that the article is spam. The
- heuristics may change over time, but at present it just computes a
- checksum and sees whether articles match.
- @item true
- Always true.
- @item false
- Always false.
- @end table
- If you want to create your own predicate function, here's what you have
- to know: The functions are called with no parameters, but the
- @code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
- useful values.
- For example, you could decide that you don't want to download articles
- that were posted more than a certain number of days ago (e.g. posted
- more than @code{gnus-agent-expire-days} ago) you might write a function
- something along the lines of the following:
- @lisp
- (defun my-article-old-p ()
- "Say whether an article is old."
- (< (time-to-days (date-to-time (mail-header-date gnus-headers)))
- (- (time-to-days (current-time)) gnus-agent-expire-days)))
- @end lisp
- with the predicate then defined as:
- @lisp
- (not my-article-old-p)
- @end lisp
- or you could append your predicate to the predefined
- @code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
- wherever. (Note: this would have to be at a point *after*
- @code{gnus-agent} has been loaded via @code{(gnus-agentize)})
- @lisp
- (setq gnus-category-predicate-alist
- (append gnus-category-predicate-alist
- '((old . my-article-old-p))))
- @end lisp
- and simply specify your predicate as:
- @lisp
- (not old)
- @end lisp
- If/when using something like the above, be aware that there are many
- misconfigured systems/mailers out there and so an article's date is not
- always a reliable indication of when it was posted. Hell, some people
- just don't give a damn.
- The above predicates apply to *all* the groups which belong to the
- category. However, if you wish to have a specific predicate for an
- individual group within a category, or you're just too lazy to set up a
- new category, you can enter a group's individual predicate in it's group
- parameters like so:
- @lisp
- (agent-predicate . short)
- @end lisp
- This is the group parameter equivalent of the agent category default.
- Note that when specifying a single word predicate like this, the
- @code{agent-predicate} specification must be in dotted pair notation.
- The equivalent of the longer example from above would be:
- @lisp
- (agent-predicate or high (and (not low) (not long)))
- @end lisp
- The outer parenthesis required in the category specification are not
- entered here as, not being in dotted pair notation, the value of the
- predicate is assumed to be a list.
- Now, the syntax of the download score is the same as the syntax of
- normal score files, except that all elements that require actually
- seeing the article itself are verboten. This means that only the
- following headers can be scored on: @code{Subject}, @code{From},
- @code{Date}, @code{Message-ID}, @code{References}, @code{Chars},
- @code{Lines}, and @code{Xref}.
- As with predicates, the specification of the @code{download score rule}
- to use in respect of a group can be in either the category definition if
- it's to be applicable to all groups in therein, or a group's parameters
- if it's to be specific to that group.
- In both of these places the @code{download score rule} can take one of
- three forms:
- @enumerate
- @item
- Score rule
- This has the same syntax as a normal gnus score file except only a
- subset of scoring keywords are available as mentioned above.
- example:
- @itemize @bullet
- @item
- Category specification
- @lisp
- (("from"
- ("Lars Ingebrigtsen" 1000000 nil s))
- ("lines"
- (500 -100 nil <)))
- @end lisp
- @item
- Group Parameter specification
- @lisp
- (agent-score ("from"
- ("Lars Ingebrigtsen" 1000000 nil s))
- ("lines"
- (500 -100 nil <)))
- @end lisp
- Again, note the omission of the outermost parenthesis here.
- @end itemize
- @item
- Agent score file
- These score files must *only* contain the permitted scoring keywords
- stated above.
- example:
- @itemize @bullet
- @item
- Category specification
- @lisp
- ("~/News/agent.SCORE")
- @end lisp
- or perhaps
- @lisp
- ("~/News/agent.SCORE" "~/News/agent.group.SCORE")
- @end lisp
- @item
- Group Parameter specification
- @lisp
- (agent-score "~/News/agent.SCORE")
- @end lisp
- Additional score files can be specified as above. Need I say anything
- about parenthesis?
- @end itemize
- @item
- Use @code{normal} score files
- If you don't want to maintain two sets of scoring rules for a group, and
- your desired @code{downloading} criteria for a group are the same as your
- @code{reading} criteria then you can tell the agent to refer to your
- @code{normal} score files when deciding what to download.
- These directives in either the category definition or a group's
- parameters will cause the agent to read in all the applicable score
- files for a group, *filtering out* those sections that do not
- relate to one of the permitted subset of scoring keywords.
- @itemize @bullet
- @item
- Category Specification
- @lisp
- file
- @end lisp
- @item
- Group Parameter specification
- @lisp
- (agent-score . file)
- @end lisp
- @end itemize
- @end enumerate
- @node The Category Buffer
- @subsubsection The Category Buffer
- You'd normally do all category maintenance from the category buffer.
- When you enter it for the first time (with the @kbd{J c} command from
- the group buffer), you'll only see the @code{default} category.
- The following commands are available in this buffer:
- @table @kbd
- @item q
- @kindex q (Category)
- @findex gnus-category-exit
- Return to the group buffer (@code{gnus-category-exit}).
- @item k
- @kindex k (Category)
- @findex gnus-category-kill
- Kill the current category (@code{gnus-category-kill}).
- @item c
- @kindex c (Category)
- @findex gnus-category-copy
- Copy the current category (@code{gnus-category-copy}).
- @item a
- @kindex a (Category)
- @findex gnus-category-add
- Add a new category (@code{gnus-category-add}).
- @item p
- @kindex p (Category)
- @findex gnus-category-edit-predicate
- Edit the predicate of the current category
- (@code{gnus-category-edit-predicate}).
- @item g
- @kindex g (Category)
- @findex gnus-category-edit-groups
- Edit the list of groups belonging to the current category
- (@code{gnus-category-edit-groups}).
- @item s
- @kindex s (Category)
- @findex gnus-category-edit-score
- Edit the download score rule of the current category
- (@code{gnus-category-edit-score}).
- @item l
- @kindex l (Category)
- @findex gnus-category-list
- List all the categories (@code{gnus-category-list}).
- @end table
- @node Category Variables
- @subsubsection Category Variables
- @table @code
- @item gnus-category-mode-hook
- @vindex gnus-category-mode-hook
- Hook run in category buffers.
- @item gnus-category-line-format
- @vindex gnus-category-line-format
- Format of the lines in the category buffer (@pxref{Formatting
- Variables}). Valid elements are:
- @table @samp
- @item c
- The name of the category.
- @item g
- The number of groups in the category.
- @end table
- @item gnus-category-mode-line-format
- @vindex gnus-category-mode-line-format
- Format of the category mode line (@pxref{Mode Line Formatting}).
- @item gnus-agent-short-article
- @vindex gnus-agent-short-article
- Articles that have fewer lines than this are short. Default 100.
- @item gnus-agent-long-article
- @vindex gnus-agent-long-article
- Articles that have more lines than this are long. Default 200.
- @item gnus-agent-low-score
- @vindex gnus-agent-low-score
- Articles that have a score lower than this have a low score. Default
- 0.
- @item gnus-agent-high-score
- @vindex gnus-agent-high-score
- Articles that have a score higher than this have a high score. Default
- 0.
- @end table
- @node Agent Commands
- @subsection Agent Commands
- All the Gnus Agent commands are on the @kbd{J} submap. The @kbd{J j}
- (@code{gnus-agent-toggle-plugged} command works in all modes, and
- toggles the plugged/unplugged state of the Gnus Agent.
- @menu
- * Group Agent Commands::
- * Summary Agent Commands::
- * Server Agent Commands::
- @end menu
- You can run a complete batch fetch from the command line with the
- following incantation:
- @cindex gnus-agent-batch-fetch
- @example
- $ emacs -batch -l ~/.gnus.el -f gnus-agent-batch-fetch
- @end example
- @node Group Agent Commands
- @subsubsection Group Agent Commands
- @table @kbd
- @item J u
- @kindex J u (Agent Group)
- @findex gnus-agent-fetch-groups
- Fetch all eligible articles in the current group
- (@code{gnus-agent-fetch-groups}).
- @item J c
- @kindex J c (Agent Group)
- @findex gnus-enter-category-buffer
- Enter the Agent category buffer (@code{gnus-enter-category-buffer}).
- @item J s
- @kindex J s (Agent Group)
- @findex gnus-agent-fetch-session
- Fetch all eligible articles in all groups
- (@code{gnus-agent-fetch-session}).
- @item J S
- @kindex J S (Agent Group)
- @findex gnus-group-send-drafts
- Send all sendable messages in the draft group
- (@code{gnus-group-send-drafts}). @xref{Drafts}.
- @item J a
- @kindex J a (Agent Group)
- @findex gnus-agent-add-group
- Add the current group to an Agent category
- (@code{gnus-agent-add-group}). This command understands the
- process/prefix convention (@pxref{Process/Prefix}).
- @item J r
- @kindex J r (Agent Group)
- @findex gnus-agent-remove-group
- Remove the current group from its category, if any
- (@code{gnus-agent-remove-group}). This command understands the
- process/prefix convention (@pxref{Process/Prefix}).
- @item J Y
- @kindex J Y (Agent Group)
- @findex gnus-agent-synchronize-flags
- Synchronize flags changed while unplugged with remote server, if any.
- @end table
- @node Summary Agent Commands
- @subsubsection Summary Agent Commands
- @table @kbd
- @item J #
- @kindex J # (Agent Summary)
- @findex gnus-agent-mark-article
- Mark the article for downloading (@code{gnus-agent-mark-article}).
- @item J M-#
- @kindex J M-# (Agent Summary)
- @findex gnus-agent-unmark-article
- Remove the downloading mark from the article
- (@code{gnus-agent-unmark-article}).
- @item @@
- @kindex @@ (Agent Summary)
- @findex gnus-agent-toggle-mark
- Toggle whether to download the article (@code{gnus-agent-toggle-mark}).
- @item J c
- @kindex J c (Agent Summary)
- @findex gnus-agent-catchup
- Mark all undownloaded articles as read (@code{gnus-agent-catchup}).
- @end table
- @node Server Agent Commands
- @subsubsection Server Agent Commands
- @table @kbd
- @item J a
- @kindex J a (Agent Server)
- @findex gnus-agent-add-server
- Add the current server to the list of servers covered by the Gnus Agent
- (@code{gnus-agent-add-server}).
- @item J r
- @kindex J r (Agent Server)
- @findex gnus-agent-remove-server
- Remove the current server from the list of servers covered by the Gnus
- Agent (@code{gnus-agent-remove-server}).
- @end table
- @node Agent Expiry
- @subsection Agent Expiry
- @vindex gnus-agent-expire-days
- @findex gnus-agent-expire
- @kindex M-x gnus-agent-expire
- @cindex Agent expiry
- @cindex Gnus Agent expiry
- @cindex expiry
- @code{nnagent} doesn't handle expiry. Instead, there's a special
- @code{gnus-agent-expire} command that will expire all read articles that
- are older than @code{gnus-agent-expire-days} days. It can be run
- whenever you feel that you're running out of space. It's not
- particularly fast or efficient, and it's not a particularly good idea to
- interrupt it (with @kbd{C-g} or anything else) once you've started it.
- @vindex gnus-agent-expire-all
- if @code{gnus-agent-expire-all} is non-@code{nil}, this command will
- expire all articles---unread, read, ticked and dormant. If @code{nil}
- (which is the default), only read articles are eligible for expiry, and
- unread, ticked and dormant articles will be kept indefinitely.
- @node Agent and IMAP
- @subsection Agent and IMAP
- The Agent work with any Gnus back end, including nnimap. However,
- since there are some conceptual differences between @sc{nntp} and
- @sc{imap}, this section (should) provide you with some information to
- make Gnus Agent work smoother as a @sc{imap} Disconnected Mode client.
- The first thing to keep in mind is that all flags (read, ticked, etc)
- are kept on the @sc{imap} server, rather than in @file{.newsrc} as is the
- case for nntp. Thus Gnus need to remember flag changes when
- disconnected, and synchronize these flags when you plug back in.
- Gnus keep track of flag changes when reading nnimap groups under the
- Agent by default. When you plug back in, by default Gnus will check if
- you have any changed any flags and ask if you wish to synchronize these
- with the server. This behavior is customizable with
- @code{gnus-agent-synchronize-flags}.
- @vindex gnus-agent-synchronize-flags
- If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
- never automatically synchronize flags. If it is @code{ask}, the
- default, the Agent will check if you made any changes and if so ask if
- you wish to synchronize these when you re-connect. If it has any other
- value, all flags will be synchronized automatically.
- If you do not wish to automatically synchronize flags when you
- re-connect, this can be done manually with the
- @code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}
- in the group buffer by default.
- Some things are currently not implemented in the Agent that you'd might
- expect from a disconnected @sc{imap} client, including:
- @itemize @bullet
- @item
- Copying/moving articles into nnimap groups when unplugged.
- @item
- Creating/deleting nnimap groups when unplugged.
- @end itemize
- Technical note: the synchronization algorithm does not work by "pushing"
- all local flags to the server, but rather incrementally update the
- server view of flags by changing only those flags that were changed by
- the user. Thus, if you set one flag on a article, quit the group and
- re-select the group and remove the flag; the flag will be set and
- removed from the server when you "synchronize". The queued flag
- operations can be found in the per-server @code{flags} file in the Agent
- directory. It's emptied when you synchronize flags.
- @node Outgoing Messages
- @subsection Outgoing Messages
- When Gnus is unplugged, all outgoing messages (both mail and news) are
- stored in the draft groups (@pxref{Drafts}). You can view them there
- after posting, and edit them at will.
- When Gnus is plugged again, you can send the messages either from the
- draft group with the special commands available there, or you can use
- the @kbd{J S} command in the group buffer to send all the sendable
- messages in the draft group.
- @node Agent Variables
- @subsection Agent Variables
- @table @code
- @item gnus-agent-directory
- @vindex gnus-agent-directory
- Where the Gnus Agent will store its files. The default is
- @file{~/News/agent/}.
- @item gnus-agent-handle-level
- @vindex gnus-agent-handle-level
- Groups on levels (@pxref{Group Levels}) higher than this variable will
- be ignored by the Agent. The default is @code{gnus-level-subscribed},
- which means that only subscribed group will be considered by the Agent
- by default.
- @item gnus-agent-plugged-hook
- @vindex gnus-agent-plugged-hook
- Hook run when connecting to the network.
- @item gnus-agent-unplugged-hook
- @vindex gnus-agent-unplugged-hook
- Hook run when disconnecting from the network.
- @end table
- @node Example Setup
- @subsection Example Setup
- If you don't want to read this manual, and you have a fairly standard
- setup, you may be able to use something like the following as your
- @file{.gnus.el} file to get started.
- @lisp
- ;;; Define how Gnus is to fetch news. We do this over @sc{nntp}
- ;;; from your ISP's server.
- (setq gnus-select-method '(nntp "news.your-isp.com"))
- ;;; Define how Gnus is to read your mail. We read mail from
- ;;; your ISP's POP server.
- (setq mail-sources '((pop :server "pop.your-isp.com")))
- ;;; Say how Gnus is to store the mail. We use nnml groups.
- (setq gnus-secondary-select-methods '((nnml "")))
- ;;; Make Gnus into an offline newsreader.
- (gnus-agentize)
- @end lisp
- That should be it, basically. Put that in your @file{~/.gnus.el} file,
- edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
- gnus}.
- If this is the first time you've run Gnus, you will be subscribed
- automatically to a few default newsgroups. You'll probably want to
- subscribe to more groups, and to do that, you have to query the
- @sc{nntp} server for a complete list of groups with the @kbd{A A}
- command. This usually takes quite a while, but you only have to do it
- once.
- After reading and parsing a while, you'll be presented with a list of
- groups. Subscribe to the ones you want to read with the @kbd{u}
- command. @kbd{l} to make all the killed groups disappear after you've
- subscribe to all the groups you want to read. (@kbd{A k} will bring
- back all the killed groups.)
- You can now read the groups at once, or you can download the articles
- with the @kbd{J s} command. And then read the rest of this manual to
- find out which of the other gazillion things you want to customize.
- @node Batching Agents
- @subsection Batching Agents
- Having the Gnus Agent fetch articles (and post whatever messages you've
- written) is quite easy once you've gotten things set up properly. The
- following shell script will do everything that is necessary:
- @example
- #!/bin/sh
- emacs -batch -l ~/.emacs -f gnus-agent-batch >/dev/null
- @end example
- @node Agent Caveats
- @subsection Agent Caveats
- The Gnus Agent doesn't seem to work like most other offline
- newsreaders. Here are some common questions that some imaginary people
- may ask:
- @table @dfn
- @item If I read an article while plugged, do they get entered into the
- Agent?
- @strong{No.}
- @item If I read an article while plugged, and the article already exists
- in the Agent, will it get downloaded once more?
- @strong{Yes.}
- @end table
- In short, when Gnus is unplugged, it only looks into the locally stored
- articles; when it's plugged, it only talks to your ISP.
- @node Scoring
- @chapter Scoring
- @cindex scoring
- Other people use @dfn{kill files}, but we here at Gnus Towers like
- scoring better than killing, so we'd rather switch than fight. They do
- something completely different as well, so sit up straight and pay
- attention!
- @vindex gnus-summary-mark-below
- All articles have a default score (@code{gnus-summary-default-score}),
- which is 0 by default. This score may be raised or lowered either
- interactively or by score files. Articles that have a score lower than
- @code{gnus-summary-mark-below} are marked as read.
- Gnus will read any @dfn{score files} that apply to the current group
- before generating the summary buffer.
- There are several commands in the summary buffer that insert score
- entries based on the current article. You can, for instance, ask Gnus to
- lower or increase the score of all articles with a certain subject.
- There are two sorts of scoring entries: Permanent and temporary.
- Temporary score entries are self-expiring entries. Any entries that are
- temporary and have not been used for, say, a week, will be removed
- silently to help keep the sizes of the score files down.
- @menu
- * Summary Score Commands:: Adding score entries for the current group.
- * Group Score Commands:: General score commands.
- * Score Variables:: Customize your scoring. (My, what terminology).
- * Score File Format:: What a score file may contain.
- * Score File Editing:: You can edit score files by hand as well.
- * Adaptive Scoring:: Big Sister Gnus knows what you read.
- * Home Score File:: How to say where new score entries are to go.
- * Followups To Yourself:: Having Gnus notice when people answer you.
- * Scoring Tips:: How to score effectively.
- * Reverse Scoring:: That problem child of old is not problem.
- * Global Score Files:: Earth-spanning, ear-splitting score files.
- * Kill Files:: They are still here, but they can be ignored.
- * Converting Kill Files:: Translating kill files to score files.
- * GroupLens:: Getting predictions on what you like to read.
- * Advanced Scoring:: Using logical expressions to build score rules.
- * Score Decays:: It can be useful to let scores wither away.
- @end menu
- @node Summary Score Commands
- @section Summary Score Commands
- @cindex score commands
- The score commands that alter score entries do not actually modify real
- score files. That would be too inefficient. Gnus maintains a cache of
- previously loaded score files, one of which is considered the
- @dfn{current score file alist}. The score commands simply insert
- entries into this list, and upon group exit, this list is saved.
- The current score file is by default the group's local score file, even
- if no such score file actually exists. To insert score commands into
- some other score file (e.g. @file{all.SCORE}), you must first make this
- score file the current one.
- General score commands that don't actually change the score file:
- @table @kbd
- @item V s
- @kindex V s @r{(Summary)}
- @findex gnus-summary-set-score
- Set the score of the current article (@code{gnus-summary-set-score}).
- @item V S
- @kindex V S @r{(Summary)}
- @findex gnus-summary-current-score
- Display the score of the current article
- (@code{gnus-summary-current-score}).
- @item V t
- @kindex V t @r{(Summary)}
- @findex gnus-score-find-trace
- Display all score rules that have been used on the current article
- (@code{gnus-score-find-trace}).
- @item V R
- @kindex V R @r{(Summary)}
- @findex gnus-summary-rescore
- Run the current summary through the scoring process
- (@code{gnus-summary-rescore}). This might be useful if you're playing
- around with your score files behind Gnus' back and want to see the
- effect you're having.
- @item V c
- @kindex V c @r{(Summary)}
- @findex gnus-score-change-score-file
- Make a different score file the current
- (@code{gnus-score-change-score-file}).
- @item V e
- @kindex V e @r{(Summary)}
- @findex gnus-score-edit-current-scores
- Edit the current score file (@code{gnus-score-edit-current-scores}).
- You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
- File Editing}).
- @item V f
- @kindex V f @r{(Summary)}
- @findex gnus-score-edit-file
- Edit a score file and make this score file the current one
- (@code{gnus-score-edit-file}).
- @item V F
- @kindex V F @r{(Summary)}
- @findex gnus-score-flush-cache
- Flush the score cache (@code{gnus-score-flush-cache}). This is useful
- after editing score files.
- @item V C
- @kindex V C @r{(Summary)}
- @findex gnus-score-customize
- Customize a score file in a visually pleasing manner
- (@code{gnus-score-customize}).
- @end table
- The rest of these commands modify the local score file.
- @table @kbd
- @item V m
- @kindex V m @r{(Summary)}
- @findex gnus-score-set-mark-below
- Prompt for a score, and mark all articles with a score below this as
- read (@code{gnus-score-set-mark-below}).
- @item V x
- @kindex V x @r{(Summary)}
- @findex gnus-score-set-expunge-below
- Prompt for a score, and add a score rule to the current score file to
- expunge all articles below this score
- (@code{gnus-score-set-expunge-below}).
- @end table
- The keystrokes for actually making score entries follow a very regular
- pattern, so there's no need to list all the commands. (Hundreds of
- them.)
- @findex gnus-summary-increase-score
- @findex gnus-summary-lower-score
- @enumerate
- @item
- The first key is either @kbd{I} (upper case i) for increasing the score
- or @kbd{L} for lowering the score.
- @item
- The second key says what header you want to score on. The following
- keys are available:
- @table @kbd
- @item a
- Score on the author name.
- @item s
- Score on the subject line.
- @item x
- Score on the @code{Xref} line---i.e., the cross-posting line.
- @item r
- Score on the @code{References} line.
- @item d
- Score on the date.
- @item l
- Score on the number of lines.
- @item i
- Score on the @code{Message-ID} header.
- @item f
- Score on followups---this matches the author name, and adds scores to
- the followups to this author.
- @item b
- Score on the body.
- @item h
- Score on the head.
- @item t
- Score on thread.
- @end table
- @item
- The third key is the match type. Which match types are valid depends on
- what headers you are scoring on.
- @table @code
- @item strings
- @table @kbd
- @item e
- Exact matching.
- @item s
- Substring matching.
- @item f
- Fuzzy matching (@pxref{Fuzzy Matching}).
- @item r
- Regexp matching
- @end table
- @item date
- @table @kbd
- @item b
- Before date.
- @item a
- After date.
- @item n
- This date.
- @end table
- @item number
- @table @kbd
- @item <
- Less than number.
- @item =
- Equal to number.
- @item >
- Greater than number.
- @end table
- @end table
- @item
- The fourth and final key says whether this is a temporary (i.e., expiring)
- score entry, or a permanent (i.e., non-expiring) score entry, or whether
- it is to be done immediately, without adding to the score file.
- @table @kbd
- @item t
- Temporary score entry.
- @item p
- Permanent score entry.
- @item i
- Immediately scoring.
- @end table
- @end enumerate
- So, let's say you want to increase the score on the current author with
- exact matching permanently: @kbd{I a e p}. If you want to lower the
- score based on the subject line, using substring matching, and make a
- temporary score entry: @kbd{L s s t}. Pretty easy.
- To make things a bit more complicated, there are shortcuts. If you use
- a capital letter on either the second or third keys, Gnus will use
- defaults for the remaining one or two keystrokes. The defaults are
- ``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a s
- t}, and @kbd{I a R} is the same as @kbd{I a r t}.
- These functions take both the numerical prefix and the symbolic prefix
- (@pxref{Symbolic Prefixes}). A numerical prefix says how much to lower
- (or increase) the score of the article. A symbolic prefix of @code{a}
- says to use the @file{all.SCORE} file for the command instead of the
- current score file.
- @vindex gnus-score-mimic-keymap
- The @code{gnus-score-mimic-keymap} says whether these commands will
- pretend they are keymaps or not.
- @node Group Score Commands
- @section Group Score Commands
- @cindex group score commands
- There aren't many of these as yet, I'm afraid.
- @table @kbd
- @item W f
- @kindex W f @r{(Group)}
- @findex gnus-score-flush-cache
- Gnus maintains a cache of score alists to avoid having to reload them
- all the time. This command will flush the cache
- (@code{gnus-score-flush-cache}).
- @end table
- You can do scoring from the command line by saying something like:
- @findex gnus-batch-score
- @cindex batch scoring
- @example
- $ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score
- @end example
- @node Score Variables
- @section Score Variables
- @cindex score variables
- @table @code
- @item gnus-use-scoring
- @vindex gnus-use-scoring
- If @code{nil}, Gnus will not check for score files, and will not, in
- general, do any score-related work. This is @code{t} by default.
- @item gnus-kill-killed
- @vindex gnus-kill-killed
- If this variable is @code{nil}, Gnus will never apply score files to
- articles that have already been through the kill process. While this
- may save you lots of time, it also means that if you apply a kill file
- to a group, and then change the kill file and want to run it over you
- group again to kill more articles, it won't work. You have to set this
- variable to @code{t} to do that. (It is @code{t} by default.)
- @item gnus-kill-files-directory
- @vindex gnus-kill-files-directory
- All kill and score files will be stored in this directory, which is
- initialized from the @code{SAVEDIR} environment variable by default.
- This is @file{~/News/} by default.
- @item gnus-score-file-suffix
- @vindex gnus-score-file-suffix
- Suffix to add to the group name to arrive at the score file name
- (@samp{SCORE} by default.)
- @item gnus-score-uncacheable-files
- @vindex gnus-score-uncacheable-files
- @cindex score cache
- All score files are normally cached to avoid excessive re-loading of
- score files. However, if this might make your Emacs grow big and
- 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
- @file{all.SCORE}, while it might be a good idea to not cache
- @file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, this
- variable is @samp{ADAPT$} by default, so no adaptive score files will
- be cached.
- @item gnus-save-score
- @vindex gnus-save-score
- If you have really complicated score files, and do lots of batch
- scoring, then you might set this variable to @code{t}. This will make
- Gnus save the scores into the @file{.newsrc.eld} file.
- If you do not set this to @code{t}, then manual scores (like those set
- with @kbd{V s} (@code{gnus-summary-set-score})) will not be preserved
- across group visits.
- @item gnus-score-interactive-default-score
- @vindex gnus-score-interactive-default-score
- Score used by all the interactive raise/lower commands to raise/lower
- score with. Default is 1000, which may seem excessive, but this is to
- ensure that the adaptive scoring scheme gets enough room to play with.
- We don't want the small changes from the adaptive scoring to overwrite
- manually entered data.
- @item gnus-summary-default-score
- @vindex gnus-summary-default-score
- Default score of an article, which is 0 by default.
- @item gnus-summary-expunge-below
- @vindex gnus-summary-expunge-below
- Don't display the summary lines of articles that have scores lower than
- this variable. This is @code{nil} by default, which means that no
- articles will be hidden. This variable is local to the summary buffers,
- and has to be set from @code{gnus-summary-mode-hook}.
- @item gnus-score-over-mark
- @vindex gnus-score-over-mark
- Mark (in the third column) used for articles with a score over the
- default. Default is @samp{+}.
- @item gnus-score-below-mark
- @vindex gnus-score-below-mark
- Mark (in the third column) used for articles with a score below the
- default. Default is @samp{-}.
- @item gnus-score-find-score-files-function
- @vindex gnus-score-find-score-files-function
- Function used to find score files for the current group. This function
- is called with the name of the group as the argument.
- Predefined functions available are:
- @table @code
- @item gnus-score-find-single
- @findex gnus-score-find-single
- Only apply the group's own score file.
- @item gnus-score-find-bnews
- @findex gnus-score-find-bnews
- Apply all score files that match, using bnews syntax. This is the
- default. If the current group is @samp{gnu.emacs.gnus}, for instance,
- @file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
- @file{gnu.all.SCORE} would all apply. In short, the instances of
- @samp{all} in the score file names are translated into @samp{.*}, and
- then a regexp match is done.
- This means that if you have some score entries that you want to apply to
- all groups, then you put those entries in the @file{all.SCORE} file.
- The score files are applied in a semi-random order, although Gnus will
- try to apply the more general score files before the more specific score
- files. It does this by looking at the number of elements in the score
- file names---discarding the @samp{all} elements.
- @item gnus-score-find-hierarchical
- @findex gnus-score-find-hierarchical
- Apply all score files from all the parent groups. This means that you
- can't have score files like @file{all.SCORE}, but you can have
- @file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for each
- server.
- @end table
- This variable can also be a list of functions. In that case, all these
- functions will be called with the group name as argument, and all the
- returned lists of score files will be applied. These functions can also
- return lists of score alists directly. In that case, the functions that
- return these non-file score alists should probably be placed before the
- ``real'' score file functions, to ensure that the last score file
- returned is the local score file. Phu.
- For example, to do hierarchical scoring but use a non-server-specific
- overall score file, you could use the value
- @example
- (list (lambda (group) ("all.SCORE"))
- 'gnus-score-find-hierarchical)
- @end example
- @item gnus-score-expiry-days
- @vindex gnus-score-expiry-days
- This variable says how many days should pass before an unused score file
- entry is expired. If this variable is @code{nil}, no score file entries
- are expired. It's 7 by default.
- @item gnus-update-score-entry-dates
- @vindex gnus-update-score-entry-dates
- If this variable is non-@code{nil}, matching score entries will have
- their dates updated. (This is how Gnus controls expiry---all
- non-matching entries will become too old while matching entries will
- stay fresh and young.) However, if you set this variable to @code{nil},
- even matching entries will grow old and will have to face that oh-so
- grim reaper.
- @item gnus-score-after-write-file-function
- @vindex gnus-score-after-write-file-function
- Function called with the name of the score file just written.
- @item gnus-score-thread-simplify
- @vindex gnus-score-thread-simplify
- If this variable is non-@code{nil}, article subjects will be simplified
- for subject scoring purposes in the same manner as with
- threading---according to the current value of
- gnus-simplify-subject-functions. If the scoring entry uses
- @code{substring} or @code{exact} matching, the match will also be
- simplified in this manner.
- @end table
- @node Score File Format
- @section Score File Format
- @cindex score file format
- A score file is an @code{emacs-lisp} file that normally contains just a
- single form. Casual users are not expected to edit these files;
- everything can be changed from the summary buffer.
- Anyway, if you'd like to dig into it yourself, here's an example:
- @lisp
- (("from"
- ("Lars Ingebrigtsen" -10000)
- ("Per Abrahamsen")
- ("larsi\\|lmi" -50000 nil R))
- ("subject"
- ("Ding is Badd" nil 728373))
- ("xref"
- ("alt.politics" -1000 728372 s))
- ("lines"
- (2 -100 nil <))
- (mark 0)
- (expunge -1000)
- (mark-and-expunge -10)
- (read-only nil)
- (orphan -10)
- (adapt t)
- (files "/hom/larsi/News/gnu.SCORE")
- (exclude-files "all.SCORE")
- (local (gnus-newsgroup-auto-expire t)
- (gnus-summary-make-false-root empty))
- (eval (ding)))
- @end lisp
- This example demonstrates most score file elements. For a different
- approach, see @pxref{Advanced Scoring}.
- Even though this looks much like lisp code, nothing here is actually
- @code{eval}ed. The lisp reader is used to read this form, though, so it
- has to be valid syntactically, if not semantically.
- Six keys are supported by this alist:
- @table @code
- @item STRING
- If the key is a string, it is the name of the header to perform the
- match on. Scoring can only be performed on these eight headers:
- @code{From}, @code{Subject}, @code{References}, @code{Message-ID},
- @code{Xref}, @code{Lines}, @code{Chars} and @code{Date}. In addition to
- these headers, there are three strings to tell Gnus to fetch the entire
- article and do the match on larger parts of the article: @code{Body}
- will perform the match on the body of the article, @code{Head} will
- perform the match on the head of the article, and @code{All} will
- perform the match on the entire article. Note that using any of these
- last three keys will slow down group entry @emph{considerably}. The
- final ``header'' you can score on is @code{Followup}. These score
- entries will result in new score entries being added for all follow-ups
- to articles that matches these score entries.
- Following this key is a arbitrary number of score entries, where each
- score entry has one to four elements.
- @enumerate
- @item
- The first element is the @dfn{match element}. On most headers this will
- be a string, but on the Lines and Chars headers, this must be an
- integer.
- @item
- If the second element is present, it should be a number---the @dfn{score
- element}. This number should be an integer in the neginf to posinf
- interval. This number is added to the score of the article if the match
- is successful. If this element is not present, the
- @code{gnus-score-interactive-default-score} number will be used
- instead. This is 1000 by default.
- @item
- If the third element is present, it should be a number---the @dfn{date
- element}. This date says when the last time this score entry matched,
- which provides a mechanism for expiring the score entries. It this
- element is not present, the score entry is permanent. The date is
- represented by the number of days since December 31, 1 BCE.
- @item
- If the fourth element is present, it should be a symbol---the @dfn{type
- element}. This element specifies what function should be used to see
- whether this score entry matches the article. What match types that can
- be used depends on what header you wish to perform the match on.
- @table @dfn
- @item From, Subject, References, Xref, Message-ID
- For most header types, there are the @code{r} and @code{R} (regexp), as
- well as @code{s} and @code{S} (substring) types, and @code{e} and
- @code{E} (exact match), and @code{w} (word match) types. If this
- element is not present, Gnus will assume that substring matching should
- be used. @code{R}, @code{S}, and @code{E} differ from the others in
- that the matches will be done in a case-sensitive manner. All these
- one-letter types are really just abbreviations for the @code{regexp},
- @code{string}, @code{exact}, and @code{word} types, which you can use
- instead, if you feel like.
- @item Lines, Chars
- These two headers use different match types: @code{<}, @code{>},
- @code{=}, @code{>=} and @code{<=}.
- These predicates are true if
- @example
- (PREDICATE HEADER MATCH)
- @end example
- evaluates to non-@code{nil}. For instance, the advanced match
- @code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the
- following form:
- @lisp
- (< header-value 4)
- @end lisp
- Or to put it another way: When using @code{<} on @code{Lines} with 4 as
- the match, we get the score added if the article has less than 4 lines.
- (It's easy to get confused and think it's the other way around. But
- it's not. I think.)
- When matching on @code{Lines}, be careful because some back ends (like
- @code{nndir}) do not generate @code{Lines} header, so every article ends
- up being marked as having 0 lines. This can lead to strange results if
- you happen to lower score of the articles with few lines.
- @item Date
- For the Date header we have three kinda silly match types:
- @code{before}, @code{at} and @code{after}. I can't really imagine this
- ever being useful, but, like, it would feel kinda silly not to provide
- this function. Just in case. You never know. Better safe than sorry.
- Once burnt, twice shy. Don't judge a book by its cover. Never not have
- sex on a first date. (I have been told that at least one person, and I
- quote, ``found this function indispensable'', however.)
- @cindex ISO8601
- @cindex date
- A more useful match type is @code{regexp}. With it, you can match the
- date string using a regular expression. The date is normalized to
- ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}. If
- you want to match all articles that have been posted on April 1st in
- every year, you could use @samp{....0401.........} as a match string,
- for instance. (Note that the date is kept in its original time zone, so
- this will match articles that were posted when it was April 1st where
- the article was posted from. Time zones are such wholesome fun for the
- whole family, eh?)
- @item Head, Body, All
- These three match keys use the same match types as the @code{From} (etc)
- header uses.
- @item Followup
- This match key is somewhat special, in that it will match the
- @code{From} header, and affect the score of not only the matching
- articles, but also all followups to the matching articles. This allows
- you e.g. increase the score of followups to your own articles, or
- decrease the score of followups to the articles of some known
- trouble-maker. Uses the same match types as the @code{From} header
- uses. (Using this match key will lead to creation of @file{ADAPT}
- files.)
- @item Thread
- This match key works along the same lines as the @code{Followup} match
- key. If you say that you want to score on a (sub-)thread started by an
- article with a @code{Message-ID} @var{x}, then you add a @samp{thread}
- match. This will add a new @samp{thread} match for each article that
- has @var{x} in its @code{References} header. (These new @samp{thread}
- matches will use the @code{Message-ID}s of these matching articles.)
- This will ensure that you can raise/lower the score of an entire thread,
- even though some articles in the thread may not have complete
- @code{References} headers. Note that using this may lead to
- undeterministic scores of the articles in the thread. (Using this match
- key will lead to creation of @file{ADAPT} files.)
- @end table
- @end enumerate
- @cindex Score File Atoms
- @item mark
- The value of this entry should be a number. Any articles with a score
- lower than this number will be marked as read.
- @item expunge
- The value of this entry should be a number. Any articles with a score
- lower than this number will be removed from the summary buffer.
- @item mark-and-expunge
- The value of this entry should be a number. Any articles with a score
- lower than this number will be marked as read and removed from the
- summary buffer.
- @item thread-mark-and-expunge
- The value of this entry should be a number. All articles that belong to
- a thread that has a total score below this number will be marked as read
- and removed from the summary buffer. @code{gnus-thread-score-function}
- says how to compute the total score for a thread.
- @item files
- The value of this entry should be any number of file names. These files
- are assumed to be score files as well, and will be loaded the same way
- this one was.
- @item exclude-files
- The clue of this entry should be any number of files. These files will
- not be loaded, even though they would normally be so, for some reason or
- other.
- @item eval
- The value of this entry will be @code{eval}el. This element will be
- ignored when handling global score files.
- @item read-only
- Read-only score files will not be updated or saved. Global score files
- should feature this atom (@pxref{Global Score Files}). (Note:
- @dfn{Global} here really means @dfn{global}; not your personal
- apply-to-all-groups score files.)
- @item orphan
- The value of this entry should be a number. Articles that do not have
- parents will get this number added to their scores. Imagine you follow
- some high-volume newsgroup, like @samp{comp.lang.c}. Most likely you
- will only follow a few of the threads, also want to see any new threads.
- You can do this with the following two score file entries:
- @example
- (orphan -500)
- (mark-and-expunge -100)
- @end example
- When you enter the group the first time, you will only see the new
- threads. You then raise the score of the threads that you find
- interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the
- rest. Next time you enter the group, you will see new articles in the
- interesting threads, plus any new threads.
- I.e.---the orphan score atom is for high-volume groups where there
- exist a few interesting threads which can't be found automatically by
- ordinary scoring rules.
- @item adapt
- This entry controls the adaptive scoring. If it is @code{t}, the
- default adaptive scoring rules will be used. If it is @code{ignore}, no
- adaptive scoring will be performed on this group. If it is a list, this
- list will be used as the adaptive scoring rules. If it isn't present,
- or is something other than @code{t} or @code{ignore}, the default
- adaptive scoring rules will be used. If you want to use adaptive
- scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
- @code{t}, and insert an @code{(adapt ignore)} in the groups where you do
- not want adaptive scoring. If you only want adaptive scoring in a few
- groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
- insert @code{(adapt t)} in the score files of the groups where you want
- it.
- @item adapt-file
- All adaptive score entries will go to the file named by this entry. It
- will also be applied when entering the group. This atom might be handy
- if you want to adapt on several groups at once, using the same adaptive
- file for a number of groups.
- @item local
- @cindex local variables
- The value of this entry should be a list of @code{(VAR VALUE)} pairs.
- Each @var{var} will be made buffer-local to the current summary buffer,
- and set to the value specified. This is a convenient, if somewhat
- strange, way of setting variables in some groups if you don't like hooks
- much. Note that the @var{value} won't be evaluated.
- @end table
- @node Score File Editing
- @section Score File Editing
- You normally enter all scoring commands from the summary buffer, but you
- might feel the urge to edit them by hand as well, so we've supplied you
- with a mode for that.
- It's simply a slightly customized @code{emacs-lisp} mode, with these
- additional commands:
- @table @kbd
- @item C-c C-c
- @kindex C-c C-c (Score)
- @findex gnus-score-edit-done
- Save the changes you have made and return to the summary buffer
- (@code{gnus-score-edit-done}).
- @item C-c C-d
- @kindex C-c C-d (Score)
- @findex gnus-score-edit-insert-date
- Insert the current date in numerical format
- (@code{gnus-score-edit-insert-date}). This is really the day number, if
- you were wondering.
- @item C-c C-p
- @kindex C-c C-p (Score)
- @findex gnus-score-pretty-print
- The adaptive score files are saved in an unformatted fashion. If you
- intend to read one of these files, you want to @dfn{pretty print} it
- first. This command (@code{gnus-score-pretty-print}) does that for
- you.
- @end table
- Type @kbd{M-x gnus-score-mode} to use this mode.
- @vindex gnus-score-mode-hook
- @code{gnus-score-menu-hook} is run in score mode buffers.
- In the summary buffer you can use commands like @kbd{V f} and @kbd{V
- e} to begin editing score files.
- @node Adaptive Scoring
- @section Adaptive Scoring
- @cindex adaptive scoring
- If all this scoring is getting you down, Gnus has a way of making it all
- happen automatically---as if by magic. Or rather, as if by artificial
- stupidity, to be precise.
- @vindex gnus-use-adaptive-scoring
- When you read an article, or mark an article as read, or kill an
- article, you leave marks behind. On exit from the group, Gnus can sniff
- these marks and add score elements depending on what marks it finds.
- You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
- @code{t} or @code{(line)}. If you want score adaptively on separate
- words appearing in the subjects, you should set this variable to
- @code{(word)}. If you want to use both adaptive methods, set this
- variable to @code{(word line)}.
- @vindex gnus-default-adaptive-score-alist
- To give you complete control over the scoring process, you can customize
- the @code{gnus-default-adaptive-score-alist} variable. For instance, it
- might look something like this:
- @lisp
- (setq gnus-default-adaptive-score-alist
- '((gnus-unread-mark)
- (gnus-ticked-mark (from 4))
- (gnus-dormant-mark (from 5))
- (gnus-del-mark (from -4) (subject -1))
- (gnus-read-mark (from 4) (subject 2))
- (gnus-expirable-mark (from -1) (subject -1))
- (gnus-killed-mark (from -1) (subject -3))
- (gnus-kill-file-mark)
- (gnus-ancient-mark)
- (gnus-low-score-mark)
- (gnus-catchup-mark (from -1) (subject -1))))
- @end lisp
- As you see, each element in this alist has a mark as a key (either a
- variable name or a ``real'' mark---a character). Following this key is
- a arbitrary number of header/score pairs. If there are no header/score
- pairs following the key, no adaptive scoring will be done on articles
- that have that key as the article mark. For instance, articles with
- @code{gnus-unread-mark} in the example above will not get adaptive score
- entries.
- Each article can have only one mark, so just a single of these rules
- will be applied to each article.
- To take @code{gnus-del-mark} as an example---this alist says that all
- articles that have that mark (i.e., are marked with @samp{D}) will have a
- score entry added to lower based on the @code{From} header by -4, and
- lowered by @code{Subject} by -1. Change this to fit your prejudices.
- If you have marked 10 articles with the same subject with
- @code{gnus-del-mark}, the rule for that mark will be applied ten times.
- That means that that subject will get a score of ten times -1, which
- should be, unless I'm much mistaken, -10.
- If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
- the read articles will be marked with the @samp{E} mark. This'll
- probably make adaptive scoring slightly impossible, so auto-expiring and
- adaptive scoring doesn't really mix very well.
- The headers you can score on are @code{from}, @code{subject},
- @code{message-id}, @code{references}, @code{xref}, @code{lines},
- @code{chars} and @code{date}. In addition, you can score on
- @code{followup}, which will create an adaptive score entry that matches
- on the @code{References} header using the @code{Message-ID} of the
- current article, thereby matching the following thread.
- You can also score on @code{thread}, which will try to score all
- articles that appear in a thread. @code{thread} matches uses a
- @code{Message-ID} to match on the @code{References} header of the
- article. If the match is made, the @code{Message-ID} of the article is
- added to the @code{thread} rule. (Think about it. I'd recommend two
- aspirins afterwards.)
- If you use this scheme, you should set the score file atom @code{mark}
- to something small---like -300, perhaps, to avoid having small random
- changes result in articles getting marked as read.
- After using adaptive scoring for a week or so, Gnus should start to
- become properly trained and enhance the authors you like best, and kill
- the authors you like least, without you having to say so explicitly.
- You can control what groups the adaptive scoring is to be performed on
- by using the score files (@pxref{Score File Format}). This will also
- let you use different rules in different groups.
- @vindex gnus-adaptive-file-suffix
- The adaptive score entries will be put into a file where the name is the
- group name with @code{gnus-adaptive-file-suffix} appended. The default
- is @samp{ADAPT}.
- @vindex gnus-score-exact-adapt-limit
- When doing adaptive scoring, substring or fuzzy matching would probably
- give you the best results in most cases. However, if the header one
- matches is short, the possibility for false positives is great, so if
- the length of the match is less than
- @code{gnus-score-exact-adapt-limit}, exact matching will be used. If
- this variable is @code{nil}, exact matching will always be used to avoid
- this problem.
- @vindex gnus-default-adaptive-word-score-alist
- As mentioned above, you can adapt either on individual words or entire
- headers. If you adapt on words, the
- @code{gnus-default-adaptive-word-score-alist} variable says what score
- each instance of a word should add given a mark.
- @lisp
- (setq gnus-default-adaptive-word-score-alist
- `((,gnus-read-mark . 30)
- (,gnus-catchup-mark . -10)
- (,gnus-killed-mark . -20)
- (,gnus-del-mark . -15)))
- @end lisp
- This is the default value. If you have adaption on words enabled, every
- word that appears in subjects of articles marked with
- @code{gnus-read-mark} will result in a score rule that increase the
- score with 30 points.
- @vindex gnus-default-ignored-adaptive-words
- @vindex gnus-ignored-adaptive-words
- Words that appear in the @code{gnus-default-ignored-adaptive-words} list
- will be ignored. If you wish to add more words to be ignored, use the
- @code{gnus-ignored-adaptive-words} list instead.
- @vindex gnus-adaptive-word-syntax-table
- When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
- syntax table in effect. It is similar to the standard syntax table, but
- it considers numbers to be non-word-constituent characters.
- @vindex gnus-adaptive-word-minimum
- If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive
- word scoring process will never bring down the score of an article to
- below this number. The default is @code{nil}.
- @vindex gnus-adaptive-word-no-group-words
- If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus
- won't adaptively word score any of the words in the group name. Useful
- for groups like @samp{comp.editors.emacs}, where most of the subject
- lines contain the word @samp{emacs}.
- After using this scheme for a while, it might be nice to write a
- @code{gnus-psychoanalyze-user} command to go through the rules and see
- what words you like and what words you don't like. Or perhaps not.
- Note that the adaptive word scoring thing is highly experimental and is
- likely to change in the future. Initial impressions seem to indicate
- that it's totally useless as it stands. Some more work (involving more
- rigorous statistical methods) will have to be done to make this useful.
- @node Home Score File
- @section Home Score File
- The score file where new score file entries will go is called the
- @dfn{home score file}. This is normally (and by default) the score file
- for the group itself. For instance, the home score file for
- @samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
- However, this may not be what you want. It is often convenient to share
- a common home score file among many groups---all @samp{emacs} groups
- could perhaps use the same home score file.
- @vindex gnus-home-score-file
- The variable that controls this is @code{gnus-home-score-file}. It can
- be:
- @enumerate
- @item
- A string. Then this file will be used as the home score file for all
- groups.
- @item
- A function. The result of this function will be used as the home score
- file. The function will be called with the name of the group as the
- parameter.
- @item
- A list. The elements in this list can be:
- @enumerate
- @item
- @code{(@var{regexp} @var{file-name})}. If the @var{regexp} matches the
- group name, the @var{file-name} will be used as the home score file.
- @item
- A function. If the function returns non-nil, the result will be used as
- the home score file.
- @item
- A string. Use the string as the home score file.
- @end enumerate
- The list will be traversed from the beginning towards the end looking
- for matches.
- @end enumerate
- So, if you want to use just a single score file, you could say:
- @lisp
- (setq gnus-home-score-file
- "my-total-score-file.SCORE")
- @end lisp
- If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
- @file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
- @findex gnus-hierarchial-home-score-file
- @lisp
- (setq gnus-home-score-file
- 'gnus-hierarchial-home-score-file)
- @end lisp
- This is a ready-made function provided for your convenience.
- Other functions include
- @table @code
- @item gnus-current-home-score-file
- @findex gnus-current-home-score-file
- Return the ``current'' regular score file. This will make scoring
- commands add entry to the ``innermost'' matching score file.
- @end table
- If you want to have one score file for the @samp{emacs} groups and
- another for the @samp{comp} groups, while letting all other groups use
- their own home score files:
- @lisp
- (setq gnus-home-score-file
- ;; All groups that match the regexp "\\.emacs"
- '(("\\.emacs" "emacs.SCORE")
- ;; All the comp groups in one score file
- ("^comp" "comp.SCORE")))
- @end lisp
- @vindex gnus-home-adapt-file
- @code{gnus-home-adapt-file} works exactly the same way as
- @code{gnus-home-score-file}, but says what the home adaptive score file
- is instead. All new adaptive file entries will go into the file
- specified by this variable, and the same syntax is allowed.
- In addition to using @code{gnus-home-score-file} and
- @code{gnus-home-adapt-file}, you can also use group parameters
- (@pxref{Group Parameters}) and topic parameters (@pxref{Topic
- Parameters}) to achieve much the same. Group and topic parameters take
- precedence over this variable.
- @node Followups To Yourself
- @section Followups To Yourself
- Gnus offers two commands for picking out the @code{Message-ID} header in
- the current buffer. Gnus will then add a score rule that scores using
- this @code{Message-ID} on the @code{References} header of other
- articles. This will, in effect, increase the score of all articles that
- respond to the article in the current buffer. Quite useful if you want
- to easily note when people answer what you've said.
- @table @code
- @item gnus-score-followup-article
- @findex gnus-score-followup-article
- This will add a score to articles that directly follow up your own
- article.
- @item gnus-score-followup-thread
- @findex gnus-score-followup-thread
- This will add a score to all articles that appear in a thread ``below''
- your own article.
- @end table
- @vindex message-sent-hook
- These two functions are both primarily meant to be used in hooks like
- @code{message-sent-hook}, like this:
- @lisp
- (add-hook 'message-sent-hook 'gnus-score-followup-thread)
- @end lisp
- If you look closely at your own @code{Message-ID}, you'll notice that
- the first two or three characters are always the same. Here's two of
- mine:
- @example
- <x6u3u47icf.fsf@@eyesore.no>
- <x6sp9o7ibw.fsf@@eyesore.no>
- @end example
- So ``my'' ident on this machine is @samp{x6}. This can be
- exploited---the following rule will raise the score on all followups to
- myself:
- @lisp
- ("references"
- ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore\\.no>"
- 1000 nil r))
- @end lisp
- Whether it's the first two or first three characters that are ``yours''
- is system-dependent.
- @node Scoring Tips
- @section Scoring Tips
- @cindex scoring tips
- @table @dfn
- @item Crossposts
- @cindex crossposts
- @cindex scoring crossposts
- If you want to lower the score of crossposts, the line to match on is
- the @code{Xref} header.
- @lisp
- ("xref" (" talk.politics.misc:" -1000))
- @end lisp
- @item Multiple crossposts
- If you want to lower the score of articles that have been crossposted to
- more than, say, 3 groups:
- @lisp
- ("xref"
- ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+"
- -1000 nil r))
- @end lisp
- @item Matching on the body
- This is generally not a very good idea---it takes a very long time.
- Gnus actually has to fetch each individual article from the server. But
- you might want to anyway, I guess. Even though there are three match
- keys (@code{Head}, @code{Body} and @code{All}), you should choose one
- and stick with it in each score file. If you use any two, each article
- will be fetched @emph{twice}. If you want to match a bit on the
- @code{Head} and a bit on the @code{Body}, just use @code{All} for all
- the matches.
- @item Marking as read
- You will probably want to mark articles that have scores below a certain
- number as read. This is most easily achieved by putting the following
- in your @file{all.SCORE} file:
- @lisp
- ((mark -100))
- @end lisp
- You may also consider doing something similar with @code{expunge}.
- @item Negated character classes
- If you say stuff like @code{[^abcd]*}, you may get unexpected results.
- That will match newlines, which might lead to, well, The Unknown. Say
- @code{[^abcd\n]*} instead.
- @end table
- @node Reverse Scoring
- @section Reverse Scoring
- @cindex reverse scoring
- If you want to keep just articles that have @samp{Sex with Emacs} in the
- subject header, and expunge all other articles, you could put something
- like this in your score file:
- @lisp
- (("subject"
- ("Sex with Emacs" 2))
- (mark 1)
- (expunge 1))
- @end lisp
- So, you raise all articles that match @samp{Sex with Emacs} and mark the
- rest as read, and expunge them to boot.
- @node Global Score Files
- @section Global Score Files
- @cindex global score files
- Sure, other newsreaders have ``global kill files''. These are usually
- nothing more than a single kill file that applies to all groups, stored
- in the user's home directory. Bah! Puny, weak newsreaders!
- What I'm talking about here are Global Score Files. Score files from
- all over the world, from users everywhere, uniting all nations in one
- big, happy score file union! Ange-score! New and untested!
- @vindex gnus-global-score-files
- All you have to do to use other people's score files is to set the
- @code{gnus-global-score-files} variable. One entry for each score file,
- or each score file directory. Gnus will decide by itself what score
- files are applicable to which group.
- To use the score file
- @file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and
- all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory,
- say this:
- @lisp
- (setq gnus-global-score-files
- '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE"
- "/ftp@@ftp.some-where:/pub/score/"))
- @end lisp
- @findex gnus-score-search-global-directories
- @noindent
- Simple, eh? Directory names must end with a @samp{/}. These
- directories are typically scanned only once during each Gnus session.
- If you feel the need to manually re-scan the remote directories, you can
- use the @code{gnus-score-search-global-directories} command.
- Note that, at present, using this option will slow down group entry
- somewhat. (That is---a lot.)
- If you want to start maintaining score files for other people to use,
- just put your score file up for anonymous ftp and announce it to the
- world. Become a retro-moderator! Participate in the retro-moderator
- wars sure to ensue, where retro-moderators battle it out for the
- sympathy of the people, luring them to use their score files on false
- premises! Yay! The net is saved!
- Here are some tips for the would-be retro-moderator, off the top of my
- head:
- @itemize @bullet
- @item
- Articles heavily crossposted are probably junk.
- @item
- To lower a single inappropriate article, lower by @code{Message-ID}.
- @item
- Particularly brilliant authors can be raised on a permanent basis.
- @item
- Authors that repeatedly post off-charter for the group can safely be
- lowered out of existence.
- @item
- Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
- articles completely.
- @item
- Use expiring score entries to keep the size of the file down. You
- should probably have a long expiry period, though, as some sites keep
- old articles for a long time.
- @end itemize
- ... I wonder whether other newsreaders will support global score files
- in the future. @emph{Snicker}. Yup, any day now, newsreaders like Blue
- Wave, xrn and 1stReader are bound to implement scoring. Should we start
- holding our breath yet?
- @node Kill Files
- @section Kill Files
- @cindex kill files
- Gnus still supports those pesky old kill files. In fact, the kill file
- entries can now be expiring, which is something I wrote before Daniel
- Quinlan thought of doing score files, so I've left the code in there.
- In short, kill processing is a lot slower (and I do mean @emph{a lot})
- than score processing, so it might be a good idea to rewrite your kill
- files into score files.
- Anyway, a kill file is a normal @code{emacs-lisp} file. You can put any
- forms into this file, which means that you can use kill files as some
- sort of primitive hook function to be run on group entry, even though
- that isn't a very good idea.
- Normal kill files look like this:
- @lisp
- (gnus-kill "From" "Lars Ingebrigtsen")
- (gnus-kill "Subject" "ding")
- (gnus-expunge "X")
- @end lisp
- This will mark every article written by me as read, and remove the
- marked articles from the summary buffer. Very useful, you'll agree.
- Other programs use a totally different kill file syntax. If Gnus
- encounters what looks like a @code{rn} kill file, it will take a stab at
- interpreting it.
- Two summary functions for editing a GNUS kill file:
- @table @kbd
- @item M-k
- @kindex M-k @r{(Summary)}
- @findex gnus-summary-edit-local-kill
- Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
- @item M-K
- @kindex M-K @r{(Summary)}
- @findex gnus-summary-edit-global-kill
- Edit the general kill file (@code{gnus-summary-edit-global-kill}).
- @end table
- Two group mode functions for editing the kill files:
- @table @kbd
- @item M-k
- @kindex M-k @r{(Group)}
- @findex gnus-group-edit-local-kill
- Edit this group's kill file (@code{gnus-group-edit-local-kill}).
- @item M-K
- @kindex M-K @r{(Group)}
- @findex gnus-group-edit-global-kill
- Edit the general kill file (@code{gnus-group-edit-global-kill}).
- @end table
- Kill file variables:
- @table @code
- @item gnus-kill-file-name
- @vindex gnus-kill-file-name
- A kill file for the group @samp{soc.motss} is normally called
- @file{soc.motss.KILL}. The suffix appended to the group name to get
- this file name is detailed by the @code{gnus-kill-file-name} variable.
- The ``global'' kill file (not in the score file sense of ``global'', of
- course) is just called @file{KILL}.
- @vindex gnus-kill-save-kill-file
- @item gnus-kill-save-kill-file
- If this variable is non-@code{nil}, Gnus will save the
- kill file after processing, which is necessary if you use expiring
- kills.
- @item gnus-apply-kill-hook
- @vindex gnus-apply-kill-hook
- @findex gnus-apply-kill-file-unless-scored
- @findex gnus-apply-kill-file
- A hook called to apply kill files to a group. It is
- @code{(gnus-apply-kill-file)} by default. If you want to ignore the
- kill file if you have a score file for the same group, you can set this
- hook to @code{(gnus-apply-kill-file-unless-scored)}. If you don't want
- kill files to be processed, you should set this variable to @code{nil}.
- @item gnus-kill-file-mode-hook
- @vindex gnus-kill-file-mode-hook
- A hook called in kill-file mode buffers.
- @end table
- @node Converting Kill Files
- @section Converting Kill Files
- @cindex kill files
- @cindex converting kill files
- If you have loads of old kill files, you may want to convert them into
- score files. If they are ``regular'', you can use
- the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
- by hand.
- The kill to score conversion package isn't included in Gnus by default.
- You can fetch it from
- @uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}.
- If your old kill files are very complex---if they contain more
- non-@code{gnus-kill} forms than not, you'll have to convert them by
- hand. Or just let them be as they are. Gnus will still use them as
- before.
- @node GroupLens
- @section GroupLens
- @cindex GroupLens
- GroupLens is a collaborative filtering system that helps you work
- together with other people to find the quality news articles out of the
- huge volume of news articles generated every day.
- To accomplish this the GroupLens system combines your opinions about
- articles you have already read with the opinions of others who have done
- likewise and gives you a personalized prediction for each unread news
- article. Think of GroupLens as a matchmaker. GroupLens watches how you
- rate articles, and finds other people that rate articles the same way.
- Once it has found some people you agree with it tells you, in the form
- of a prediction, what they thought of the article. You can use this
- prediction to help you decide whether or not you want to read the
- article.
- @menu
- * Using GroupLens:: How to make Gnus use GroupLens.
- * Rating Articles:: Letting GroupLens know how you rate articles.
- * Displaying Predictions:: Displaying predictions given by GroupLens.
- * GroupLens Variables:: Customizing GroupLens.
- @end menu
- @node Using GroupLens
- @subsection Using GroupLens
- To use GroupLens you must register a pseudonym with your local Better
- Bit Bureau (BBB).
- @uref{http://www.cs.umn.edu/Research/GroupLens/bbb.html} is the only
- better bit in town at the moment.
- Once you have registered you'll need to set a couple of variables.
- @table @code
- @item gnus-use-grouplens
- @vindex gnus-use-grouplens
- Setting this variable to a non-@code{nil} value will make Gnus hook into
- all the relevant GroupLens functions.
- @item grouplens-pseudonym
- @vindex grouplens-pseudonym
- This variable should be set to the pseudonym you got when registering
- with the Better Bit Bureau.
- @item grouplens-newsgroups
- @vindex grouplens-newsgroups
- A list of groups that you want to get GroupLens predictions for.
- @end table
- That's the minimum of what you need to get up and running with GroupLens.
- Once you've registered, GroupLens will start giving you scores for
- articles based on the average of what other people think. But, to get
- the real benefit of GroupLens you need to start rating articles
- yourself. Then the scores GroupLens gives you will be personalized for
- you, based on how the people you usually agree with have already rated.
- @node Rating Articles
- @subsection Rating Articles
- In GroupLens, an article is rated on a scale from 1 to 5, inclusive.
- Where 1 means something like this article is a waste of bandwidth and 5
- means that the article was really good. The basic question to ask
- yourself is, "on a scale from 1 to 5 would I like to see more articles
- like this one?"
- There are four ways to enter a rating for an article in GroupLens.
- @table @kbd
- @item r
- @kindex r (GroupLens)
- @findex bbb-summary-rate-article
- This function will prompt you for a rating on a scale of one to five.
- @item k
- @kindex k (GroupLens)
- @findex grouplens-score-thread
- This function will prompt you for a rating, and rate all the articles in
- the thread. This is really useful for some of those long running giant
- threads in rec.humor.
- @end table
- The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be
- the score of the article you're reading.
- @table @kbd
- @item 1-5 n
- @kindex n (GroupLens)
- @findex grouplens-next-unread-article
- Rate the article and go to the next unread article.
- @item 1-5 ,
- @kindex , (GroupLens)
- @findex grouplens-best-unread-article
- Rate the article and go to the next unread article with the highest score.
- @end table
- If you want to give the current article a score of 4 and then go to the
- next article, just type @kbd{4 n}.
- @node Displaying Predictions
- @subsection Displaying Predictions
- GroupLens makes a prediction for you about how much you will like a
- news article. The predictions from GroupLens are on a scale from 1 to
- 5, where 1 is the worst and 5 is the best. You can use the predictions
- from GroupLens in one of three ways controlled by the variable
- @code{gnus-grouplens-override-scoring}.
- @vindex gnus-grouplens-override-scoring
- There are three ways to display predictions in grouplens. You may
- choose to have the GroupLens scores contribute to, or override the
- regular gnus scoring mechanism. override is the default; however, some
- people prefer to see the Gnus scores plus the grouplens scores. To get
- the separate scoring behavior you need to set
- @code{gnus-grouplens-override-scoring} to @code{'separate}. To have the
- GroupLens predictions combined with the grouplens scores set it to
- @code{'override} and to combine the scores set
- @code{gnus-grouplens-override-scoring} to @code{'combine}. When you use
- the combine option you will also want to set the values for
- @code{grouplens-prediction-offset} and
- @code{grouplens-score-scale-factor}.
- @vindex grouplens-prediction-display
- In either case, GroupLens gives you a few choices for how you would like
- to see your predictions displayed. The display of predictions is
- controlled by the @code{grouplens-prediction-display} variable.
- The following are valid values for that variable.
- @table @code
- @item prediction-spot
- The higher the prediction, the further to the right an @samp{*} is
- displayed.
- @item confidence-interval
- A numeric confidence interval.
- @item prediction-bar
- The higher the prediction, the longer the bar.
- @item confidence-bar
- Numerical confidence.
- @item confidence-spot
- The spot gets bigger with more confidence.
- @item prediction-num
- Plain-old numeric value.
- @item confidence-plus-minus
- Prediction +/- confidence.
- @end table
- @node GroupLens Variables
- @subsection GroupLens Variables
- @table @code
- @item gnus-summary-grouplens-line-format
- The summary line format used in GroupLens-enhanced summary buffers. It
- accepts the same specs as the normal summary line format (@pxref{Summary
- Buffer Lines}). The default is @samp{%U%R%z%l%I%(%[%4L: %-20,20n%]%)
- %s\n}.
- @item grouplens-bbb-host
- Host running the bbbd server. @samp{grouplens.cs.umn.edu} is the
- default.
- @item grouplens-bbb-port
- Port of the host running the bbbd server. The default is 9000.
- @item grouplens-score-offset
- Offset the prediction by this value. In other words, subtract the
- prediction value by this number to arrive at the effective score. The
- default is 0.
- @item grouplens-score-scale-factor
- This variable allows the user to magnify the effect of GroupLens scores.
- The scale factor is applied after the offset. The default is 1.
- @end table
- @node Advanced Scoring
- @section Advanced Scoring
- Scoring on Subjects and From headers is nice enough, but what if you're
- really interested in what a person has to say only when she's talking
- about a particular subject? Or what if you really don't want to
- read what person A has to say when she's following up to person B, but
- want to read what she says when she's following up to person C?
- By using advanced scoring rules you may create arbitrarily complex
- scoring patterns.
- @menu
- * Advanced Scoring Syntax:: A definition.
- * Advanced Scoring Examples:: What they look like.
- * Advanced Scoring Tips:: Getting the most out of it.
- @end menu
- @node Advanced Scoring Syntax
- @subsection Advanced Scoring Syntax
- Ordinary scoring rules have a string as the first element in the rule.
- Advanced scoring rules have a list as the first element. The second
- element is the score to be applied if the first element evaluated to a
- non-@code{nil} value.
- These lists may consist of three logical operators, one redirection
- operator, and various match operators.
- Logical operators:
- @table @code
- @item &
- @itemx and
- This logical operator will evaluate each of its arguments until it finds
- one that evaluates to @code{false}, and then it'll stop. If all arguments
- evaluate to @code{true} values, then this operator will return
- @code{true}.
- @item |
- @itemx or
- This logical operator will evaluate each of its arguments until it finds
- one that evaluates to @code{true}. If no arguments are @code{true},
- then this operator will return @code{false}.
- @item !
- @itemx not
- @itemx ¬
- This logical operator only takes a single argument. It returns the
- logical negation of the value of its argument.
- @end table
- There is an @dfn{indirection operator} that will make its arguments
- apply to the ancestors of the current article being scored. For
- instance, @code{1-} will make score rules apply to the parent of the
- current article. @code{2-} will make score rules apply to the
- grandparent of the current article. Alternatively, you can write
- @code{^^}, where the number of @code{^}s (carets) says how far back into
- the ancestry you want to go.
- Finally, we have the match operators. These are the ones that do the
- real work. Match operators are header name strings followed by a match
- and a match type. A typical match operator looks like @samp{("from"
- "Lars Ingebrigtsen" s)}. The header names are the same as when using
- simple scoring, and the match types are also the same.
- @node Advanced Scoring Examples
- @subsection Advanced Scoring Examples
- Let's say you want to increase the score of articles written by Lars
- when he's talking about Gnus:
- @example
- ((&
- ("from" "Lars Ingebrigtsen")
- ("subject" "Gnus"))
- 1000)
- @end example
- Quite simple, huh?
- When he writes long articles, he sometimes has something nice to say:
- @example
- ((&
- ("from" "Lars Ingebrigtsen")
- (|
- ("subject" "Gnus")
- ("lines" 100 >)))
- 1000)
- @end example
- However, when he responds to things written by Reig Eigil Logge, you
- really don't want to read what he's written:
- @example
- ((&
- ("from" "Lars Ingebrigtsen")
- (1- ("from" "Reig Eigir Logge")))
- -100000)
- @end example
- Everybody that follows up Redmondo when he writes about disappearing
- socks should have their scores raised, but only when they talk about
- white socks. However, when Lars talks about socks, it's usually not
- very interesting:
- @example
- ((&
- (1-
- (&
- ("from" "redmondo@@.*no" r)
- ("body" "disappearing.*socks" t)))
- (! ("from" "Lars Ingebrigtsen"))
- ("body" "white.*socks"))
- 1000)
- @end example
- The possibilities are endless.
- @node Advanced Scoring Tips
- @subsection Advanced Scoring Tips
- The @code{&} and @code{|} logical operators do short-circuit logic.
- That is, they stop processing their arguments when it's clear what the
- result of the operation will be. For instance, if one of the arguments
- of an @code{&} evaluates to @code{false}, there's no point in evaluating
- the rest of the arguments. This means that you should put slow matches
- (@samp{body}, @samp{header}) last and quick matches (@samp{from},
- @samp{subject}) first.
- The indirection arguments (@code{1-} and so on) will make their
- arguments work on previous generations of the thread. If you say
- something like:
- @example
- ...
- (1-
- (1-
- ("from" "lars")))
- ...
- @end example
- Then that means "score on the from header of the grandparent of the
- current article". An indirection is quite fast, but it's better to say:
- @example
- (1-
- (&
- ("from" "Lars")
- ("subject" "Gnus")))
- @end example
- than it is to say:
- @example
- (&
- (1- ("from" "Lars"))
- (1- ("subject" "Gnus")))
- @end example
- @node Score Decays
- @section Score Decays
- @cindex score decays
- @cindex decays
- You may find that your scores have a tendency to grow without
- bounds, especially if you're using adaptive scoring. If scores get too
- big, they lose all meaning---they simply max out and it's difficult to
- use them in any sensible way.
- @vindex gnus-decay-scores
- @findex gnus-decay-score
- @vindex gnus-decay-score-function
- Gnus provides a mechanism for decaying scores to help with this problem.
- When score files are loaded and @code{gnus-decay-scores} is
- non-@code{nil}, Gnus will run the score files through the decaying
- mechanism thereby lowering the scores of all non-permanent score rules.
- The decay itself if performed by the @code{gnus-decay-score-function}
- function, which is @code{gnus-decay-score} by default. Here's the
- definition of that function:
- @lisp
- (defun gnus-decay-score (score)
- "Decay SCORE.
- This is done according to `gnus-score-decay-constant'
- and `gnus-score-decay-scale'."
- (floor
- (- score
- (* (if (< score 0) 1 -1)
- (min (abs score)
- (max gnus-score-decay-constant
- (* (abs score)
- gnus-score-decay-scale)))))))
- @end lisp
- @vindex gnus-score-decay-scale
- @vindex gnus-score-decay-constant
- @code{gnus-score-decay-constant} is 3 by default and
- @code{gnus-score-decay-scale} is 0.05. This should cause the following:
- @enumerate
- @item
- Scores between -3 and 3 will be set to 0 when this function is called.
- @item
- Scores with magnitudes between 3 and 60 will be shrunk by 3.
- @item
- Scores with magnitudes greater than 60 will be shrunk by 5% of the
- score.
- @end enumerate
- If you don't like this decay function, write your own. It is called
- with the score to be decayed as its only parameter, and it should return
- the new score, which should be an integer.
- Gnus will try to decay scores once a day. If you haven't run Gnus for
- four days, Gnus will decay the scores four times, for instance.
- @node Various
- @chapter Various
- @menu
- * Process/Prefix:: A convention used by many treatment commands.
- * Interactive:: Making Gnus ask you many questions.
- * Symbolic Prefixes:: How to supply some Gnus functions with options.
- * Formatting Variables:: You can specify what buffers should look like.
- * Windows Configuration:: Configuring the Gnus buffer windows.
- * Faces and Fonts:: How to change how faces look.
- * Compilation:: How to speed Gnus up.
- * Mode Lines:: Displaying information in the mode lines.
- * Highlighting and Menus:: Making buffers look all nice and cozy.
- * Buttons:: Get tendonitis in ten easy steps!
- * Daemons:: Gnus can do things behind your back.
- * NoCeM:: How to avoid spam and other fatty foods.
- * Undo:: Some actions can be undone.
- * Moderation:: What to do if you're a moderator.
- * Emacs Enhancements:: There can be more pictures and stuff under
- Emacs 21.
- * XEmacs Enhancements:: There are more pictures and stuff under XEmacs.
- * Fuzzy Matching:: What's the big fuzz?
- * Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email.
- * Various Various:: Things that are really various.
- @end menu
- @node Process/Prefix
- @section Process/Prefix
- @cindex process/prefix convention
- Many functions, among them functions for moving, decoding and saving
- articles, use what is known as the @dfn{Process/Prefix convention}.
- This is a method for figuring out what articles the user wants the
- command to be performed on.
- It goes like this:
- If the numeric prefix is N, perform the operation on the next N
- articles, starting with the current one. If the numeric prefix is
- negative, perform the operation on the previous N articles, starting
- with the current one.
- @vindex transient-mark-mode
- If @code{transient-mark-mode} in non-@code{nil} and the region is
- active, all articles in the region will be worked upon.
- If there is no numeric prefix, but some articles are marked with the
- process mark, perform the operation on the articles marked with
- the process mark.
- If there is neither a numeric prefix nor any articles marked with the
- process mark, just perform the operation on the current article.
- Quite simple, really, but it needs to be made clear so that surprises
- are avoided.
- Commands that react to the process mark will push the current list of
- process marked articles onto a stack and will then clear all process
- marked articles. You can restore the previous configuration with the
- @kbd{M P y} command (@pxref{Setting Process Marks}).
- @vindex gnus-summary-goto-unread
- One thing that seems to shock & horrify lots of people is that, for
- instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}.
- Since each @kbd{d} (which marks the current article as read) by default
- goes to the next unread article after marking, this means that @kbd{3 d}
- will mark the next three unread articles as read, no matter what the
- summary buffer looks like. Set @code{gnus-summary-goto-unread} to
- @code{nil} for a more straightforward action.
- Many commands do not use the process/prefix convention. All commands
- that do explicitly say so in this manual. To apply the process/prefix
- convention to commands that do not use it, you can use the @kbd{M-&}
- command. For instance, to mark all the articles in the group as
- expirable, you could say @kbd{M P b M-& E}.
- @node Interactive
- @section Interactive
- @cindex interaction
- @table @code
- @item gnus-novice-user
- @vindex gnus-novice-user
- If this variable is non-@code{nil}, you are either a newcomer to the
- World of Usenet, or you are very cautious, which is a nice thing to be,
- really. You will be given questions of the type ``Are you sure you want
- to do this?'' before doing anything dangerous. This is @code{t} by
- default.
- @item gnus-expert-user
- @vindex gnus-expert-user
- If this variable is non-@code{nil}, you will seldom be asked any
- questions by Gnus. It will simply assume you know what you're doing, no
- matter how strange.
- @item gnus-interactive-catchup
- @vindex gnus-interactive-catchup
- Require confirmation before catching up a group if non-@code{nil}. It
- is @code{t} by default.
- @item gnus-interactive-exit
- @vindex gnus-interactive-exit
- Require confirmation before exiting Gnus. This variable is @code{t} by
- default.
- @end table
- @node Symbolic Prefixes
- @section Symbolic Prefixes
- @cindex symbolic prefixes
- Quite a lot of Emacs commands react to the (numeric) prefix. For
- instance, @kbd{C-u 4 C-f} moves point four characters forward, and
- @kbd{C-u 9 0 0 I s s p} adds a permanent @code{Subject} substring score
- rule of 900 to the current article.
- This is all nice and well, but what if you want to give a command some
- additional information? Well, what most commands do is interpret the
- ``raw'' prefix in some special way. @kbd{C-u 0 C-x C-s} means that one
- doesn't want a backup file to be created when saving the current buffer,
- for instance. But what if you want to save without making a backup
- file, and you want Emacs to flash lights and play a nice tune at the
- same time? You can't, and you're probably perfectly happy that way.
- @kindex M-i @r{(Summary)}
- @findex gnus-symbolic-argument
- I'm not, so I've added a second prefix---the @dfn{symbolic prefix}. The
- prefix key is @kbd{M-i} (@code{gnus-symbolic-argument}), and the next
- character typed in is the value. You can stack as many @kbd{M-i}
- prefixes as you want. @kbd{M-i a C-M-u} means ``feed the @kbd{C-M-u}
- command the symbolic prefix @code{a}''. @kbd{M-i a M-i b C-M-u} means
- ``feed the @kbd{C-M-u} command the symbolic prefixes @code{a} and
- @code{b}''. You get the drift.
- Typing in symbolic prefixes to commands that don't accept them doesn't
- hurt, but it doesn't do any good either. Currently not many Gnus
- functions make use of the symbolic prefix.
- If you're interested in how Gnus implements this, @pxref{Extended
- Interactive}.
- @node Formatting Variables
- @section Formatting Variables
- @cindex formatting variables
- Throughout this manual you've probably noticed lots of variables called
- things like @code{gnus-group-line-format} and
- @code{gnus-summary-mode-line-format}. These control how Gnus is to
- output lines in the various buffers. There's quite a lot of them.
- Fortunately, they all use the same syntax, so there's not that much to
- be annoyed by.
- Here's an example format spec (from the group buffer): @samp{%M%S%5y:
- %(%g%)\n}. We see that it is indeed extremely ugly, and that there are
- lots of percentages everywhere.
- @menu
- * Formatting Basics:: A formatting variable is basically a format string.
- * Mode Line Formatting:: Some rules about mode line formatting variables.
- * Advanced Formatting:: Modifying output in various ways.
- * User-Defined Specs:: Having Gnus call your own functions.
- * Formatting Fonts:: Making the formatting look colorful and nice.
- @end menu
- Currently Gnus uses the following formatting variables:
- @code{gnus-group-line-format}, @code{gnus-summary-line-format},
- @code{gnus-server-line-format}, @code{gnus-topic-line-format},
- @code{gnus-group-mode-line-format},
- @code{gnus-summary-mode-line-format},
- @code{gnus-article-mode-line-format},
- @code{gnus-server-mode-line-format}, and
- @code{gnus-summary-pick-line-format}.
- All these format variables can also be arbitrary elisp forms. In that
- case, they will be @code{eval}ed to insert the required lines.
- @kindex M-x gnus-update-format
- @findex gnus-update-format
- Gnus includes a command to help you while creating your own format
- specs. @kbd{M-x gnus-update-format} will @code{eval} the current form,
- update the spec in question and pop you to a buffer where you can
- examine the resulting lisp code to be run to generate the line.
- @node Formatting Basics
- @subsection Formatting Basics
- Each @samp{%} element will be replaced by some string or other when the
- buffer in question is generated. @samp{%5y} means ``insert the @samp{y}
- spec, and pad with spaces to get a 5-character field''.
- As with normal C and Emacs Lisp formatting strings, the numerical
- modifier between the @samp{%} and the formatting type character will
- @dfn{pad} the output so that it is always at least that long.
- @samp{%5y} will make the field always (at least) five characters wide by
- padding with spaces to the left. If you say @samp{%-5y}, it will pad to
- the right instead.
- You may also wish to limit the length of the field to protect against
- particularly wide values. For that you can say @samp{%4,6y}, which
- means that the field will never be more than 6 characters wide and never
- less than 4 characters wide.
- @node Mode Line Formatting
- @subsection Mode Line Formatting
- Mode line formatting variables (e.g.,
- @code{gnus-summary-mode-line-format}) follow the same rules as other,
- buffer line oriented formatting variables (@pxref{Formatting Basics})
- with the following two differences:
- @enumerate
- @item
- There must be no newline (@samp{\n}) at the end.
- @item
- The special @samp{%%b} spec can be used to display the buffer name.
- Well, it's no spec at all, really---@samp{%%} is just a way to quote
- @samp{%} to allow it to pass through the formatting machinery unmangled,
- so that Emacs receives @samp{%b}, which is something the Emacs mode line
- display interprets to mean ``show the buffer name''. For a full list of
- mode line specs Emacs understands, see the documentation of the
- @code{mode-line-format} variable.
- @end enumerate
- @node Advanced Formatting
- @subsection Advanced Formatting
- It is frequently useful to post-process the fields in some way.
- Padding, limiting, cutting off parts and suppressing certain values can
- be achieved by using @dfn{tilde modifiers}. A typical tilde spec might
- look like @samp{%~(cut 3)~(ignore "0")y}.
- These are the valid modifiers:
- @table @code
- @item pad
- @itemx pad-left
- Pad the field to the left with spaces until it reaches the required
- length.
- @item pad-right
- Pad the field to the right with spaces until it reaches the required
- length.
- @item max
- @itemx max-left
- Cut off characters from the left until it reaches the specified length.
- @item max-right
- Cut off characters from the right until it reaches the specified
- length.
- @item cut
- @itemx cut-left
- Cut off the specified number of characters from the left.
- @item cut-right
- Cut off the specified number of characters from the right.
- @item ignore
- Return an empty string if the field is equal to the specified value.
- @item form
- Use the specified form as the field value when the @samp{@@} spec is
- used.
- @end table
- Let's take an example. The @samp{%o} spec in the summary mode lines
- will return a date in compact ISO8601 format---@samp{19960809T230410}.
- This is quite a mouthful, so we want to shave off the century number and
- the time, leaving us with a six-character date. That would be
- @samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}. (Cutting is done before
- maxing, and we need the padding to ensure that the date is never less
- than 6 characters to make it look nice in columns.)
- Ignoring is done first; then cutting; then maxing; and then as the very
- last operation, padding.
- If you use lots of these advanced thingies, you'll find that Gnus gets
- quite slow. This can be helped enormously by running @kbd{M-x
- gnus-compile} when you are satisfied with the look of your lines.
- @xref{Compilation}.
- @node User-Defined Specs
- @subsection User-Defined Specs
- All the specs allow for inserting user defined specifiers---@samp{u}.
- The next character in the format string should be a letter. Gnus
- will call the function @code{gnus-user-format-function-}@samp{X}, where
- @samp{X} is the letter following @samp{%u}. The function will be passed
- a single parameter---what the parameter means depends on what buffer
- it's being called from. The function should return a string, which will
- be inserted into the buffer just like information from any other
- specifier. This function may also be called with dummy values, so it
- should protect against that.
- You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve
- much the same without defining new functions. Here's an example:
- @samp{%~(form (count-lines (point-min) (point)))@@}. The form
- given here will be evaluated to yield the current line number, and then
- inserted.
- @node Formatting Fonts
- @subsection Formatting Fonts
- There are specs for highlighting, and these are shared by all the format
- variables. Text inside the @samp{%(} and @samp{%)} specifiers will get
- the special @code{mouse-face} property set, which means that it will be
- highlighted (with @code{gnus-mouse-face}) when you put the mouse pointer
- over it.
- Text inside the @samp{%@{} and @samp{%@}} specifiers will have their
- normal faces set using @code{gnus-face-0}, which is @code{bold} by
- default. If you say @samp{%1@{}, you'll get @code{gnus-face-1} instead,
- and so on. Create as many faces as you wish. The same goes for the
- @code{mouse-face} specs---you can say @samp{%3(hello%)} to have
- @samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}.
- Text inside the @samp{%<} and @samp{%>} specifiers will get the special
- @code{balloon-help} property set to @code{gnus-balloon-face-0}. If you
- say @samp{%1<}, you'll get @code{gnus-balloon-face-1} and so on. The
- @code{gnus-balloon-face-*} variables should be either strings or symbols
- naming functions that return a string. Under @code{balloon-help-mode},
- when the mouse passes over text with this property set, a balloon window
- will appear and display the string. Please refer to the doc string of
- @code{balloon-help-mode} for more information on this.
- Here's an alternative recipe for the group buffer:
- @lisp
- ;; Create three face types.
- (setq gnus-face-1 'bold)
- (setq gnus-face-3 'italic)
- ;; We want the article count to be in
- ;; a bold and green face. So we create
- ;; a new face called `my-green-bold'.
- (copy-face 'bold 'my-green-bold)
- ;; Set the color.
- (set-face-foreground 'my-green-bold "ForestGreen")
- (setq gnus-face-2 'my-green-bold)
- ;; Set the new & fancy format.
- (setq gnus-group-line-format
- "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n")
- @end lisp
- I'm sure you'll be able to use this scheme to create totally unreadable
- and extremely vulgar displays. Have fun!
- Note that the @samp{%(} specs (and friends) do not make any sense on the
- mode-line variables.
- @node Windows Configuration
- @section Windows Configuration
- @cindex windows configuration
- No, there's nothing here about X, so be quiet.
- @vindex gnus-use-full-window
- If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all
- other windows and occupy the entire Emacs screen by itself. It is
- @code{t} by default.
- Setting this variable to @code{nil} kinda works, but there are
- glitches. Use at your own peril.
- @vindex gnus-buffer-configuration
- @code{gnus-buffer-configuration} describes how much space each Gnus
- buffer should be given. Here's an excerpt of this variable:
- @lisp
- ((group (vertical 1.0 (group 1.0 point)
- (if gnus-carpal (group-carpal 4))))
- (article (vertical 1.0 (summary 0.25 point)
- (article 1.0))))
- @end lisp
- This is an alist. The @dfn{key} is a symbol that names some action or
- other. For instance, when displaying the group buffer, the window
- configuration function will use @code{group} as the key. A full list of
- possible names is listed below.
- The @dfn{value} (i.e., the @dfn{split}) says how much space each buffer
- should occupy. To take the @code{article} split as an example -
- @lisp
- (article (vertical 1.0 (summary 0.25 point)
- (article 1.0)))
- @end lisp
- This @dfn{split} says that the summary buffer should occupy 25% of upper
- half of the screen, and that it is placed over the article buffer. As
- you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all
- reaching for that calculator there). However, the special number
- @code{1.0} is used to signal that this buffer should soak up all the
- rest of the space available after the rest of the buffers have taken
- whatever they need. There should be only one buffer with the @code{1.0}
- size spec per split.
- Point will be put in the buffer that has the optional third element
- @code{point}. In a @code{frame} split, the last subsplit having a leaf
- split where the tag @code{frame-focus} is a member (i.e. is the third or
- fourth element in the list, depending on whether the @code{point} tag is
- present) gets focus.
- Here's a more complicated example:
- @lisp
- (article (vertical 1.0 (group 4)
- (summary 0.25 point)
- (if gnus-carpal (summary-carpal 4))
- (article 1.0)))
- @end lisp
- If the size spec is an integer instead of a floating point number,
- then that number will be used to say how many lines a buffer should
- occupy, not a percentage.
- If the @dfn{split} looks like something that can be @code{eval}ed (to be
- precise---if the @code{car} of the split is a function or a subr), this
- split will be @code{eval}ed. If the result is non-@code{nil}, it will
- be used as a split. This means that there will be three buffers if
- @code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal}
- is non-@code{nil}.
- Not complicated enough for you? Well, try this on for size:
- @lisp
- (article (horizontal 1.0
- (vertical 0.5
- (group 1.0)
- (gnus-carpal 4))
- (vertical 1.0
- (summary 0.25 point)
- (summary-carpal 4)
- (article 1.0))))
- @end lisp
- Whoops. Two buffers with the mystery 100% tag. And what's that
- @code{horizontal} thingie?
- If the first element in one of the split is @code{horizontal}, Gnus will
- split the window horizontally, giving you two windows side-by-side.
- Inside each of these strips you may carry on all you like in the normal
- fashion. The number following @code{horizontal} says what percentage of
- the screen is to be given to this strip.
- For each split, there @emph{must} be one element that has the 100% tag.
- The splitting is never accurate, and this buffer will eat any leftover
- lines from the splits.
- To be slightly more formal, here's a definition of what a valid split
- may look like:
- @example
- split = frame | horizontal | vertical | buffer | form
- frame = "(frame " size *split ")"
- horizontal = "(horizontal " size *split ")"
- vertical = "(vertical " size *split ")"
- buffer = "(" buf-name " " size *[ "point" ] *[ "frame-focus"] ")"
- size = number | frame-params
- buf-name = group | article | summary ...
- @end example
- The limitations are that the @code{frame} split can only appear as the
- top-level split. @var{form} should be an Emacs Lisp form that should
- return a valid split. We see that each split is fully recursive, and
- may contain any number of @code{vertical} and @code{horizontal} splits.
- @vindex gnus-window-min-width
- @vindex gnus-window-min-height
- @cindex window height
- @cindex window width
- Finding the right sizes can be a bit complicated. No window may be less
- than @code{gnus-window-min-height} (default 1) characters high, and all
- windows must be at least @code{gnus-window-min-width} (default 1)
- characters wide. Gnus will try to enforce this before applying the
- splits. If you want to use the normal Emacs window width/height limit,
- you can just set these two variables to @code{nil}.
- If you're not familiar with Emacs terminology, @code{horizontal} and
- @code{vertical} splits may work the opposite way of what you'd expect.
- Windows inside a @code{horizontal} split are shown side-by-side, and
- windows within a @code{vertical} split are shown above each other.
- @findex gnus-configure-frame
- If you want to experiment with window placement, a good tip is to call
- @code{gnus-configure-frame} directly with a split. This is the function
- that does all the real work when splitting buffers. Below is a pretty
- nonsensical configuration with 5 windows; two for the group buffer and
- three for the article buffer. (I said it was nonsensical.) If you
- @code{eval} the statement below, you can get an idea of how that would
- look straight away, without going through the normal Gnus channels.
- Play with it until you're satisfied, and then use
- @code{gnus-add-configuration} to add your new creation to the buffer
- configuration list.
- @lisp
- (gnus-configure-frame
- '(horizontal 1.0
- (vertical 10
- (group 1.0)
- (article 0.3 point))
- (vertical 1.0
- (article 1.0)
- (horizontal 4
- (group 1.0)
- (article 10)))))
- @end lisp
- You might want to have several frames as well. No prob---just use the
- @code{frame} split:
- @lisp
- (gnus-configure-frame
- '(frame 1.0
- (vertical 1.0
- (summary 0.25 point frame-focus)
- (article 1.0))
- (vertical ((height . 5) (width . 15)
- (user-position . t)
- (left . -1) (top . 1))
- (picon 1.0))))
- @end lisp
- This split will result in the familiar summary/article window
- configuration in the first (or ``main'') frame, while a small additional
- frame will be created where picons will be shown. As you can see,
- instead of the normal @code{1.0} top-level spec, each additional split
- should have a frame parameter alist as the size spec.
- @xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp
- Reference Manual}. Under XEmacs, a frame property list will be
- accepted, too---for instance, @code{(height 5 width 15 left -1 top 1)}
- is such a plist.
- The list of all possible keys for @code{gnus-buffer-configuration} can
- be found in its default value.
- Note that the @code{message} key is used for both
- @code{gnus-group-mail} and @code{gnus-summary-mail-other-window}. If
- it is desirable to distinguish between the two, something like this
- might be used:
- @lisp
- (message (horizontal 1.0
- (vertical 1.0 (message 1.0 point))
- (vertical 0.24
- (if (buffer-live-p gnus-summary-buffer)
- '(summary 0.5))
- (group 1.0)))))
- @end lisp
- One common desire for a multiple frame split is to have a separate frame
- for composing mail and news while leaving the original frame intact. To
- accomplish that, something like the following can be done:
- @lisp
- (message
- (frame 1.0
- (if (not (buffer-live-p gnus-summary-buffer))
- (car (cdr (assoc 'group gnus-buffer-configuration)))
- (car (cdr (assoc 'summary gnus-buffer-configuration))))
- (vertical ((user-position . t) (top . 1) (left . 1)
- (name . "Message"))
- (message 1.0 point))))
- @end lisp
- @findex gnus-add-configuration
- Since the @code{gnus-buffer-configuration} variable is so long and
- complicated, there's a function you can use to ease changing the config
- of a single setting: @code{gnus-add-configuration}. If, for instance,
- you want to change the @code{article} setting, you could say:
- @lisp
- (gnus-add-configuration
- '(article (vertical 1.0
- (group 4)
- (summary .25 point)
- (article 1.0))))
- @end lisp
- You'd typically stick these @code{gnus-add-configuration} calls in your
- @file{.gnus.el} file or in some startup hook---they should be run after
- Gnus has been loaded.
- @vindex gnus-always-force-window-configuration
- If all windows mentioned in the configuration are already visible, Gnus
- won't change the window configuration. If you always want to force the
- ``right'' window configuration, you can set
- @code{gnus-always-force-window-configuration} to non-@code{nil}.
- If you're using tree displays (@pxref{Tree Display}), and the tree
- window is displayed vertically next to another window, you may also want
- to fiddle with @code{gnus-tree-minimize-window} to avoid having the
- windows resized.
- @subsection Example Window Configurations
- @itemize @bullet
- @item
- Narrow left hand side occupied by group buffer. Right hand side split
- between summary buffer (top one-sixth) and article buffer (bottom).
- @ifinfo
- @example
- +---+---------+
- | G | Summary |
- | r +---------+
- | o | |
- | u | Article |
- | p | |
- +---+---------+
- @end example
- @end ifinfo
- @lisp
- (gnus-add-configuration
- '(article
- (horizontal 1.0
- (vertical 25 (group 1.0))
- (vertical 1.0
- (summary 0.16 point)
- (article 1.0)))))
- (gnus-add-configuration
- '(summary
- (horizontal 1.0
- (vertical 25 (group 1.0))
- (vertical 1.0 (summary 1.0 point)))))
- @end lisp
- @end itemize
- @node Faces and Fonts
- @section Faces and Fonts
- @cindex faces
- @cindex fonts
- @cindex colors
- Fiddling with fonts and faces used to be very difficult, but these days
- it is very simple. You simply say @kbd{M-x customize-face}, pick out
- the face you want to alter, and alter it via the standard Customize
- interface.
- @node Compilation
- @section Compilation
- @cindex compilation
- @cindex byte-compilation
- @findex gnus-compile
- Remember all those line format specification variables?
- @code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so
- on. Now, Gnus will of course heed whatever these variables are, but,
- unfortunately, changing them will mean a quite significant slow-down.
- (The default values of these variables have byte-compiled functions
- associated with them, while the user-generated versions do not, of
- course.)
- To help with this, you can run @kbd{M-x gnus-compile} after you've
- fiddled around with the variables and feel that you're (kind of)
- satisfied. This will result in the new specs being byte-compiled, and
- you'll get top speed again. Gnus will save these compiled specs in the
- @file{.newsrc.eld} file. (User-defined functions aren't compiled by
- this function, though---you should compile them yourself by sticking
- them into the @code{.gnus.el} file and byte-compiling that file.)
- @node Mode Lines
- @section Mode Lines
- @cindex mode lines
- @vindex gnus-updated-mode-lines
- @code{gnus-updated-mode-lines} says what buffers should keep their mode
- lines updated. It is a list of symbols. Supported symbols include
- @code{group}, @code{article}, @code{summary}, @code{server},
- @code{browse}, and @code{tree}. If the corresponding symbol is present,
- Gnus will keep that mode line updated with information that may be
- pertinent. If this variable is @code{nil}, screen refresh may be
- quicker.
- @cindex display-time
- @vindex gnus-mode-non-string-length
- By default, Gnus displays information on the current article in the mode
- lines of the summary and article buffers. The information Gnus wishes
- to display (e.g. the subject of the article) is often longer than the
- mode lines, and therefore have to be cut off at some point. The
- @code{gnus-mode-non-string-length} variable says how long the other
- elements on the line is (i.e., the non-info part). If you put
- additional elements on the mode line (e.g. a clock), you should modify
- this variable:
- @c Hook written by Francesco Potorti` <pot@cnuce.cnr.it>
- @lisp
- (add-hook 'display-time-hook
- (lambda () (setq gnus-mode-non-string-length
- (+ 21
- (if line-number-mode 5 0)
- (if column-number-mode 4 0)
- (length display-time-string)))))
- @end lisp
- If this variable is @code{nil} (which is the default), the mode line
- strings won't be chopped off, and they won't be padded either. Note
- that the default is unlikely to be desirable, as even the percentage
- complete in the buffer may be crowded off the mode line; the user should
- configure this variable appropriately for her configuration.
- @node Highlighting and Menus
- @section Highlighting and Menus
- @cindex visual
- @cindex highlighting
- @cindex menus
- @vindex gnus-visual
- The @code{gnus-visual} variable controls most of the Gnus-prettifying
- aspects. If @code{nil}, Gnus won't attempt to create menus or use fancy
- colors or fonts. This will also inhibit loading the @file{gnus-vis.el}
- file.
- This variable can be a list of visual properties that are enabled. The
- following elements are valid, and are all included by default:
- @table @code
- @item group-highlight
- Do highlights in the group buffer.
- @item summary-highlight
- Do highlights in the summary buffer.
- @item article-highlight
- Do highlights in the article buffer.
- @item highlight
- Turn on highlighting in all buffers.
- @item group-menu
- Create menus in the group buffer.
- @item summary-menu
- Create menus in the summary buffers.
- @item article-menu
- Create menus in the article buffer.
- @item browse-menu
- Create menus in the browse buffer.
- @item server-menu
- Create menus in the server buffer.
- @item score-menu
- Create menus in the score buffers.
- @item menu
- Create menus in all buffers.
- @end table
- So if you only want highlighting in the article buffer and menus in all
- buffers, you could say something like:
- @lisp
- (setq gnus-visual '(article-highlight menu))
- @end lisp
- If you want highlighting only and no menus whatsoever, you'd say:
- @lisp
- (setq gnus-visual '(highlight))
- @end lisp
- If @code{gnus-visual} is @code{t}, highlighting and menus will be used
- in all Gnus buffers.
- Other general variables that influence the look of all buffers include:
- @table @code
- @item gnus-mouse-face
- @vindex gnus-mouse-face
- This is the face (i.e., font) used for mouse highlighting in Gnus. No
- mouse highlights will be done if @code{gnus-visual} is @code{nil}.
- @end table
- There are hooks associated with the creation of all the different menus:
- @table @code
- @item gnus-article-menu-hook
- @vindex gnus-article-menu-hook
- Hook called after creating the article mode menu.
- @item gnus-group-menu-hook
- @vindex gnus-group-menu-hook
- Hook called after creating the group mode menu.
- @item gnus-summary-menu-hook
- @vindex gnus-summary-menu-hook
- Hook called after creating the summary mode menu.
- @item gnus-server-menu-hook
- @vindex gnus-server-menu-hook
- Hook called after creating the server mode menu.
- @item gnus-browse-menu-hook
- @vindex gnus-browse-menu-hook
- Hook called after creating the browse mode menu.
- @item gnus-score-menu-hook
- @vindex gnus-score-menu-hook
- Hook called after creating the score mode menu.
- @end table
- @node Buttons
- @section Buttons
- @cindex buttons
- @cindex mouse
- @cindex click
- Those new-fangled @dfn{mouse} contraptions are very popular with the
- young, hep kids who don't want to learn the proper way to do things
- these days. Why, I remember way back in the summer of '89, when I was
- using Emacs on a Tops 20 system. Three hundred users on one single
- machine, and every user was running Simula compilers. Bah!
- Right.
- @vindex gnus-carpal
- Well, you can make Gnus display buffers full of buttons you can click to
- do anything by setting @code{gnus-carpal} to @code{t}. Pretty simple,
- really. Tell the chiropractor I sent you.
- @table @code
- @item gnus-carpal-mode-hook
- @vindex gnus-carpal-mode-hook
- Hook run in all carpal mode buffers.
- @item gnus-carpal-button-face
- @vindex gnus-carpal-button-face
- Face used on buttons.
- @item gnus-carpal-header-face
- @vindex gnus-carpal-header-face
- Face used on carpal buffer headers.
- @item gnus-carpal-group-buffer-buttons
- @vindex gnus-carpal-group-buffer-buttons
- Buttons in the group buffer.
- @item gnus-carpal-summary-buffer-buttons
- @vindex gnus-carpal-summary-buffer-buttons
- Buttons in the summary buffer.
- @item gnus-carpal-server-buffer-buttons
- @vindex gnus-carpal-server-buffer-buttons
- Buttons in the server buffer.
- @item gnus-carpal-browse-buffer-buttons
- @vindex gnus-carpal-browse-buffer-buttons
- Buttons in the browse buffer.
- @end table
- All the @code{buttons} variables are lists. The elements in these list
- are either cons cells where the @code{car} contains a text to be displayed and
- the @code{cdr} contains a function symbol, or a simple string.
- @node Daemons
- @section Daemons
- @cindex demons
- @cindex daemons
- Gnus, being larger than any program ever written (allegedly), does lots
- of strange stuff that you may wish to have done while you're not
- present. For instance, you may want it to check for new mail once in a
- while. Or you may want it to close down all connections to all servers
- when you leave Emacs idle. And stuff like that.
- Gnus will let you do stuff like that by defining various
- @dfn{handlers}. Each handler consists of three elements: A
- @var{function}, a @var{time}, and an @var{idle} parameter.
- Here's an example of a handler that closes connections when Emacs has
- been idle for thirty minutes:
- @lisp
- (gnus-demon-close-connections nil 30)
- @end lisp
- Here's a handler that scans for PGP headers every hour when Emacs is
- idle:
- @lisp
- (gnus-demon-scan-pgp 60 t)
- @end lisp
- This @var{time} parameter and than @var{idle} parameter work together
- in a strange, but wonderful fashion. Basically, if @var{idle} is
- @code{nil}, then the function will be called every @var{time} minutes.
- If @var{idle} is @code{t}, then the function will be called after
- @var{time} minutes only if Emacs is idle. So if Emacs is never idle,
- the function will never be called. But once Emacs goes idle, the
- function will be called every @var{time} minutes.
- If @var{idle} is a number and @var{time} is a number, the function will
- be called every @var{time} minutes only when Emacs has been idle for
- @var{idle} minutes.
- If @var{idle} is a number and @var{time} is @code{nil}, the function
- will be called once every time Emacs has been idle for @var{idle}
- minutes.
- And if @var{time} is a string, it should look like @samp{07:31}, and
- the function will then be called once every day somewhere near that
- time. Modified by the @var{idle} parameter, of course.
- @vindex gnus-demon-timestep
- (When I say ``minute'' here, I really mean @code{gnus-demon-timestep}
- seconds. This is 60 by default. If you change that variable,
- all the timings in the handlers will be affected.)
- So, if you want to add a handler, you could put something like this in
- your @file{.gnus} file:
- @findex gnus-demon-add-handler
- @lisp
- (gnus-demon-add-handler 'gnus-demon-close-connections 30 t)
- @end lisp
- @findex gnus-demon-add-nocem
- @findex gnus-demon-add-scanmail
- @findex gnus-demon-add-rescan
- @findex gnus-demon-add-scan-timestamps
- @findex gnus-demon-add-disconnection
- Some ready-made functions to do this have been created:
- @code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection},
- @code{gnus-demon-add-nntp-close-connection},
- @code{gnus-demon-add-scan-timestamps}, @code{gnus-demon-add-rescan}, and
- @code{gnus-demon-add-scanmail}. Just put those functions in your
- @file{.gnus} if you want those abilities.
- @findex gnus-demon-init
- @findex gnus-demon-cancel
- @vindex gnus-demon-handlers
- If you add handlers to @code{gnus-demon-handlers} directly, you should
- run @code{gnus-demon-init} to make the changes take hold. To cancel all
- daemons, you can use the @code{gnus-demon-cancel} function.
- Note that adding daemons can be pretty naughty if you over do it. Adding
- functions that scan all news and mail from all servers every two seconds
- is a sure-fire way of getting booted off any respectable system. So
- behave.
- @node NoCeM
- @section NoCeM
- @cindex nocem
- @cindex spam
- @dfn{Spamming} is posting the same article lots and lots of times.
- Spamming is bad. Spamming is evil.
- Spamming is usually canceled within a day or so by various anti-spamming
- agencies. These agencies usually also send out @dfn{NoCeM} messages.
- NoCeM is pronounced ``no see-'em'', and means what the name
- implies---these are messages that make the offending articles, like, go
- away.
- What use are these NoCeM messages if the articles are canceled anyway?
- Some sites do not honor cancel messages and some sites just honor cancels
- from a select few people. Then you may wish to make use of the NoCeM
- messages, which are distributed in the @samp{alt.nocem.misc} newsgroup.
- Gnus can read and parse the messages in this group automatically, and
- this will make spam disappear.
- There are some variables to customize, of course:
- @table @code
- @item gnus-use-nocem
- @vindex gnus-use-nocem
- Set this variable to @code{t} to set the ball rolling. It is @code{nil}
- by default.
- @item gnus-nocem-groups
- @vindex gnus-nocem-groups
- Gnus will look for NoCeM messages in the groups in this list. The
- default is @code{("news.lists.filters" "news.admin.net-abuse.bulletins"
- "alt.nocem.misc" "news.admin.net-abuse.announce")}.
- @item gnus-nocem-issuers
- @vindex gnus-nocem-issuers
- There are many people issuing NoCeM messages. This list says what
- people you want to listen to. The default is @code{("Automoose-1"
- "clewis@@ferret.ocunix.on.ca" "cosmo.roadkill" "SpamHippo"
- "hweede@@snafu.de")}; fine, upstanding citizens all of them.
- Known despammers that you can put in this list are listed at
- @uref{http://www.xs4all.nl/~rosalind/nocemreg/nocemreg.html}.
- You do not have to heed NoCeM messages from all these people---just the
- ones you want to listen to. You also don't have to accept all NoCeM
- messages from the people you like. Each NoCeM message has a @dfn{type}
- header that gives the message a (more or less, usually less) rigorous
- definition. Common types are @samp{spam}, @samp{spew}, @samp{mmf},
- @samp{binary}, and @samp{troll}. To specify this, you have to use
- @code{(@var{issuer} @var{conditions} @dots{})} elements in the list.
- Each condition is either a string (which is a regexp that matches types
- you want to use) or a list on the form @code{(not @var{string})}, where
- @var{string} is a regexp that matches types you don't want to use.
- For instance, if you want all NoCeM messages from Chris Lewis except his
- @samp{troll} messages, you'd say:
- @lisp
- ("clewis@@ferret.ocunix.on.ca" ".*" (not "troll"))
- @end lisp
- On the other hand, if you just want nothing but his @samp{spam} and
- @samp{spew} messages, you'd say:
- @lisp
- ("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam")
- @end lisp
- The specs are applied left-to-right.
- @item gnus-nocem-verifyer
- @vindex gnus-nocem-verifyer
- @findex mc-verify
- This should be a function for verifying that the NoCeM issuer is who she
- says she is. The default is @code{mc-verify}, which is a Mailcrypt
- function. If this is too slow and you don't care for verification
- (which may be dangerous), you can set this variable to @code{nil}.
- If you want signed NoCeM messages to be verified and unsigned messages
- not to be verified (but used anyway), you could do something like:
- @lisp
- (setq gnus-nocem-verifyer 'my-gnus-mc-verify)
- (defun my-gnus-mc-verify ()
- (not (eq 'forged
- (ignore-errors
- (if (mc-verify)
- t
- 'forged)))))
- @end lisp
- This might be dangerous, though.
- @item gnus-nocem-directory
- @vindex gnus-nocem-directory
- This is where Gnus will store its NoCeM cache files. The default is
- @file{~/News/NoCeM/}.
- @item gnus-nocem-expiry-wait
- @vindex gnus-nocem-expiry-wait
- The number of days before removing old NoCeM entries from the cache.
- The default is 15. If you make it shorter Gnus will be faster, but you
- might then see old spam.
- @item gnus-nocem-check-from
- @vindex gnus-nocem-check-from
- Non-@code{nil} means check for valid issuers in message bodies.
- Otherwise don't bother fetching articles unless their author matches a
- valid issuer; that is much faster if you are selective about the
- issuers.
- @item gnus-nocem-check-article-limit
- @vindex gnus-nocem-check-article-limit
- If non-@code{nil}, the maximum number of articles to check in any NoCeM
- group. NoCeM groups can be huge and very slow to process.
- @end table
- Using NoCeM could potentially be a memory hog. If you have many living
- (i. e., subscribed or unsubscribed groups), your Emacs process will grow
- big. If this is a problem, you should kill off all (or most) of your
- unsubscribed groups (@pxref{Subscription Commands}).
- @node Undo
- @section Undo
- @cindex undo
- It is very useful to be able to undo actions one has done. In normal
- Emacs buffers, it's easy enough---you just push the @code{undo} button.
- In Gnus buffers, however, it isn't that simple.
- The things Gnus displays in its buffer is of no value whatsoever to
- Gnus---it's all just data designed to look nice to the user.
- Killing a group in the group buffer with @kbd{C-k} makes the line
- disappear, but that's just a side-effect of the real action---the
- removal of the group in question from the internal Gnus structures.
- Undoing something like that can't be done by the normal Emacs
- @code{undo} function.
- Gnus tries to remedy this somewhat by keeping track of what the user
- does and coming up with actions that would reverse the actions the user
- takes. When the user then presses the @code{undo} key, Gnus will run
- the code to reverse the previous action, or the previous actions.
- However, not all actions are easily reversible, so Gnus currently offers
- a few key functions to be undoable. These include killing groups,
- yanking groups, and changing the list of read articles of groups.
- That's it, really. More functions may be added in the future, but each
- added function means an increase in data to be stored, so Gnus will
- never be totally undoable.
- @findex gnus-undo-mode
- @vindex gnus-use-undo
- @findex gnus-undo
- The undoability is provided by the @code{gnus-undo-mode} minor mode. It
- is used if @code{gnus-use-undo} is non-@code{nil}, which is the
- default. The @kbd{C-M-_} key performs the @code{gnus-undo}
- command, which should feel kinda like the normal Emacs @code{undo}
- command.
- @node Moderation
- @section Moderation
- @cindex moderation
- If you are a moderator, you can use the @file{gnus-mdrtn.el} package.
- It is not included in the standard Gnus package. Write a mail to
- @samp{larsi@@gnus.org} and state what group you moderate, and you'll
- get a copy.
- The moderation package is implemented as a minor mode for summary
- buffers. Put
- @lisp
- (add-hook 'gnus-summary-mode-hook 'gnus-moderate)
- @end lisp
- in your @file{.gnus.el} file.
- If you are the moderator of @samp{rec.zoofle}, this is how it's
- supposed to work:
- @enumerate
- @item
- You split your incoming mail by matching on
- @samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-posted
- articles in some mail group---for instance, @samp{nnml:rec.zoofle}.
- @item
- You enter that group once in a while and post articles using the @kbd{e}
- (edit-and-post) or @kbd{s} (just send unedited) commands.
- @item
- If, while reading the @samp{rec.zoofle} newsgroup, you happen upon some
- articles that weren't approved by you, you can cancel them with the
- @kbd{c} command.
- @end enumerate
- To use moderation mode in these two groups, say:
- @lisp
- (setq gnus-moderated-list
- "^nnml:rec.zoofle$\\|^rec.zoofle$")
- @end lisp
- @node Emacs Enhancements
- @section Emacs Enhancements
- @cindex Emacs 21
- Starting with version 21, Emacs is able to display pictures and stuff,
- so Gnus has taken advantage of that.
- Gnus-specific tool bars will be used if Tool Bar mode is on. Currently
- the group, summary and message buffers have tool bars defined.
- MIME image types may be displayed internally if Emacs was built with
- appropriate support (see variable @code{image-types}). `X-Face' headers
- may be rendered as images internally if you have appropriate support
- programs (@pxref{X-Face}). You can play sounds internally if Emacs was
- built with suitable audio support; otherwise Gnus will attempt to play
- sounds externally.
- @vindex gnus-treat-display-smileys
- A simplified version of the XEmacs Smiley support for @dfn{emoticons}
- (@pxref{Smileys}) is available on graphical displays under the control
- of @code{gnus-treat-display-smileys}. Text `smiley' faces---@samp{:-)},
- @samp{:-/}, @samp{:-(} and the like---are mapped to pictures which are
- displayed instead. The mapping is controlled by a list of regexps
- @vindex smiley-regexp-alist
- @code{smiley-regexp-alist} mapping matched text to image file names. It
- contains matches for `smiley', `wry' and `frowny' by default.
- There is currently no Emacs support for `Picons' (@pxref{Picons}), but
- there is no reason why it couldn't be added.
- @node XEmacs Enhancements
- @section XEmacs Enhancements
- @cindex XEmacs
- XEmacs is able to display pictures and stuff, so Gnus has taken
- advantage of that.
- @menu
- * Picons:: How to display pictures of what your reading.
- * Smileys:: Show all those happy faces the way they were meant to be shown.
- * Toolbar:: Click'n'drool.
- * XVarious:: Other XEmacsy Gnusey variables.
- @end menu
- @node Picons
- @subsection Picons
- @iftex
- @iflatex
- \include{picons}
- @end iflatex
- @end iftex
- So@dots{} You want to slow down your news reader even more! This is a
- good way to do so. Its also a great way to impress people staring
- over your shoulder as you read news.
- @menu
- * Picon Basics:: What are picons and How do I get them.
- * Picon Requirements:: Don't go further if you aren't using XEmacs.
- * Easy Picons:: Displaying Picons---the easy way.
- * Hard Picons:: The way you should do it. You'll learn something.
- * Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with.
- @end menu
- @node Picon Basics
- @subsubsection Picon Basics
- What are Picons? To quote directly from the Picons Web site:
- @iftex
- @iflatex
- \margindex{}
- @end iflatex
- @end iftex
- @quotation
- @dfn{Picons} is short for ``personal icons''. They're small,
- constrained images used to represent users and domains on the net,
- organized into databases so that the appropriate image for a given
- e-mail address can be found. Besides users and domains, there are picon
- databases for Usenet newsgroups and weather forecasts. The picons are
- in either monochrome @code{XBM} format or color @code{XPM} and
- @code{GIF} formats.
- @end quotation
- @vindex gnus-picons-piconsearch-url
- If you have a permanent connection to the Internet you can use Steve
- Kinzler's Picons Search engine by setting
- @code{gnus-picons-piconsearch-url} to the string @*
- @uref{http://www.cs.indiana.edu/picons/search.html}.
- @vindex gnus-picons-database
- Otherwise you need a local copy of his database. For instructions on
- obtaining and installing the picons databases, point your Web browser at @*
- @uref{http://www.cs.indiana.edu/picons/ftp/index.html}. Gnus expects
- picons to be installed into a location pointed to by
- @code{gnus-picons-database}.
- @node Picon Requirements
- @subsubsection Picon Requirements
- To have Gnus display Picons for you, you must be running XEmacs
- 19.13 or greater since all other versions of Emacs aren't yet able to
- display images.
- Additionally, you must have @code{x} support compiled into XEmacs. To
- display color picons which are much nicer than the black & white one,
- you also need one of @code{xpm} or @code{gif} compiled into XEmacs.
- @vindex gnus-picons-convert-x-face
- If you want to display faces from @code{X-Face} headers, you should have
- the @code{xface} support compiled into XEmacs. Otherwise you must have
- the @code{netpbm} utilities installed, or munge the
- @code{gnus-picons-convert-x-face} variable to use something else.
- @node Easy Picons
- @subsubsection Easy Picons
- To enable displaying picons, simply put the following line in your
- @file{~/.gnus} file and start Gnus.
- @lisp
- (setq gnus-use-picons t)
- (setq gnus-treat-display-picons t)
- @end lisp
- and make sure @code{gnus-picons-database} points to the directory
- containing the Picons databases.
- Alternatively if you want to use the web piconsearch engine add this:
- @lisp
- (setq gnus-picons-piconsearch-url
- "http://www.cs.indiana.edu:800/piconsearch")
- @end lisp
- @node Hard Picons
- @subsubsection Hard Picons
- @iftex
- @iflatex
- \margindex{}
- @end iflatex
- @end iftex
- Gnus can display picons for you as you enter and leave groups and
- articles. It knows how to interact with three sections of the picons
- database. Namely, it can display the picons newsgroup pictures,
- author's face picture(s), and the authors domain. To enable this
- feature, you need to select where to get the picons from, and where to
- display them.
- @table @code
- @item gnus-picons-database
- @vindex gnus-picons-database
- The location of the picons database. Should point to a directory
- containing the @file{news}, @file{domains}, @file{users} (and so on)
- subdirectories. This is only useful if
- @code{gnus-picons-piconsearch-url} is @code{nil}. Defaults to
- @file{/usr/local/faces/}.
- @item gnus-picons-piconsearch-url
- @vindex gnus-picons-piconsearch-url
- The URL for the web picons search engine. The only currently known
- engine is @uref{http://www.cs.indiana.edu:800/piconsearch}. To
- workaround network delays, icons will be fetched in the background. If
- this is @code{nil} 'the default), then picons are fetched from local
- database indicated by @code{gnus-picons-database}.
- @item gnus-picons-display-where
- @vindex gnus-picons-display-where
- Where the picon images should be displayed. It is @code{picons} by
- default (which by default maps to the buffer @samp{*Picons*}). Other
- valid places could be @code{article}, @code{summary}, or
- @samp{*scratch*} for all I care. Just make sure that you've made the
- buffer visible using the standard Gnus window configuration
- routines---@pxref{Windows Configuration}.
- @item gnus-picons-group-excluded-groups
- @vindex gnus-picons-group-excluded-groups
- Groups that are matched by this regexp won't have their group icons
- displayed.
- @end table
- Note: If you set @code{gnus-use-picons} to @code{t}, it will set up your
- window configuration for you to include the @code{picons} buffer.
- Now that you've made those decision, you need to add the following
- functions to the appropriate hooks so these pictures will get displayed
- at the right time.
- @vindex gnus-picons-display-where
- @table @code
- @item gnus-article-display-picons
- @findex gnus-article-display-picons
- Looks up and displays the picons for the author and the author's domain
- in the @code{gnus-picons-display-where} buffer.
- @item gnus-picons-article-display-x-face
- @findex gnus-article-display-picons
- Decodes and displays the X-Face header if present.
- @end table
- @node Picon Useless Configuration
- @subsubsection Picon Useless Configuration
- @iftex
- @iflatex
- \margindex{}
- @end iflatex
- @end iftex
- The following variables offer further control over how things are
- done, where things are located, and other useless stuff you really
- don't need to worry about.
- @table @code
- @item gnus-picons-news-directories
- @vindex gnus-picons-news-directories
- List of subdirectories to search in @code{gnus-picons-database} for
- newsgroups faces. @code{("news")} is the default.
- @item gnus-picons-user-directories
- @vindex gnus-picons-user-directories
- List of subdirectories to search in @code{gnus-picons-database} for user
- faces. @code{("local" "users" "usenix" "misc")} is the default.
- @item gnus-picons-domain-directories
- @vindex gnus-picons-domain-directories
- List of subdirectories to search in @code{gnus-picons-database} for
- domain name faces. Defaults to @code{("domains")}. Some people may
- want to add @samp{"unknown"} to this list.
- @item gnus-picons-convert-x-face
- @vindex gnus-picons-convert-x-face
- If you don't have @code{xface} support builtin XEmacs, this is the
- command to use to convert the @code{X-Face} header to an X bitmap
- (@code{xbm}). Defaults to @code{(format "@{ echo '/* Width=48,
- Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s"
- gnus-picons-x-face-file-name)}
- @item gnus-picons-x-face-file-name
- @vindex gnus-picons-x-face-file-name
- Names a temporary file to store the @code{X-Face} bitmap in. Defaults
- to @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}.
- @item gnus-picons-has-modeline-p
- @vindex gnus-picons-has-modeline-p
- If you have set @code{gnus-picons-display-where} to @code{picons}, your
- XEmacs frame will become really cluttered. To alleviate this a bit you
- can set @code{gnus-picons-has-modeline-p} to @code{nil}; this will
- remove the mode line from the Picons buffer. This is only useful if
- @code{gnus-picons-display-where} is @code{picons}.
- @item gnus-picons-refresh-before-display
- @vindex gnus-picons-refresh-before-display
- If non-nil, display the article buffer before computing the picons.
- Defaults to @code{nil}.
- @item gnus-picons-display-as-address
- @vindex gnus-picons-display-as-address
- If @code{t} display textual email addresses along with pictures.
- Defaults to @code{t}.
- @item gnus-picons-file-suffixes
- @vindex gnus-picons-file-suffixes
- Ordered list of suffixes on picon file names to try. Defaults to
- @code{("xpm" "gif" "xbm")} minus those not builtin your XEmacs.
- @item gnus-picons-setup-hook
- @vindex gnus-picons-setup-hook
- Hook run in the picon buffer, if that is displayed.
- @item gnus-picons-display-article-move-p
- @vindex gnus-picons-display-article-move-p
- Whether to move point to first empty line when displaying picons. This
- has only an effect if `gnus-picons-display-where' has value `article'.
- If @code{nil}, display the picons in the @code{From} and
- @code{Newsgroups} lines. This is the default.
- @item gnus-picons-clear-cache-on-shutdown
- @vindex gnus-picons-clear-cache-on-shutdown
- Whether to clear the picons cache when exiting gnus. Gnus caches every
- picons it finds while it is running. This saves some time in the search
- process but eats some memory. If this variable is set to @code{nil},
- Gnus will never clear the cache itself; you will have to manually call
- @code{gnus-picons-clear-cache} to clear it. Otherwise the cache will be
- cleared every time you exit Gnus. Defaults to @code{t}.
- @iftex
- @iflatex
- \margindex{}
- @end iflatex
- @end iftex
- @end table
- @node Smileys
- @subsection Smileys
- @cindex smileys
- @iftex
- @iflatex
- \gnusfig{-3cm}{0.5cm}{\epsfig{figure=tmp/BigFace.ps,height=20cm}}
- \input{smiley}
- @end iflatex
- @end iftex
- @dfn{Smiley} is a package separate from Gnus, but since Gnus is
- currently the only package that uses Smiley, it is documented here.
- In short---to use Smiley in Gnus, put the following in your
- @file{.gnus.el} file:
- @lisp
- (setq gnus-treat-display-smileys t)
- @end lisp
- Smiley maps text smiley faces---@samp{:-)}, @samp{:-=}, @samp{:-(} and
- the like---to pictures and displays those instead of the text smiley
- faces. The conversion is controlled by a list of regexps that matches
- text and maps that to file names.
- @vindex smiley-nosey-regexp-alist
- @vindex smiley-deformed-regexp-alist
- Smiley supplies two example conversion alists by default:
- @code{smiley-deformed-regexp-alist} (which matches @samp{:)}, @samp{:(}
- and so on), and @code{smiley-nosey-regexp-alist} (which matches
- @samp{:-)}, @samp{:-(} and so on).
- The alist used is specified by the @code{smiley-regexp-alist} variable,
- which defaults to the value of @code{smiley-deformed-regexp-alist}.
- The first item in each element is the regexp to be matched; the second
- element is the regexp match group that is to be replaced by the picture;
- and the third element is the name of the file to be displayed.
- The following variables customize where Smiley will look for these
- files, as well as the color to be used and stuff:
- @table @code
- @item smiley-data-directory
- @vindex smiley-data-directory
- Where Smiley will look for smiley faces files.
- @item smiley-flesh-color
- @vindex smiley-flesh-color
- Skin color. The default is @samp{yellow}, which is really racist.
- @item smiley-features-color
- @vindex smiley-features-color
- Color of the features of the face. The default is @samp{black}.
- @item smiley-tongue-color
- @vindex smiley-tongue-color
- Color of the tongue. The default is @samp{red}.
- @item smiley-circle-color
- @vindex smiley-circle-color
- Color of the circle around the face. The default is @samp{black}.
- @item smiley-mouse-face
- @vindex smiley-mouse-face
- Face used for mouse highlighting over the smiley face.
- @end table
- @node Toolbar
- @subsection Toolbar
- @table @code
- @iftex
- @iflatex
- \margindex{}
- @end iflatex
- @end iftex
- @item gnus-use-toolbar
- @vindex gnus-use-toolbar
- If @code{nil}, don't display toolbars. If non-@code{nil}, it should be
- one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar},
- @code{right-toolbar}, or @code{left-toolbar}.
- @item gnus-group-toolbar
- @vindex gnus-group-toolbar
- The toolbar in the group buffer.
- @item gnus-summary-toolbar
- @vindex gnus-summary-toolbar
- The toolbar in the summary buffer.
- @item gnus-summary-mail-toolbar
- @vindex gnus-summary-mail-toolbar
- The toolbar in the summary buffer of mail groups.
- @end table
- @node XVarious
- @subsection Various XEmacs Variables
- @table @code
- @item gnus-xmas-glyph-directory
- @vindex gnus-xmas-glyph-directory
- This is where Gnus will look for pictures. Gnus will normally
- auto-detect this directory, but you may set it manually if you have an
- unusual directory structure.
- @item gnus-xmas-logo-color-alist
- @vindex gnus-xmas-logo-color-alist
- This is an alist where the key is a type symbol and the values are the
- foreground and background color of the splash page glyph.
- @item gnus-xmas-logo-color-style
- @vindex gnus-xmas-logo-color-style
- This is the key used to look up the color in the alist described above.
- Valid values include @code{flame}, @code{pine}, @code{moss},
- @code{irish}, @code{sky}, @code{tin}, @code{velvet}, @code{grape},
- @code{labia}, @code{berry}, @code{neutral}, and @code{september}.
- @item gnus-xmas-modeline-glyph
- @vindex gnus-xmas-modeline-glyph
- A glyph displayed in all Gnus mode lines. It is a tiny gnu head by
- default.
- @iftex
- @iflatex
- \margindex{}
- @end iflatex
- @end iftex
- @end table
- @node Fuzzy Matching
- @section Fuzzy Matching
- @cindex fuzzy matching
- Gnus provides @dfn{fuzzy matching} of @code{Subject} lines when doing
- things like scoring, thread gathering and thread comparison.
- As opposed to regular expression matching, fuzzy matching is very fuzzy.
- It's so fuzzy that there's not even a definition of what @dfn{fuzziness}
- means, and the implementation has changed over time.
- Basically, it tries to remove all noise from lines before comparing.
- @samp{Re: }, parenthetical remarks, white space, and so on, are filtered
- out of the strings before comparing the results. This often leads to
- adequate results---even when faced with strings generated by text
- manglers masquerading as newsreaders.
- @node Thwarting Email Spam
- @section Thwarting Email Spam
- @cindex email spam
- @cindex spam
- @cindex UCE
- @cindex unsolicited commercial email
- In these last days of the Usenet, commercial vultures are hanging about
- and grepping through news like crazy to find email addresses they can
- foist off their scams and products to. As a reaction to this, many
- people have started putting nonsense addresses into their @code{From}
- lines. I think this is counterproductive---it makes it difficult for
- people to send you legitimate mail in response to things you write, as
- well as making it difficult to see who wrote what. This rewriting may
- perhaps be a bigger menace than the unsolicited commercial email itself
- in the end.
- The biggest problem I have with email spam is that it comes in under
- false pretenses. I press @kbd{g} and Gnus merrily informs me that I
- have 10 new emails. I say ``Golly gee! Happy is me!'' and select the
- mail group, only to find two pyramid schemes, seven advertisements
- (``New! Miracle tonic for growing full, lustrous hair on your toes!'')
- and one mail asking me to repent and find some god.
- This is annoying.
- The way to deal with this is having Gnus split out all spam into a
- @samp{spam} mail group (@pxref{Splitting Mail}).
- First, pick one (1) valid mail address that you can be reached at, and
- put it in your @code{From} header of all your news articles. (I've
- chosen @samp{larsi@@trym.ifi.uio.no}, but for many addresses on the form
- @samp{larsi+usenet@@ifi.uio.no} will be a better choice. Ask your
- sysadmin whether your sendmail installation accepts keywords in the local
- part of the mail address.)
- @lisp
- (setq message-default-news-headers
- "From: Lars Magne Ingebrigtsen <larsi@@trym.ifi.uio.no>\n")
- @end lisp
- Then put the following split rule in @code{nnmail-split-fancy}
- (@pxref{Fancy Mail Splitting}):
- @lisp
- (
- ...
- (to "larsi@@trym.ifi.uio.no"
- (| ("subject" "re:.*" "misc")
- ("references" ".*@@.*" "misc")
- "spam"))
- ...
- )
- @end lisp
- This says that all mail to this address is suspect, but if it has a
- @code{Subject} that starts with a @samp{Re:} or has a @code{References}
- header, it's probably ok. All the rest goes to the @samp{spam} group.
- (This idea probably comes from Tim Pierce.)
- In addition, many mail spammers talk directly to your @code{smtp} server
- and do not include your email address explicitly in the @code{To}
- header. Why they do this is unknown---perhaps it's to thwart this
- thwarting scheme? In any case, this is trivial to deal with---you just
- put anything not addressed to you in the @samp{spam} group by ending
- your fancy split rule in this way:
- @lisp
- (
- ...
- (to "larsi" "misc")
- "spam")
- @end lisp
- In my experience, this will sort virtually everything into the right
- group. You still have to check the @samp{spam} group from time to time to
- check for legitimate mail, though. If you feel like being a good net
- citizen, you can even send off complaints to the proper authorities on
- each unsolicited commercial email---at your leisure.
- If you are also a lazy net citizen, you will probably prefer
- complaining automatically with the @file{gnus-junk.el} package,
- available as free software at @*
- @uref{http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html}. Since most
- e-mail spam is sent automatically, this may reconcile the cosmic
- balance somewhat.
- This works for me. It allows people an easy way to contact me (they can
- just press @kbd{r} in the usual way), and I'm not bothered at all with
- spam. It's a win-win situation. Forging @code{From} headers to point
- to non-existent domains is yucky, in my opinion.
- @node Various Various
- @section Various Various
- @cindex mode lines
- @cindex highlights
- @table @code
- @item gnus-home-directory
- All Gnus path variables will be initialized from this variable, which
- defaults to @file{~/}.
- @item gnus-directory
- @vindex gnus-directory
- Most Gnus storage path variables will be initialized from this variable,
- which defaults to the @samp{SAVEDIR} environment variable, or
- @file{~/News/} if that variable isn't set.
- Note that Gnus is mostly loaded when the @file{.gnus.el} file is read.
- This means that other directory variables that are initialized from this
- variable won't be set properly if you set this variable in
- @file{.gnus.el}. Set this variable in @file{.emacs} instead.
- @item gnus-default-directory
- @vindex gnus-default-directory
- Not related to the above variable at all---this variable says what the
- default directory of all Gnus buffers should be. If you issue commands
- like @kbd{C-x C-f}, the prompt you'll get starts in the current buffer's
- default directory. If this variable is @code{nil} (which is the
- default), the default directory will be the default directory of the
- buffer you were in when you started Gnus.
- @item gnus-verbose
- @vindex gnus-verbose
- This variable is an integer between zero and ten. The higher the value,
- the more messages will be displayed. If this variable is zero, Gnus
- will never flash any messages, if it is seven (which is the default),
- most important messages will be shown, and if it is ten, Gnus won't ever
- shut up, but will flash so many messages it will make your head swim.
- @item gnus-verbose-backends
- @vindex gnus-verbose-backends
- This variable works the same way as @code{gnus-verbose}, but it applies
- to the Gnus back ends instead of Gnus proper.
- @item nnheader-max-head-length
- @vindex nnheader-max-head-length
- When the back ends read straight heads of articles, they all try to read
- as little as possible. This variable (default 4096) specifies
- the absolute max length the back ends will try to read before giving up
- on finding a separator line between the head and the body. If this
- variable is @code{nil}, there is no upper read bound. If it is
- @code{t}, the back ends won't try to read the articles piece by piece,
- but read the entire articles. This makes sense with some versions of
- @code{ange-ftp} or @code{efs}.
- @item nnheader-head-chop-length
- @vindex nnheader-head-chop-length
- This variable (default 2048) says how big a piece of each article to
- read when doing the operation described above.
- @item nnheader-file-name-translation-alist
- @vindex nnheader-file-name-translation-alist
- @cindex file names
- @cindex invalid characters in file names
- @cindex characters in file names
- This is an alist that says how to translate characters in file names.
- For instance, if @samp{:} is invalid as a file character in file names
- on your system (you OS/2 user you), you could say something like:
- @lisp
- (setq nnheader-file-name-translation-alist
- '((?: . ?_)))
- @end lisp
- In fact, this is the default value for this variable on OS/2 and MS
- Windows (phooey) systems.
- @item gnus-hidden-properties
- @vindex gnus-hidden-properties
- This is a list of properties to use to hide ``invisible'' text. It is
- @code{(invisible t intangible t)} by default on most systems, which
- makes invisible text invisible and intangible.
- @item gnus-parse-headers-hook
- @vindex gnus-parse-headers-hook
- A hook called before parsing headers. It can be used, for instance, to
- gather statistics on the headers fetched, or perhaps you'd like to prune
- some headers. I don't see why you'd want that, though.
- @item gnus-shell-command-separator
- @vindex gnus-shell-command-separator
- String used to separate two shell commands. The default is @samp{;}.
- @item gnus-invalid-group-regexp
- @vindex gnus-invalid-group-regexp
- Regexp to match ``invalid'' group names when querying user for a group
- name. The default value catches some @strong{really} invalid group
- names who could possibly mess up Gnus internally (like allowing
- @samp{:} in a group name, which is normally used to delimit method and
- group).
- @sc{imap} users might want to allow @samp{/} in group names though.
- @end table
- @node The End
- @chapter The End
- Well, that's the manual---you can get on with your life now. Keep in
- touch. Say hello to your cats from me.
- My @strong{ghod}---I just can't stand goodbyes. Sniffle.
- Ol' Charles Reznikoff said it pretty well, so I leave the floor to him:
- @quotation
- @strong{Te Deum}
- @sp 1
- Not because of victories @*
- I sing,@*
- having none,@*
- but for the common sunshine,@*
- the breeze,@*
- the largess of the spring.
- @sp 1
- Not for victory@*
- but for the day's work done@*
- as well as I was able;@*
- not for a seat upon the dais@*
- but at the common table.@*
- @end quotation
- @node Appendices
- @chapter Appendices
- @menu
- * History:: How Gnus got where it is today.
- * On Writing Manuals:: Why this is not a beginner's guide.
- * Terminology:: We use really difficult, like, words here.
- * Customization:: Tailoring Gnus to your needs.
- * Troubleshooting:: What you might try if things do not work.
- * Gnus Reference Guide:: Rilly, rilly technical stuff.
- * Emacs for Heathens:: A short introduction to Emacsian terms.
- * Frequently Asked Questions:: A question-and-answer session.
- @end menu
- @node History
- @section History
- @cindex history
- @sc{gnus} was written by Masanobu @sc{Umeda}. When autumn crept up in
- '94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus.
- If you want to investigate the person responsible for this outrage,
- you can point your (feh!) web browser to
- @uref{http://quimby.gnus.org/}. This is also the primary
- distribution point for the new and spiffy versions of Gnus, and is
- known as The Site That Destroys Newsrcs And Drives People Mad.
- During the first extended alpha period of development, the new Gnus was
- called ``(ding) Gnus''. @dfn{(ding)} is, of course, short for
- @dfn{ding is not Gnus}, which is a total and utter lie, but who cares?
- (Besides, the ``Gnus'' in this abbreviation should probably be
- pronounced ``news'' as @sc{Umeda} intended, which makes it a more
- appropriate name, don't you think?)
- In any case, after spending all that energy on coming up with a new and
- spunky name, we decided that the name was @emph{too} spunky, so we
- renamed it back again to ``Gnus''. But in mixed case. ``Gnus'' vs.
- ``@sc{gnus}''. New vs. old.
- @menu
- * Gnus Versions:: What Gnus versions have been released.
- * Other Gnus Versions:: Other Gnus versions that also have been released.
- * Why?:: What's the point of Gnus?
- * Compatibility:: Just how compatible is Gnus with @sc{gnus}?
- * Conformity:: Gnus tries to conform to all standards.
- * Emacsen:: Gnus can be run on a few modern Emacsen.
- * Gnus Development:: How Gnus is developed.
- * Contributors:: Oodles of people.
- * New Features:: Pointers to some of the new stuff in Gnus.
- @end menu
- @node Gnus Versions
- @subsection Gnus Versions
- @cindex Pterodactyl Gnus
- @cindex ding Gnus
- @cindex September Gnus
- @cindex Quassia Gnus
- The first ``proper'' release of Gnus 5 was done in November 1995 when it
- was included in the Emacs 19.30 distribution (132 (ding) Gnus releases
- plus 15 Gnus 5.0 releases).
- In May 1996 the next Gnus generation (aka. ``September Gnus'' (after 99
- releases)) was released under the name ``Gnus 5.2'' (40 releases).
- On July 28th 1996 work on Red Gnus was begun, and it was released on
- January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases).
- On September 13th 1997, Quassia Gnus was started and lasted 37 releases.
- If was released as ``Gnus 5.6'' on March 8th 1998 (46 releases).
- Gnus 5.6 begat Pterodactyl Gnus on August 29th 1998 and was released as
- ``Gnus 5.8'' (after 99 releases and a CVS repository) on December 3rd
- 1999.
- If you happen upon a version of Gnus that has a prefixed name --
- ``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'' --
- don't panic. Don't let it know that you're frightened. Back away.
- Slowly. Whatever you do, don't run. Walk away, calmly, until you're
- out of its reach. Find a proper released version of Gnus and snuggle up
- to that instead.
- @node Other Gnus Versions
- @subsection Other Gnus Versions
- @cindex Semi-gnus
- In addition to the versions of Gnus which have had their releases
- coordinated by Lars, one major development has been Semi-gnus from
- Japan. It's based on a library called @sc{semi}, which provides
- @sc{mime} capabilities.
- These Gnusae are based mainly on Gnus 5.6 and Pterodactyl Gnus.
- Collectively, they are called ``Semi-gnus'', and different strains are
- called T-gnus, ET-gnus, Nana-gnus and Chaos. These provide powerful
- @sc{mime} and multilingualization things, especially important for
- Japanese users.
- @node Why?
- @subsection Why?
- What's the point of Gnus?
- I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep''
- newsreader, that lets you do anything you can think of. That was my
- original motivation, but while working on Gnus, it has become clear to
- me that this generation of newsreaders really belong in the stone age.
- Newsreaders haven't developed much since the infancy of the net. If the
- volume continues to rise with the current rate of increase, all current
- newsreaders will be pretty much useless. How do you deal with
- newsgroups that have thousands of new articles each day? How do you
- keep track of millions of people who post?
- Gnus offers no real solutions to these questions, but I would very much
- like to see Gnus being used as a testing ground for new methods of
- reading and fetching news. Expanding on @sc{Umeda}-san's wise decision
- to separate the newsreader from the back ends, Gnus now offers a simple
- interface for anybody who wants to write new back ends for fetching mail
- and news from different sources. I have added hooks for customizations
- everywhere I could imagine it being useful. By doing so, I'm inviting
- every one of you to explore and invent.
- May Gnus never be complete. @kbd{C-u 100 M-x all-hail-emacs} and
- @kbd{C-u 100 M-x all-hail-xemacs}.
- @node Compatibility
- @subsection Compatibility
- @cindex compatibility
- Gnus was designed to be fully compatible with @sc{gnus}. Almost all key
- bindings have been kept. More key bindings have been added, of course,
- but only in one or two obscure cases have old bindings been changed.
- Our motto is:
- @quotation
- @cartouche
- @center In a cloud bones of steel.
- @end cartouche
- @end quotation
- All commands have kept their names. Some internal functions have changed
- their names.
- The @code{gnus-uu} package has changed drastically. @xref{Decoding
- Articles}.
- One major compatibility question is the presence of several summary
- buffers. All variables relevant while reading a group are
- buffer-local to the summary buffer they belong in. Although many
- important variables have their values copied into their global
- counterparts whenever a command is executed in the summary buffer, this
- change might lead to incorrect values being used unless you are careful.
- All code that relies on knowledge of @sc{gnus} internals will probably
- fail. To take two examples: Sorting @code{gnus-newsrc-alist} (or
- changing it in any way, as a matter of fact) is strictly verboten. Gnus
- maintains a hash table that points to the entries in this alist (which
- speeds up many functions), and changing the alist directly will lead to
- peculiar results.
- @cindex hilit19
- @cindex highlighting
- Old hilit19 code does not work at all. In fact, you should probably
- remove all hilit code from all Gnus hooks
- (@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}).
- Gnus provides various integrated functions for highlighting. These are
- faster and more accurate. To make life easier for everybody, Gnus will
- by default remove all hilit calls from all hilit hooks. Uncleanliness!
- Away!
- Packages like @code{expire-kill} will no longer work. As a matter of
- fact, you should probably remove all old @sc{gnus} packages (and other
- code) when you start using Gnus. More likely than not, Gnus already
- does what you have written code to make @sc{gnus} do. (Snicker.)
- Even though old methods of doing things are still supported, only the
- new methods are documented in this manual. If you detect a new method of
- doing something while reading this manual, that does not mean you have
- to stop doing it the old way.
- Gnus understands all @sc{gnus} startup files.
- @kindex M-x gnus-bug
- @findex gnus-bug
- @cindex reporting bugs
- @cindex bugs
- Overall, a casual user who hasn't written much code that depends on
- @sc{gnus} internals should suffer no problems. If problems occur,
- please let me know by issuing that magic command @kbd{M-x gnus-bug}.
- @vindex gnus-bug-create-help-buffer
- If you are in the habit of sending bug reports @emph{very} often, you
- may find the helpful help buffer annoying after a while. If so, set
- @code{gnus-bug-create-help-buffer} to @code{nil} to avoid having it pop
- up at you.
- @node Conformity
- @subsection Conformity
- No rebels without a clue here, ma'am. We conform to all standards known
- to (wo)man. Except for those standards and/or conventions we disagree
- with, of course.
- @table @strong
- @item RFC 822
- @cindex RFC 822
- There are no known breaches of this standard.
- @item RFC 1036
- @cindex RFC 1036
- There are no known breaches of this standard, either.
- @item Son-of-RFC 1036
- @cindex Son-of-RFC 1036
- We do have some breaches to this one.
- @table @emph
- @item X-Newsreader
- @itemx User-Agent
- These are considered to be ``vanity headers'', while I consider them
- to be consumer information. After seeing so many badly formatted
- articles coming from @code{tin} and @code{Netscape} I know not to use
- either of those for posting articles. I would not have known that if
- it wasn't for the @code{X-Newsreader} header.
- @end table
- @item USEFOR
- @cindex USEFOR
- USEFOR is an IETF working group writing a successor to RFC 1036, based
- on Son-of-RFC 1036. They have produced a number of drafts proposing
- various changes to the format of news articles. The Gnus towers will
- look into implementing the changes when the draft is accepted as an RFC.
- @end table
- If you ever notice Gnus acting non-compliant with regards to the texts
- mentioned above, don't hesitate to drop a note to Gnus Towers and let us
- know.
- @node Emacsen
- @subsection Emacsen
- @cindex Emacsen
- @cindex XEmacs
- @cindex Mule
- @cindex Emacs
- Gnus should work on :
- @itemize @bullet
- @item
- Emacs 20.3 and up.
- @item
- XEmacs 20.4 and up.
- @end itemize
- This Gnus version will absolutely not work on any Emacsen older than
- that. Not reliably, at least. Older versions of Gnus may work on older
- Emacs versions.
- There are some vague differences between Gnus on the various
- platforms---XEmacs features more graphics (a logo and a toolbar)---but
- other than that, things should look pretty much the same under all
- Emacsen.
- @node Gnus Development
- @subsection Gnus Development
- Gnus is developed in a two-phased cycle. The first phase involves much
- discussion on the @samp{ding@@gnus.org} mailing list, where people
- propose changes and new features, post patches and new back ends. This
- phase is called the @dfn{alpha} phase, since the Gnusae released in this
- phase are @dfn{alpha releases}, or (perhaps more commonly in other
- circles) @dfn{snapshots}. During this phase, Gnus is assumed to be
- unstable and should not be used by casual users. Gnus alpha releases
- have names like ``Red Gnus'' and ``Quassia Gnus''.
- After futzing around for 50-100 alpha releases, Gnus is declared
- @dfn{frozen}, and only bug fixes are applied. Gnus loses the prefix,
- and is called things like ``Gnus 5.6.32'' instead. Normal people are
- supposed to be able to use these, and these are mostly discussed on the
- @samp{gnu.emacs.gnus} newsgroup.
- @cindex Incoming*
- @vindex mail-source-delete-incoming
- Some variable defaults differ between alpha Gnusae and released Gnusae.
- In particular, @code{mail-source-delete-incoming} defaults to @code{nil} in
- alpha Gnusae and @code{t} in released Gnusae. This is to prevent
- lossage of mail if an alpha release hiccups while handling the mail.
- The division of discussion between the ding mailing list and the Gnus
- newsgroup is not purely based on publicity concerns. It's true that
- having people write about the horrible things that an alpha Gnus release
- can do (sometimes) in a public forum may scare people off, but more
- importantly, talking about new experimental features that have been
- introduced may confuse casual users. New features are frequently
- introduced, fiddled with, and judged to be found wanting, and then
- either discarded or totally rewritten. People reading the mailing list
- usually keep up with these rapid changes, while people on the newsgroup
- can't be assumed to do so.
- @node Contributors
- @subsection Contributors
- @cindex contributors
- The new Gnus version couldn't have been done without the help of all the
- people on the (ding) mailing list. Every day for over a year I have
- gotten billions of nice bug reports from them, filling me with joy,
- every single one of them. Smooches. The people on the list have been
- tried beyond endurance, what with my ``oh, that's a neat idea <type
- type>, yup, I'll release it right away <ship off> no wait, that doesn't
- work at all <type type>, yup, I'll ship that one off right away <ship
- off> no, wait, that absolutely does not work'' policy for releases.
- Micro$oft---bah. Amateurs. I'm @emph{much} worse. (Or is that
- ``worser''? ``much worser''? ``worsest''?)
- I would like to take this opportunity to thank the Academy for... oops,
- wrong show.
- @itemize @bullet
- @item
- Masanobu @sc{Umeda}---the writer of the original @sc{gnus}.
- @item
- Shenghuo Zhu---uudecode.el, mm-uu.el, rfc1843.el, webmail.el,
- nnwarchive and many, many other things connected with @sc{mime} and
- other types of en/decoding, as well as general bug fixing, new
- functionality and stuff.
- @item
- Per Abrahamsen---custom, scoring, highlighting and @sc{soup} code (as
- well as numerous other things).
- @item
- Luis Fernandes---design and graphics.
- @item
- Justin Sheehy--the FAQ maintainer.
- @item
- Erik Naggum---help, ideas, support, code and stuff.
- @item
- Wes Hardaker---@file{gnus-picon.el} and the manual section on
- @dfn{picons} (@pxref{Picons}).
- @item
- Kim-Minh Kaplan---further work on the picon code.
- @item
- Brad Miller---@file{gnus-gl.el} and the GroupLens manual section
- (@pxref{GroupLens}).
- @item
- Sudish Joseph---innumerable bug fixes.
- @item
- Ilja Weis---@file{gnus-topic.el}.
- @item
- Steven L. Baur---lots and lots and lots of bugs detections and fixes.
- @item
- Vladimir Alexiev---the refcard and reference booklets.
- @item
- Felix Lee & Jamie Zawinski---I stole some pieces from the XGnus
- distribution by Felix Lee and JWZ.
- @item
- Scott Byer---@file{nnfolder.el} enhancements & rewrite.
- @item
- Peter Mutsaers---orphan article scoring code.
- @item
- Ken Raeburn---POP mail support.
- @item
- Hallvard B Furuseth---various bits and pieces, especially dealing with
- .newsrc files.
- @item
- Brian Edmonds---@file{gnus-bbdb.el}.
- @item
- David Moore---rewrite of @file{nnvirtual.el} and many other things.
- @item
- Kevin Davidson---came up with the name @dfn{ding}, so blame him.
- @item
- François Pinard---many, many interesting and thorough bug reports, as
- well as autoconf support.
- @end itemize
- This manual was proof-read by Adrian Aichner, with Ricardo Nassif, Mark
- Borges, and Jost Krieger proof-reading parts of the manual.
- The following people have contributed many patches and suggestions:
- Christopher Davis,
- Andrew Eskilsson,
- Kai Grossjohann,
- David Kågedal,
- Richard Pieri,
- Fabrice Popineau,
- Daniel Quinlan,
- Jason L. Tibbitts, III,
- and
- Jack Vinson.
- Also thanks to the following for patches and stuff:
- Jari Aalto,
- Adrian Aichner,
- Vladimir Alexiev,
- Russ Allbery,
- Peter Arius,
- Matt Armstrong,
- Marc Auslander,
- Miles Bader,
- Alexei V. Barantsev,
- Frank Bennett,
- Robert Bihlmeyer,
- Chris Bone,
- Mark Borges,
- Mark Boyns,
- Lance A. Brown,
- Rob Browning,
- Kees de Bruin,
- Martin Buchholz,
- Joe Buehler,
- Kevin Buhr,
- Alastair Burt,
- Joao Cachopo,
- Zlatko Calusic,
- Massimo Campostrini,
- Castor,
- David Charlap,
- Dan Christensen,
- Kevin Christian,
- Jae-you Chung, @c ?
- James H. Cloos, Jr.,
- Laura Conrad,
- Michael R. Cook,
- Glenn Coombs,
- Andrew J. Cosgriff,
- Neil Crellin,
- Frank D. Cringle,
- Geoffrey T. Dairiki,
- Andre Deparade,
- Ulrik Dickow,
- Dave Disser,
- Rui-Tao Dong, @c ?
- Joev Dubach,
- Michael Welsh Duggan,
- Dave Edmondson,
- Paul Eggert,
- Mark W. Eichin,
- Karl Eichwalder,
- Enami Tsugutomo, @c Enami
- Michael Ernst,
- Luc Van Eycken,
- Sam Falkner,
- Nelson Jose dos Santos Ferreira,
- Sigbjorn Finne,
- Sven Fischer,
- Paul Fisher,
- Decklin Foster,
- Gary D. Foster,
- Paul Franklin,
- Guy Geens,
- Arne Georg Gleditsch,
- David S. Goldberg,
- Michelangelo Grigni,
- Dale Hagglund,
- D. Hall,
- Magnus Hammerin,
- Kenichi Handa, @c Handa
- Raja R. Harinath,
- Yoshiki Hayashi, @c ?
- P. E. Jareth Hein,
- Hisashige Kenji, @c Hisashige
- Scott Hofmann,
- Marc Horowitz,
- Gunnar Horrigmo,
- Richard Hoskins,
- Brad Howes,
- Miguel de Icaza,
- François Felix Ingrand,
- Tatsuya Ichikawa, @c ?
- Ishikawa Ichiro, @c Ishikawa
- Lee Iverson,
- Iwamuro Motonori, @c Iwamuro
- Rajappa Iyer,
- Andreas Jaeger,
- Adam P. Jenkins,
- Randell Jesup,
- Fred Johansen,
- Gareth Jones,
- Simon Josefsson,
- Greg Klanderman,
- Karl Kleinpaste,
- Michael Klingbeil,
- Peter Skov Knudsen,
- Shuhei Kobayashi, @c Kobayashi
- Petr Konecny,
- Koseki Yoshinori, @c Koseki
- Thor Kristoffersen,
- Jens Lautenbacher,
- Martin Larose,
- Seokchan Lee, @c Lee
- Joerg Lenneis,
- Carsten Leonhardt,
- James LewisMoss,
- Christian Limpach,
- Markus Linnala,
- Dave Love,
- Mike McEwan,
- Tonny Madsen,
- Shlomo Mahlab,
- Nat Makarevitch,
- Istvan Marko,
- David Martin,
- Jason R. Mastaler,
- Gordon Matzigkeit,
- Timo Metzemakers,
- Richard Mlynarik,
- Lantz Moore,
- Morioka Tomohiko, @c Morioka
- Erik Toubro Nielsen,
- Hrvoje Niksic,
- Andy Norman,
- Fred Oberhauser,
- C. R. Oldham,
- Alexandre Oliva,
- Ken Olstad,
- Masaharu Onishi, @c Onishi
- Hideki Ono, @c Ono
- Ettore Perazzoli,
- William Perry,
- Stephen Peters,
- Jens-Ulrik Holger Petersen,
- Ulrich Pfeifer,
- Matt Pharr,
- Andy Piper,
- John McClary Prevost,
- Bill Pringlemeir,
- Mike Pullen,
- Jim Radford,
- Colin Rafferty,
- Lasse Rasinen,
- Lars Balker Rasmussen,
- Joe Reiss,
- Renaud Rioboo,
- Roland B. Roberts,
- Bart Robinson,
- Christian von Roques,
- Markus Rost,
- Jason Rumney,
- Wolfgang Rupprecht,
- Jay Sachs,
- Dewey M. Sasser,
- Conrad Sauerwald,
- Loren Schall,
- Dan Schmidt,
- Ralph Schleicher,
- Philippe Schnoebelen,
- Andreas Schwab,
- Randal L. Schwartz,
- Danny Siu,
- Matt Simmons,
- Paul D. Smith,
- Jeff Sparkes,
- Toby Speight,
- Michael Sperber,
- Darren Stalder,
- Richard Stallman,
- Greg Stark,
- Sam Steingold,
- Paul Stevenson,
- Jonas Steverud,
- Paul Stodghill,
- Kiyokazu Suto, @c Suto
- Kurt Swanson,
- Samuel Tardieu,
- Teddy,
- Chuck Thompson,
- Tozawa Akihiko, @c Tozawa
- Philippe Troin,
- James Troup,
- Trung Tran-Duc,
- Jack Twilley,
- Aaron M. Ucko,
- Aki Vehtari,
- Didier Verna,
- Vladimir Volovich,
- Jan Vroonhof,
- Stefan Waldherr,
- Pete Ware,
- Barry A. Warsaw,
- Christoph Wedler,
- Joe Wells,
- Lee Willis,
- Katsumi Yamaoka @c Yamaoka
- and
- Lloyd Zusman.
- For a full overview of what each person has done, the ChangeLogs
- included in the Gnus alpha distributions should give ample reading
- (550kB and counting).
- Apologies to everybody that I've forgotten, of which there are many, I'm
- sure.
- Gee, that's quite a list of people. I guess that must mean that there
- actually are people who are using Gnus. Who'd'a thunk it!
- @node New Features
- @subsection New Features
- @cindex new features
- @menu
- * ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.
- * September Gnus:: The Thing Formally Known As Gnus 5.2/5.3.
- * Red Gnus:: Third time best---Gnus 5.4/5.5.
- * Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.
- * Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.
- @end menu
- These lists are, of course, just @emph{short} overviews of the
- @emph{most} important new features. No, really. There are tons more.
- Yes, we have feeping creaturism in full effect.
- @node ding Gnus
- @subsubsection (ding) Gnus
- New features in Gnus 5.0/5.1:
- @itemize @bullet
- @item
- The look of all buffers can be changed by setting format-like variables
- (@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}).
- @item
- Local spool and several @sc{nntp} servers can be used at once
- (@pxref{Select Methods}).
- @item
- You can combine groups into virtual groups (@pxref{Virtual Groups}).
- @item
- You can read a number of different mail formats (@pxref{Getting Mail}).
- All the mail back ends implement a convenient mail expiry scheme
- (@pxref{Expiring Mail}).
- @item
- Gnus can use various strategies for gathering threads that have lost
- their roots (thereby gathering loose sub-threads into one thread) or it
- can go back and retrieve enough headers to build a complete thread
- (@pxref{Customizing Threading}).
- @item
- Killed groups can be displayed in the group buffer, and you can read
- them as well (@pxref{Listing Groups}).
- @item
- Gnus can do partial group updates---you do not have to retrieve the
- entire active file just to check for new articles in a few groups
- (@pxref{The Active File}).
- @item
- Gnus implements a sliding scale of subscribedness to groups
- (@pxref{Group Levels}).
- @item
- You can score articles according to any number of criteria
- (@pxref{Scoring}). You can even get Gnus to find out how to score
- articles for you (@pxref{Adaptive Scoring}).
- @item
- Gnus maintains a dribble buffer that is auto-saved the normal Emacs
- manner, so it should be difficult to lose much data on what you have
- read if your machine should go down (@pxref{Auto Save}).
- @item
- Gnus now has its own startup file (@file{.gnus}) to avoid cluttering up
- the @file{.emacs} file.
- @item
- You can set the process mark on both groups and articles and perform
- operations on all the marked items (@pxref{Process/Prefix}).
- @item
- You can grep through a subset of groups and create a group from the
- results (@pxref{Kibozed Groups}).
- @item
- You can list subsets of groups according to, well, anything
- (@pxref{Listing Groups}).
- @item
- You can browse foreign servers and subscribe to groups from those
- servers (@pxref{Browse Foreign Server}).
- @item
- Gnus can fetch articles, asynchronously, on a second connection to the
- server (@pxref{Asynchronous Fetching}).
- @item
- You can cache articles locally (@pxref{Article Caching}).
- @item
- The uudecode functions have been expanded and generalized
- (@pxref{Decoding Articles}).
- @item
- You can still post uuencoded articles, which was a little-known feature
- of @sc{gnus}' past (@pxref{Uuencoding and Posting}).
- @item
- Fetching parents (and other articles) now actually works without
- glitches (@pxref{Finding the Parent}).
- @item
- Gnus can fetch FAQs and group descriptions (@pxref{Group Information}).
- @item
- Digests (and other files) can be used as the basis for groups
- (@pxref{Document Groups}).
- @item
- Articles can be highlighted and customized (@pxref{Customizing
- Articles}).
- @item
- URLs and other external references can be buttonized (@pxref{Article
- Buttons}).
- @item
- You can do lots of strange stuff with the Gnus window & frame
- configuration (@pxref{Windows Configuration}).
- @item
- You can click on buttons instead of using the keyboard
- (@pxref{Buttons}).
- @end itemize
- @node September Gnus
- @subsubsection September Gnus
- @iftex
- @iflatex
- \gnusfig{-28cm}{0cm}{\epsfig{figure=tmp/september.ps,height=20cm}}
- @end iflatex
- @end iftex
- New features in Gnus 5.2/5.3:
- @itemize @bullet
- @item
- A new message composition mode is used. All old customization variables
- for @code{mail-mode}, @code{rnews-reply-mode} and @code{gnus-msg} are
- now obsolete.
- @item
- Gnus is now able to generate @dfn{sparse} threads---threads where
- missing articles are represented by empty nodes (@pxref{Customizing
- Threading}).
- @lisp
- (setq gnus-build-sparse-threads 'some)
- @end lisp
- @item
- Outgoing articles are stored on a special archive server
- (@pxref{Archived Messages}).
- @item
- Partial thread regeneration now happens when articles are
- referred.
- @item
- Gnus can make use of GroupLens predictions (@pxref{GroupLens}).
- @item
- Picons (personal icons) can be displayed under XEmacs (@pxref{Picons}).
- @item
- A @code{trn}-like tree buffer can be displayed (@pxref{Tree Display}).
- @lisp
- (setq gnus-use-trees t)
- @end lisp
- @item
- An @code{nn}-like pick-and-read minor mode is available for the summary
- buffers (@pxref{Pick and Read}).
- @lisp
- (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
- @end lisp
- @item
- In binary groups you can use a special binary minor mode (@pxref{Binary
- Groups}).
- @item
- Groups can be grouped in a folding topic hierarchy (@pxref{Group
- Topics}).
- @lisp
- (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
- @end lisp
- @item
- Gnus can re-send and bounce mail (@pxref{Summary Mail Commands}).
- @item
- Groups can now have a score, and bubbling based on entry frequency
- is possible (@pxref{Group Score}).
- @lisp
- (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)
- @end lisp
- @item
- Groups can be process-marked, and commands can be performed on
- groups of groups (@pxref{Marking Groups}).
- @item
- Caching is possible in virtual groups.
- @item
- @code{nndoc} now understands all kinds of digests, mail boxes, rnews
- news batches, ClariNet briefs collections, and just about everything
- else (@pxref{Document Groups}).
- @item
- Gnus has a new back end (@code{nnsoup}) to create/read SOUP packets
- (@pxref{SOUP}).
- @item
- The Gnus cache is much faster.
- @item
- Groups can be sorted according to many criteria (@pxref{Sorting
- Groups}).
- @item
- New group parameters have been introduced to set list-addresses and
- expiry times (@pxref{Group Parameters}).
- @item
- All formatting specs allow specifying faces to be used
- (@pxref{Formatting Fonts}).
- @item
- There are several more commands for setting/removing/acting on process
- marked articles on the @kbd{M P} submap (@pxref{Setting Process Marks}).
- @item
- The summary buffer can be limited to show parts of the available
- articles based on a wide range of criteria. These commands have been
- bound to keys on the @kbd{/} submap (@pxref{Limiting}).
- @item
- Articles can be made persistent with the @kbd{*} command
- (@pxref{Persistent Articles}).
- @item
- All functions for hiding article elements are now toggles.
- @item
- Article headers can be buttonized (@pxref{Article Washing}).
- @item
- All mail back ends support fetching articles by @code{Message-ID}.
- @item
- Duplicate mail can now be treated properly (@pxref{Duplicates}).
- @item
- All summary mode commands are available directly from the article
- buffer (@pxref{Article Keymap}).
- @item
- Frames can be part of @code{gnus-buffer-configuration} (@pxref{Windows
- Configuration}).
- @item
- Mail can be re-scanned by a daemonic process (@pxref{Daemons}).
- @iftex
- @iflatex
- \marginpar[\mbox{}\hfill\epsfig{figure=tmp/fseptember.ps,height=5cm}]{\epsfig{figure=tmp/fseptember.ps,height=5cm}}
- @end iflatex
- @end iftex
- @item
- Gnus can make use of NoCeM files to weed out spam (@pxref{NoCeM}).
- @lisp
- (setq gnus-use-nocem t)
- @end lisp
- @item
- Groups can be made permanently visible (@pxref{Listing Groups}).
- @lisp
- (setq gnus-permanently-visible-groups "^nnml:")
- @end lisp
- @item
- Many new hooks have been introduced to make customizing easier.
- @item
- Gnus respects the @code{Mail-Copies-To} header.
- @item
- Threads can be gathered by looking at the @code{References} header
- (@pxref{Customizing Threading}).
- @lisp
- (setq gnus-summary-thread-gathering-function
- 'gnus-gather-threads-by-references)
- @end lisp
- @item
- Read articles can be stored in a special backlog buffer to avoid
- refetching (@pxref{Article Backlog}).
- @lisp
- (setq gnus-keep-backlog 50)
- @end lisp
- @item
- A clean copy of the current article is always stored in a separate
- buffer to allow easier treatment.
- @item
- Gnus can suggest where to save articles (@pxref{Saving Articles}).
- @item
- Gnus doesn't have to do as much prompting when saving (@pxref{Saving
- Articles}).
- @lisp
- (setq gnus-prompt-before-saving t)
- @end lisp
- @item
- @code{gnus-uu} can view decoded files asynchronously while fetching
- articles (@pxref{Other Decode Variables}).
- @lisp
- (setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view)
- @end lisp
- @item
- Filling in the article buffer now works properly on cited text
- (@pxref{Article Washing}).
- @item
- Hiding cited text adds buttons to toggle hiding, and how much
- cited text to hide is now customizable (@pxref{Article Hiding}).
- @lisp
- (setq gnus-cited-lines-visible 2)
- @end lisp
- @item
- Boring headers can be hidden (@pxref{Article Hiding}).
- @item
- Default scoring values can now be set from the menu bar.
- @item
- Further syntax checking of outgoing articles have been added.
- @end itemize
- @node Red Gnus
- @subsubsection Red Gnus
- New features in Gnus 5.4/5.5:
- @iftex
- @iflatex
- \gnusfig{-5.5cm}{-4cm}{\epsfig{figure=tmp/red.ps,height=20cm}}
- @end iflatex
- @end iftex
- @itemize @bullet
- @item
- @file{nntp.el} has been totally rewritten in an asynchronous fashion.
- @item
- Article prefetching functionality has been moved up into
- Gnus (@pxref{Asynchronous Fetching}).
- @item
- Scoring can now be performed with logical operators like @code{and},
- @code{or}, @code{not}, and parent redirection (@pxref{Advanced
- Scoring}).
- @item
- Article washing status can be displayed in the
- article mode line (@pxref{Misc Article}).
- @item
- @file{gnus.el} has been split into many smaller files.
- @item
- Suppression of duplicate articles based on Message-ID can be done
- (@pxref{Duplicate Suppression}).
- @lisp
- (setq gnus-suppress-duplicates t)
- @end lisp
- @item
- New variables for specifying what score and adapt files are to be
- considered home score and adapt files (@pxref{Home Score File}) have
- been added.
- @item
- @code{nndoc} was rewritten to be easily extendable (@pxref{Document
- Server Internals}).
- @item
- Groups can inherit group parameters from parent topics (@pxref{Topic
- Parameters}).
- @item
- Article editing has been revamped and is now actually usable.
- @item
- Signatures can be recognized in more intelligent fashions
- (@pxref{Article Signature}).
- @item
- Summary pick mode has been made to look more @code{nn}-like. Line
- numbers are displayed and the @kbd{.} command can be used to pick
- articles (@code{Pick and Read}).
- @item
- Commands for moving the @file{.newsrc.eld} from one server to
- another have been added (@pxref{Changing Servers}).
- @item
- There's a way now to specify that ``uninteresting'' fields be suppressed
- when generating lines in buffers (@pxref{Advanced Formatting}).
- @item
- Several commands in the group buffer can be undone with @kbd{C-M-_}
- (@pxref{Undo}).
- @item
- Scoring can be done on words using the new score type @code{w}
- (@pxref{Score File Format}).
- @item
- Adaptive scoring can be done on a Subject word-by-word basis
- (@pxref{Adaptive Scoring}).
- @lisp
- (setq gnus-use-adaptive-scoring '(word))
- @end lisp
- @item
- Scores can be decayed (@pxref{Score Decays}).
- @lisp
- (setq gnus-decay-scores t)
- @end lisp
- @item
- Scoring can be performed using a regexp on the Date header. The Date is
- normalized to compact ISO 8601 format first (@pxref{Score File Format}).
- @item
- A new command has been added to remove all data on articles from
- the native server (@pxref{Changing Servers}).
- @item
- A new command for reading collections of documents
- (@code{nndoc} with @code{nnvirtual} on top) has been added---@kbd{C-M-d}
- (@pxref{Really Various Summary Commands}).
- @item
- Process mark sets can be pushed and popped (@pxref{Setting Process
- Marks}).
- @item
- A new mail-to-news back end makes it possible to post even when the @sc{nntp}
- server doesn't allow posting (@pxref{Mail-To-News Gateways}).
- @item
- A new back end for reading searches from Web search engines
- (@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) has been added
- (@pxref{Web Searches}).
- @item
- Groups inside topics can now be sorted using the standard sorting
- functions, and each topic can be sorted independently (@pxref{Topic
- Sorting}).
- @item
- Subsets of the groups can be sorted independently (@code{Sorting
- Groups}).
- @item
- Cached articles can be pulled into the groups (@pxref{Summary Generation
- Commands}).
- @iftex
- @iflatex
- \marginpar[\mbox{}\hfill\epsfig{figure=tmp/fred.ps,width=3cm}]{\epsfig{figure=tmp/fred.ps,width=3cm}}
- @end iflatex
- @end iftex
- @item
- Score files are now applied in a more reliable order (@pxref{Score
- Variables}).
- @item
- Reports on where mail messages end up can be generated (@pxref{Splitting
- Mail}).
- @item
- More hooks and functions have been added to remove junk from incoming
- mail before saving the mail (@pxref{Washing Mail}).
- @item
- Emphasized text can be properly fontisized:
- @end itemize
- @node Quassia Gnus
- @subsubsection Quassia Gnus
- New features in Gnus 5.6:
- @itemize @bullet
- @item
- New functionality for using Gnus as an offline newsreader has been
- added. A plethora of new commands and modes have been added. See
- @pxref{Gnus Unplugged} for the full story.
- @item
- The @code{nndraft} back end has returned, but works differently than
- before. All Message buffers are now also articles in the @code{nndraft}
- group, which is created automatically.
- @item
- @code{gnus-alter-header-function} can now be used to alter header
- values.
- @item
- @code{gnus-summary-goto-article} now accept Message-ID's.
- @item
- A new Message command for deleting text in the body of a message
- outside the region: @kbd{C-c C-v}.
- @item
- You can now post to component group in @code{nnvirtual} groups with
- @kbd{C-u C-c C-c}.
- @item
- @code{nntp-rlogin-program}---new variable to ease customization.
- @item
- @code{C-u C-c C-c} in @code{gnus-article-edit-mode} will now inhibit
- re-highlighting of the article buffer.
- @item
- New element in @code{gnus-boring-article-headers}---@code{long-to}.
- @item
- @kbd{M-i} symbolic prefix command. See the section "Symbolic
- Prefixes" in the Gnus manual for details.
- @item
- @kbd{L} and @kbd{I} in the summary buffer now take the symbolic prefix
- @kbd{a} to add the score rule to the "all.SCORE" file.
- @item
- @code{gnus-simplify-subject-functions} variable to allow greater
- control over simplification.
- @item
- @kbd{A T}---new command for fetching the current thread.
- @item
- @kbd{/ T}---new command for including the current thread in the
- limit.
- @item
- @kbd{M-@key{RET}} is a new Message command for breaking cited text.
- @item
- @samp{\\1}-expressions are now valid in @code{nnmail-split-methods}.
- @item
- The @code{custom-face-lookup} function has been removed.
- If you used this function in your initialization files, you must
- rewrite them to use @code{face-spec-set} instead.
- @item
- Canceling now uses the current select method. Symbolic prefix
- @kbd{a} forces normal posting method.
- @item
- New command to translate M******** sm*rtq**t*s into proper
- text---@kbd{W d}.
- @item
- For easier debugging of @code{nntp}, you can set
- @code{nntp-record-commands} to a non-@code{nil} value.
- @item
- @code{nntp} now uses @file{~/.authinfo}, a @file{.netrc}-like file, for
- controlling where and how to send @sc{authinfo} to @sc{nntp} servers.
- @item
- A command for editing group parameters from the summary buffer
- has been added.
- @item
- A history of where mails have been split is available.
- @item
- A new article date command has been added---@code{article-date-iso8601}.
- @item
- Subjects can be simplified when threading by setting
- @code{gnus-score-thread-simplify}.
- @item
- A new function for citing in Message has been
- added---@code{message-cite-original-without-signature}.
- @item
- @code{article-strip-all-blank-lines}---new article command.
- @item
- A new Message command to kill to the end of the article has
- been added.
- @item
- A minimum adaptive score can be specified by using the
- @code{gnus-adaptive-word-minimum} variable.
- @item
- The "lapsed date" article header can be kept continually
- updated by the @code{gnus-start-date-timer} command.
- @item
- Web listserv archives can be read with the @code{nnlistserv} back end.
- @item
- Old dejanews archives can now be read by @code{nnweb}.
- @end itemize
- @node Pterodactyl Gnus
- @subsubsection Pterodactyl Gnus
- New features in Gnus 5.8:
- @itemize @bullet
- @item The mail-fetching functions have changed. See the manual for the
- many details. In particular, all procmail fetching variables are gone.
- If you used procmail like in
- @lisp
- (setq nnmail-use-procmail t)
- (setq nnmail-spool-file 'procmail)
- (setq nnmail-procmail-directory "~/mail/incoming/")
- (setq nnmail-procmail-suffix "\\.in")
- @end lisp
- this now has changed to
- @lisp
- (setq mail-sources
- '((directory :path "~/mail/incoming/"
- :suffix ".in")))
- @end lisp
- More information is available in the info doc at Select Methods ->
- Getting Mail -> Mail Sources
- @item Gnus is now a MIME-capable reader. This affects many parts of
- Gnus, and adds a slew of new commands. See the manual for details.
- @item Gnus has also been multilingualized. This also affects too
- many parts of Gnus to summarize here, and adds many new variables.
- @item @code{gnus-auto-select-first} can now be a function to be
- called to position point.
- @item The user can now decide which extra headers should be included in
- summary buffers and NOV files.
- @item @code{gnus-article-display-hook} has been removed. Instead, a number
- of variables starting with @code{gnus-treat-} have been added.
- @item The Gnus posting styles have been redone again and now works in a
- subtly different manner.
- @item New web-based back ends have been added: @code{nnslashdot},
- @code{nnwarchive} and @code{nnultimate}. nnweb has been revamped,
- again, to keep up with ever-changing layouts.
- @item Gnus can now read IMAP mail via @code{nnimap}.
- @end itemize
- @iftex
- @page
- @node The Manual
- @section The Manual
- @cindex colophon
- @cindex manual
- This manual was generated from a TeXinfo file and then run through
- either @code{texi2dvi}
- @iflatex
- or my own home-brewed TeXinfo to \LaTeX\ transformer,
- and then run through @code{latex} and @code{dvips}
- @end iflatex
- to get what you hold in your hands now.
- The following conventions have been used:
- @enumerate
- @item
- This is a @samp{string}
- @item
- This is a @kbd{keystroke}
- @item
- This is a @file{file}
- @item
- This is a @code{symbol}
- @end enumerate
- So if I were to say ``set @code{flargnoze} to @samp{yes}'', that would
- mean:
- @lisp
- (setq flargnoze "yes")
- @end lisp
- If I say ``set @code{flumphel} to @code{yes}'', that would mean:
- @lisp
- (setq flumphel 'yes)
- @end lisp
- @samp{yes} and @code{yes} are two @emph{very} different things---don't
- ever get them confused.
- @iflatex
- @c @head
- Of course, everything in this manual is of vital interest, so you should
- read it all. Several times. However, if you feel like skimming the
- manual, look for that gnu head you should see in the margin over
- there---it means that what's being discussed is of more importance than
- the rest of the stuff. (On the other hand, if everything is infinitely
- important, how can anything be more important than that? Just one more
- of the mysteries of this world, I guess.)
- @end iflatex
- @end iftex
- @node On Writing Manuals
- @section On Writing Manuals
- I guess most manuals are written after-the-fact; documenting a program
- that's already there. This is not how this manual is written. When
- implementing something, I write the manual entry for that something
- straight away. I then see that it's difficult to explain the
- functionality, so I write how it's supposed to be, and then I change the
- implementation. Writing the documentation and writing the code goes
- hand in hand.
- This, of course, means that this manual has no, or little, flow. It
- documents absolutely everything in Gnus, but often not where you're
- looking for it. It is a reference manual, and not a guide to how to get
- started with Gnus.
- That would be a totally different book, that should be written using the
- reference manual as source material. It would look quite differently.
- @page
- @node Terminology
- @section Terminology
- @cindex terminology
- @table @dfn
- @item news
- @cindex news
- This is what you are supposed to use this thing for---reading news.
- News is generally fetched from a nearby @sc{nntp} server, and is
- generally publicly available to everybody. If you post news, the entire
- world is likely to read just what you have written, and they'll all
- snigger mischievously. Behind your back.
- @item mail
- @cindex mail
- Everything that's delivered to you personally is mail. Some news/mail
- readers (like Gnus) blur the distinction between mail and news, but
- there is a difference. Mail is private. News is public. Mailing is
- not posting, and replying is not following up.
- @item reply
- @cindex reply
- Send a mail to the person who has written what you are reading.
- @item follow up
- @cindex follow up
- Post an article to the current newsgroup responding to the article you
- are reading.
- @item back end
- @cindex back end
- Gnus gets fed articles from a number of back ends, both news and mail
- back ends. Gnus does not handle the underlying media, so to speak---this
- is all done by the back ends.
- @item native
- @cindex native
- Gnus will always use one method (and back end) as the @dfn{native}, or
- default, way of getting news.
- @item foreign
- @cindex foreign
- You can also have any number of foreign groups active at the same time.
- These are groups that use non-native non-secondary back ends for getting
- news.
- @item secondary
- @cindex secondary
- Secondary back ends are somewhere half-way between being native and being
- foreign, but they mostly act like they are native.
- @item article
- @cindex article
- A message that has been posted as news.
- @item mail message
- @cindex mail message
- A message that has been mailed.
- @item message
- @cindex message
- A mail message or news article
- @item head
- @cindex head
- The top part of a message, where administrative information (etc.) is
- put.
- @item body
- @cindex body
- The rest of an article. Everything not in the head is in the
- body.
- @item header
- @cindex header
- A line from the head of an article.
- @item headers
- @cindex headers
- A collection of such lines, or a collection of heads. Or even a
- collection of @sc{nov} lines.
- @item @sc{nov}
- @cindex nov
- When Gnus enters a group, it asks the back end for the headers of all
- unread articles in the group. Most servers support the News OverView
- format, which is more compact and much faster to read and parse than the
- normal @sc{head} format.
- @item level
- @cindex levels
- Each group is subscribed at some @dfn{level} or other (1-9). The ones
- that have a lower level are ``more'' subscribed than the groups with a
- higher level. In fact, groups on levels 1-5 are considered
- @dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9
- are @dfn{killed}. Commands for listing groups and scanning for new
- articles will all use the numeric prefix as @dfn{working level}.
- @item killed groups
- @cindex killed groups
- No information on killed groups is stored or updated, which makes killed
- groups much easier to handle than subscribed groups.
- @item zombie groups
- @cindex zombie groups
- Just like killed groups, only slightly less dead.
- @item active file
- @cindex active file
- The news server has to keep track of what articles it carries, and what
- groups exist. All this information in stored in the active file, which
- is rather large, as you might surmise.
- @item bogus groups
- @cindex bogus groups
- A group that exists in the @file{.newsrc} file, but isn't known to the
- server (i.e., it isn't in the active file), is a @emph{bogus group}.
- This means that the group probably doesn't exist (any more).
- @item activating
- @cindex activating groups
- The act of asking the server for info on a group and computing the
- number of unread articles is called @dfn{activating the group}.
- Un-activated groups are listed with @samp{*} in the group buffer.
- @item server
- @cindex server
- A machine one can connect to and get news (or mail) from.
- @item select method
- @cindex select method
- A structure that specifies the back end, the server and the virtual
- server settings.
- @item virtual server
- @cindex virtual server
- A named select method. Since a select method defines all there is to
- know about connecting to a (physical) server, taking the thing as a
- whole is a virtual server.
- @item washing
- @cindex washing
- Taking a buffer and running it through a filter of some sort. The
- result will (more often than not) be cleaner and more pleasing than the
- original.
- @item ephemeral groups
- @cindex ephemeral groups
- Most groups store data on what articles you have read. @dfn{Ephemeral}
- groups are groups that will have no data stored---when you exit the
- group, it'll disappear into the aether.
- @item solid groups
- @cindex solid groups
- This is the opposite of ephemeral groups. All groups listed in the
- group buffer are solid groups.
- @item sparse articles
- @cindex sparse articles
- These are article placeholders shown in the summary buffer when
- @code{gnus-build-sparse-threads} has been switched on.
- @item threading
- @cindex threading
- To put responses to articles directly after the articles they respond
- to---in a hierarchical fashion.
- @item root
- @cindex root
- @cindex thread root
- The first article in a thread is the root. It is the ancestor of all
- articles in the thread.
- @item parent
- @cindex parent
- An article that has responses.
- @item child
- @cindex child
- An article that responds to a different article---its parent.
- @item digest
- @cindex digest
- A collection of messages in one file. The most common digest format is
- specified by RFC 1153.
- @end table
- @page
- @node Customization
- @section Customization
- @cindex general customization
- All variables are properly documented elsewhere in this manual. This
- section is designed to give general pointers on how to customize Gnus
- for some quite common situations.
- @menu
- * Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
- * Slow Terminal Connection:: You run a remote Emacs.
- * Little Disk Space:: You feel that having large setup files is icky.
- * Slow Machine:: You feel like buying a faster machine.
- @end menu
- @node Slow/Expensive Connection
- @subsection Slow/Expensive @sc{nntp} Connection
- If you run Emacs on a machine locally, and get your news from a machine
- over some very thin strings, you want to cut down on the amount of data
- Gnus has to get from the @sc{nntp} server.
- @table @code
- @item gnus-read-active-file
- Set this to @code{nil}, which will inhibit Gnus from requesting the
- entire active file from the server. This file is often very large. You
- also have to set @code{gnus-check-new-newsgroups} and
- @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus
- doesn't suddenly decide to fetch the active file anyway.
- @item gnus-nov-is-evil
- This one has to be @code{nil}. If not, grabbing article headers from
- the @sc{nntp} server will not be very fast. Not all @sc{nntp} servers
- support @sc{xover}; Gnus will detect this by itself.
- @end table
- @node Slow Terminal Connection
- @subsection Slow Terminal Connection
- Let's say you use your home computer for dialing up the system that runs
- Emacs and Gnus. If your modem is slow, you want to reduce (as much as
- possible) the amount of data sent over the wires.
- @table @code
- @item gnus-auto-center-summary
- Set this to @code{nil} to inhibit Gnus from re-centering the summary
- buffer all the time. If it is @code{vertical}, do only vertical
- re-centering. If it is neither @code{nil} nor @code{vertical}, do both
- horizontal and vertical recentering.
- @item gnus-visible-headers
- Cut down on the headers included in the articles to the
- minimum. You can, in fact, make do without them altogether---most of the
- useful data is in the summary buffer, anyway. Set this variable to
- @samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need.
- Set this hook to all the available hiding commands:
- @lisp
- (setq gnus-treat-hide-headers 'head
- gnus-treat-hide-signature t
- gnus-treat-hide-citation t)
- @end lisp
- @item gnus-use-full-window
- By setting this to @code{nil}, you can make all the windows smaller.
- While this doesn't really cut down much generally, it means that you
- have to see smaller portions of articles before deciding that you didn't
- want to read them anyway.
- @item gnus-thread-hide-subtree
- If this is non-@code{nil}, all threads in the summary buffer will be
- hidden initially.
- @item gnus-updated-mode-lines
- If this is @code{nil}, Gnus will not put information in the buffer mode
- lines, which might save some time.
- @end table
- @node Little Disk Space
- @subsection Little Disk Space
- @cindex disk space
- The startup files can get rather large, so you may want to cut their
- sizes a bit if you are running out of space.
- @table @code
- @item gnus-save-newsrc-file
- If this is @code{nil}, Gnus will never save @file{.newsrc}---it will
- only save @file{.newsrc.eld}. This means that you will not be able to
- use any other newsreaders than Gnus. This variable is @code{t} by
- default.
- @item gnus-read-newsrc-file
- If this is @code{nil}, Gnus will never read @file{.newsrc}---it will
- only read @file{.newsrc.eld}. This means that you will not be able to
- use any other newsreaders than Gnus. This variable is @code{t} by
- default.
- @item gnus-save-killed-list
- If this is @code{nil}, Gnus will not save the list of dead groups. You
- should also set @code{gnus-check-new-newsgroups} to @code{ask-server}
- and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this
- variable to @code{nil}. This variable is @code{t} by default.
- @end table
- @node Slow Machine
- @subsection Slow Machine
- @cindex slow machine
- If you have a slow machine, or are just really impatient, there are a
- few things you can do to make Gnus run faster.
- Set @code{gnus-check-new-newsgroups} and
- @code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster.
- Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and
- @code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the
- summary buffer faster.
- @page
- @node Troubleshooting
- @section Troubleshooting
- @cindex troubleshooting
- Gnus works @emph{so} well straight out of the box---I can't imagine any
- problems, really.
- Ahem.
- @enumerate
- @item
- Make sure your computer is switched on.
- @item
- Make sure that you really load the current Gnus version. If you have
- been running @sc{gnus}, you need to exit Emacs and start it up again before
- Gnus will work.
- @item
- Try doing an @kbd{M-x gnus-version}. If you get something that looks
- like @samp{Gnus v5.46; nntp 4.0} you have the right files loaded. If,
- on the other hand, you get something like @samp{NNTP 3.x} or @samp{nntp
- flee}, you have some old @file{.el} files lying around. Delete these.
- @item
- Read the help group (@kbd{G h} in the group buffer) for a FAQ and a
- how-to.
- @item
- @vindex max-lisp-eval-depth
- Gnus works on many recursive structures, and in some extreme (and very
- rare) cases Gnus may recurse down ``too deeply'' and Emacs will beep at
- you. If this happens to you, set @code{max-lisp-eval-depth} to 500 or
- something like that.
- @end enumerate
- If all else fails, report the problem as a bug.
- @cindex bugs
- @cindex reporting bugs
- @kindex M-x gnus-bug
- @findex gnus-bug
- If you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug}
- command. @kbd{M-x set-variable @key{RET} debug-on-error @key{RET} t @key{RET}}, and send
- me the backtrace. I will fix bugs, but I can only fix them if you send
- me a precise description as to how to reproduce the bug.
- You really can never be too detailed in a bug report. Always use the
- @kbd{M-x gnus-bug} command when you make bug reports, even if it creates
- a 10Kb mail each time you use it, and even if you have sent me your
- environment 500 times before. I don't care. I want the full info each
- time.
- It is also important to remember that I have no memory whatsoever. If
- you send a bug report, and I send you a reply, and then you just send
- back ``No, it's not! Moron!'', I will have no idea what you are
- insulting me about. Always over-explain everything. It's much easier
- for all of us---if I don't have all the information I need, I will just
- mail you and ask for more info, and everything takes more time.
- If the problem you're seeing is very visual, and you can't quite explain
- it, copy the Emacs window to a file (with @code{xwd}, for instance), put
- it somewhere it can be reached, and include the URL of the picture in
- the bug report.
- If you just need help, you are better off asking on
- @samp{gnu.emacs.gnus}. I'm not very helpful.
- @cindex gnu.emacs.gnus
- @cindex ding mailing list
- You can also ask on the ding mailing list---@samp{ding@@gnus.org}.
- Write to @samp{ding-request@@gnus.org} to subscribe.
- @page
- @node Gnus Reference Guide
- @section Gnus Reference Guide
- It is my hope that other people will figure out smart stuff that Gnus
- can do, and that other people will write those smart things as well. To
- facilitate that I thought it would be a good idea to describe the inner
- workings of Gnus. And some of the not-so-inner workings, while I'm at
- it.
- You can never expect the internals of a program not to change, but I
- will be defining (in some details) the interface between Gnus and its
- back ends (this is written in stone), the format of the score files
- (ditto), data structures (some are less likely to change than others)
- and general methods of operation.
- @menu
- * Gnus Utility Functions:: Common functions and variable to use.
- * Back End Interface:: How Gnus communicates with the servers.
- * Score File Syntax:: A BNF definition of the score file standard.
- * Headers:: How Gnus stores headers internally.
- * Ranges:: A handy format for storing mucho numbers.
- * Group Info:: The group info format.
- * Extended Interactive:: Symbolic prefixes and stuff.
- * Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.
- * Various File Formats:: Formats of files that Gnus use.
- @end menu
- @node Gnus Utility Functions
- @subsection Gnus Utility Functions
- @cindex Gnus utility functions
- @cindex utility functions
- @cindex functions
- @cindex internal variables
- When writing small functions to be run from hooks (and stuff), it's
- vital to have access to the Gnus internal functions and variables.
- Below is a list of the most common ones.
- @table @code
- @item gnus-newsgroup-name
- @vindex gnus-newsgroup-name
- This variable holds the name of the current newsgroup.
- @item gnus-find-method-for-group
- @findex gnus-find-method-for-group
- A function that returns the select method for @var{group}.
- @item gnus-group-real-name
- @findex gnus-group-real-name
- Takes a full (prefixed) Gnus group name, and returns the unprefixed
- name.
- @item gnus-group-prefixed-name
- @findex gnus-group-prefixed-name
- Takes an unprefixed group name and a select method, and returns the full
- (prefixed) Gnus group name.
- @item gnus-get-info
- @findex gnus-get-info
- Returns the group info list for @var{group}.
- @item gnus-group-unread
- @findex gnus-group-unread
- The number of unread articles in @var{group}, or @code{t} if that is
- unknown.
- @item gnus-active
- @findex gnus-active
- The active entry for @var{group}.
- @item gnus-set-active
- @findex gnus-set-active
- Set the active entry for @var{group}.
- @item gnus-add-current-to-buffer-list
- @findex gnus-add-current-to-buffer-list
- Adds the current buffer to the list of buffers to be killed on Gnus
- exit.
- @item gnus-continuum-version
- @findex gnus-continuum-version
- Takes a Gnus version string as a parameter and returns a floating point
- number. Earlier versions will always get a lower number than later
- versions.
- @item gnus-group-read-only-p
- @findex gnus-group-read-only-p
- Says whether @var{group} is read-only or not.
- @item gnus-news-group-p
- @findex gnus-news-group-p
- Says whether @var{group} came from a news back end.
- @item gnus-ephemeral-group-p
- @findex gnus-ephemeral-group-p
- Says whether @var{group} is ephemeral or not.
- @item gnus-server-to-method
- @findex gnus-server-to-method
- Returns the select method corresponding to @var{server}.
- @item gnus-server-equal
- @findex gnus-server-equal
- Says whether two virtual servers are equal.
- @item gnus-group-native-p
- @findex gnus-group-native-p
- Says whether @var{group} is native or not.
- @item gnus-group-secondary-p
- @findex gnus-group-secondary-p
- Says whether @var{group} is secondary or not.
- @item gnus-group-foreign-p
- @findex gnus-group-foreign-p
- Says whether @var{group} is foreign or not.
- @item group-group-find-parameter
- @findex group-group-find-parameter
- Returns the parameter list of @var{group}. If given a second parameter,
- returns the value of that parameter for @var{group}.
- @item gnus-group-set-parameter
- @findex gnus-group-set-parameter
- Takes three parameters; @var{group}, @var{parameter} and @var{value}.
- @item gnus-narrow-to-body
- @findex gnus-narrow-to-body
- Narrows the current buffer to the body of the article.
- @item gnus-check-backend-function
- @findex gnus-check-backend-function
- Takes two parameters, @var{function} and @var{group}. If the back end
- @var{group} comes from supports @var{function}, return non-@code{nil}.
- @lisp
- (gnus-check-backend-function "request-scan" "nnml:misc")
- @result{} t
- @end lisp
- @item gnus-read-method
- @findex gnus-read-method
- Prompts the user for a select method.
- @end table
- @node Back End Interface
- @subsection Back End Interface
- Gnus doesn't know anything about @sc{nntp}, spools, mail or virtual
- groups. It only knows how to talk to @dfn{virtual servers}. A virtual
- server is a @dfn{back end} and some @dfn{back end variables}. As examples
- of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}. As
- examples of the latter we have @code{nntp-port-number} and
- @code{nnmbox-directory}.
- When Gnus asks for information from a back end---say @code{nntp}---on
- something, it will normally include a virtual server name in the
- function parameters. (If not, the back end should use the ``current''
- virtual server.) For instance, @code{nntp-request-list} takes a virtual
- server as its only (optional) parameter. If this virtual server hasn't
- been opened, the function should fail.
- Note that a virtual server name has no relation to some physical server
- name. Take this example:
- @lisp
- (nntp "odd-one"
- (nntp-address "ifi.uio.no")
- (nntp-port-number 4324))
- @end lisp
- Here the virtual server name is @samp{odd-one} while the name of
- the physical server is @samp{ifi.uio.no}.
- The back ends should be able to switch between several virtual servers.
- The standard back ends implement this by keeping an alist of virtual
- server environments that they pull down/push up when needed.
- There are two groups of interface functions: @dfn{required functions},
- which must be present, and @dfn{optional functions}, which Gnus will
- always check for presence before attempting to call 'em.
- All these functions are expected to return data in the buffer
- @code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat
- unfortunately named, but we'll have to live with it. When I talk about
- @dfn{resulting data}, I always refer to the data in that buffer. When I
- talk about @dfn{return value}, I talk about the function value returned by
- the function call. Functions that fail should return @code{nil} as the
- return value.
- Some back ends could be said to be @dfn{server-forming} back ends, and
- some might be said not to be. The latter are back ends that generally
- only operate on one group at a time, and have no concept of ``server''
- -- they have a group, and they deliver info on that group and nothing
- more.
- In the examples and definitions I will refer to the imaginary back end
- @code{nnchoke}.
- @cindex @code{nnchoke}
- @menu
- * Required Back End Functions:: Functions that must be implemented.
- * Optional Back End Functions:: Functions that need not be implemented.
- * Error Messaging:: How to get messages and report errors.
- * Writing New Back Ends:: Extending old back ends.
- * Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end.
- * Mail-like Back Ends:: Some tips on mail back ends.
- @end menu
- @node Required Back End Functions
- @subsubsection Required Back End Functions
- @table @code
- @item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD)
- @var{articles} is either a range of article numbers or a list of
- @code{Message-ID}s. Current back ends do not fully support either---only
- sequences (lists) of article numbers, and most back ends do not support
- retrieval of @code{Message-ID}s. But they should try for both.
- The result data should either be HEADs or NOV lines, and the result
- value should either be @code{headers} or @code{nov} to reflect this.
- This might later be expanded to @code{various}, which will be a mixture
- of HEADs and NOV lines, but this is currently not supported by Gnus.
- If @var{fetch-old} is non-@code{nil} it says to try fetching "extra
- headers", in some meaning of the word. This is generally done by
- fetching (at most) @var{fetch-old} extra headers less than the smallest
- article number in @code{articles}, and filling the gaps as well. The
- presence of this parameter can be ignored if the back end finds it
- cumbersome to follow the request. If this is non-@code{nil} and not a
- number, do maximum fetches.
- Here's an example HEAD:
- @example
- 221 1056 Article retrieved.
- Path: ifi.uio.no!sturles
- From: sturles@@ifi.uio.no (Sturle Sunde)
- Newsgroups: ifi.discussion
- Subject: Re: Something very droll
- Date: 27 Oct 1994 14:02:57 +0100
- Organization: Dept. of Informatics, University of Oslo, Norway
- Lines: 26
- Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no>
- References: <38jdmq$4qu@@visbur.ifi.uio.no>
- NNTP-Posting-Host: holmenkollen.ifi.uio.no
- .
- @end example
- So a @code{headers} return value would imply that there's a number of
- these in the data buffer.
- Here's a BNF definition of such a buffer:
- @example
- headers = *head
- head = error / valid-head
- error-message = [ "4" / "5" ] 2number " " <error message> eol
- valid-head = valid-message *header "." eol
- valid-message = "221 " <number> " Article retrieved." eol
- header = <text> eol
- @end example
- If the return value is @code{nov}, the data buffer should contain
- @dfn{network overview database} lines. These are basically fields
- separated by tabs.
- @example
- nov-buffer = *nov-line
- nov-line = 8*9 [ field <TAB> ] eol
- field = <text except TAB>
- @end example
- For a closer look at what should be in those fields,
- @pxref{Headers}.
- @item (nnchoke-open-server SERVER &optional DEFINITIONS)
- @var{server} is here the virtual server name. @var{definitions} is a
- list of @code{(VARIABLE VALUE)} pairs that define this virtual server.
- If the server can't be opened, no error should be signaled. The back end
- may then choose to refuse further attempts at connecting to this
- server. In fact, it should do so.
- If the server is opened already, this function should return a
- non-@code{nil} value. There should be no data returned.
- @item (nnchoke-close-server &optional SERVER)
- Close connection to @var{server} and free all resources connected
- to it. Return @code{nil} if the server couldn't be closed for some
- reason.
- There should be no data returned.
- @item (nnchoke-request-close)
- Close connection to all servers and free all resources that the back end
- have reserved. All buffers that have been created by that back end
- should be killed. (Not the @code{nntp-server-buffer}, though.) This
- function is generally only called when Gnus is shutting down.
- There should be no data returned.
- @item (nnchoke-server-opened &optional SERVER)
- If @var{server} is the current virtual server, and the connection to the
- physical server is alive, then this function should return a
- non-@code{nil} vlue. This function should under no circumstances
- attempt to reconnect to a server we have lost connection to.
- There should be no data returned.
- @item (nnchoke-status-message &optional SERVER)
- This function should return the last error message from @var{server}.
- There should be no data returned.
- @item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER)
- The result data from this function should be the article specified by
- @var{article}. This might either be a @code{Message-ID} or a number.
- It is optional whether to implement retrieval by @code{Message-ID}, but
- it would be nice if that were possible.
- If @var{to-buffer} is non-@code{nil}, the result data should be returned
- in this buffer instead of the normal data buffer. This is to make it
- possible to avoid copying large amounts of data from one buffer to
- another, while Gnus mainly requests articles to be inserted directly
- into its article buffer.
- If it is at all possible, this function should return a cons cell where
- the @code{car} is the group name the article was fetched from, and the @code{cdr} is
- the article number. This will enable Gnus to find out what the real
- group and article numbers are when fetching articles by
- @code{Message-ID}. If this isn't possible, @code{t} should be returned
- on successful article retrieval.
- @item (nnchoke-request-group GROUP &optional SERVER FAST)
- Get data on @var{group}. This function also has the side effect of
- making @var{group} the current group.
- If @var{fast}, don't bother to return useful data, just make @var{group}
- the current group.
- Here's an example of some result data and a definition of the same:
- @example
- 211 56 1000 1059 ifi.discussion
- @end example
- The first number is the status, which should be 211. Next is the
- total number of articles in the group, the lowest article number, the
- highest article number, and finally the group name. Note that the total
- number of articles may be less than one might think while just
- considering the highest and lowest article numbers, but some articles
- may have been canceled. Gnus just discards the total-number, so
- whether one should take the bother to generate it properly (if that is a
- problem) is left as an exercise to the reader.
- @example
- group-status = [ error / info ] eol
- error = [ "4" / "5" ] 2<number> " " <Error message>
- info = "211 " 3* [ <number> " " ] <string>
- @end example
- @item (nnchoke-close-group GROUP &optional SERVER)
- Close @var{group} and free any resources connected to it. This will be
- a no-op on most back ends.
- There should be no data returned.
- @item (nnchoke-request-list &optional SERVER)
- Return a list of all groups available on @var{server}. And that means
- @emph{all}.
- Here's an example from a server that only carries two groups:
- @example
- ifi.test 0000002200 0000002000 y
- ifi.discussion 3324 3300 n
- @end example
- On each line we have a group name, then the highest article number in
- that group, the lowest article number, and finally a flag.
- @example
- active-file = *active-line
- active-line = name " " <number> " " <number> " " flags eol
- name = <string>
- flags = "n" / "y" / "m" / "x" / "j" / "=" name
- @end example
- The flag says whether the group is read-only (@samp{n}), is moderated
- (@samp{m}), is dead (@samp{x}), is aliased to some other group
- (@samp{=other-group}) or none of the above (@samp{y}).
- @item (nnchoke-request-post &optional SERVER)
- This function should post the current buffer. It might return whether
- the posting was successful or not, but that's not required. If, for
- instance, the posting is done asynchronously, it has generally not been
- completed by the time this function concludes. In that case, this
- function should set up some kind of sentinel to beep the user loud and
- clear if the posting could not be completed.
- There should be no result data from this function.
- @end table
- @node Optional Back End Functions
- @subsubsection Optional Back End Functions
- @table @code
- @item (nnchoke-retrieve-groups GROUPS &optional SERVER)
- @var{groups} is a list of groups, and this function should request data
- on all those groups. How it does it is of no concern to Gnus, but it
- should attempt to do this in a speedy fashion.
- The return value of this function can be either @code{active} or
- @code{group}, which says what the format of the result data is. The
- former is in the same format as the data from
- @code{nnchoke-request-list}, while the latter is a buffer full of lines
- in the same format as @code{nnchoke-request-group} gives.
- @example
- group-buffer = *active-line / *group-status
- @end example
- @item (nnchoke-request-update-info GROUP INFO &optional SERVER)
- A Gnus group info (@pxref{Group Info}) is handed to the back end for
- alterations. This comes in handy if the back end really carries all the
- information (as is the case with virtual and imap groups). This
- function should destructively alter the info to suit its needs, and
- should return the (altered) group info.
- There should be no result data from this function.
- @item (nnchoke-request-type GROUP &optional ARTICLE)
- When the user issues commands for ``sending news'' (@kbd{F} in the
- summary buffer, for instance), Gnus has to know whether the article the
- user is following up on is news or mail. This function should return
- @code{news} if @var{article} in @var{group} is news, @code{mail} if it
- is mail and @code{unknown} if the type can't be decided. (The
- @var{article} parameter is necessary in @code{nnvirtual} groups which
- might very well combine mail groups and news groups.) Both @var{group}
- and @var{article} may be @code{nil}.
- There should be no result data from this function.
- @item (nnchoke-request-set-mark GROUP ACTION &optional SERVER)
- Set/remove/add marks on articles. Normally Gnus handles the article
- marks (such as read, ticked, expired etc) internally, and store them in
- @code{~/.newsrc.eld}. Some back ends (such as @sc{imap}) however carry
- all information about the articles on the server, so Gnus need to
- propagate the mark information to the server.
- ACTION is a list of mark setting requests, having this format:
- @example
- (RANGE ACTION MARK)
- @end example
- Range is a range of articles you wish to update marks on. Action is
- @code{set}, @code{add} or @code{del}, respectively used for removing all
- existing marks and setting them as specified, adding (preserving the
- marks not mentioned) mark and removing (preserving the marks not
- mentioned) marks. Mark is a list of marks; where each mark is a symbol.
- Currently used marks are @code{read}, @code{tick}, @code{reply},
- @code{expire}, @code{killed}, @code{dormant}, @code{save},
- @code{download} and @code{unsend}, but your back end should, if possible,
- not limit itself to these.
- Given contradictory actions, the last action in the list should be the
- effective one. That is, if your action contains a request to add the
- @code{tick} mark on article 1 and, later in the list, a request to
- remove the mark on the same article, the mark should in fact be removed.
- An example action list:
- @example
- (((5 12 30) 'del '(tick))
- ((10 . 90) 'add '(read expire))
- ((92 94) 'del '(read)))
- @end example
- The function should return a range of articles it wasn't able to set the
- mark on (currently not used for anything).
- There should be no result data from this function.
- @item (nnchoke-request-update-mark GROUP ARTICLE MARK)
- If the user tries to set a mark that the back end doesn't like, this
- function may change the mark. Gnus will use whatever this function
- returns as the mark for @var{article} instead of the original
- @var{mark}. If the back end doesn't care, it must return the original
- @var{mark}, and not @code{nil} or any other type of garbage.
- The only use for this I can see is what @code{nnvirtual} does with
- it---if a component group is auto-expirable, marking an article as read
- in the virtual group should result in the article being marked as
- expirable.
- There should be no result data from this function.
- @item (nnchoke-request-scan &optional GROUP SERVER)
- This function may be called at any time (by Gnus or anything else) to
- request that the back end check for incoming articles, in one way or
- another. A mail back end will typically read the spool file or query the
- POP server when this function is invoked. The @var{group} doesn't have
- to be heeded---if the back end decides that it is too much work just
- scanning for a single group, it may do a total scan of all groups. It
- would be nice, however, to keep things local if that's practical.
- There should be no result data from this function.
- @item (nnchoke-request-group-description GROUP &optional SERVER)
- The result data from this function should be a description of
- @var{group}.
- @example
- description-line = name <TAB> description eol
- name = <string>
- description = <text>
- @end example
- @item (nnchoke-request-list-newsgroups &optional SERVER)
- The result data from this function should be the description of all
- groups available on the server.
- @example
- description-buffer = *description-line
- @end example
- @item (nnchoke-request-newgroups DATE &optional SERVER)
- The result data from this function should be all groups that were
- created after @samp{date}, which is in normal human-readable date
- format. The data should be in the active buffer format.
- @item (nnchoke-request-create-group GROUP &optional SERVER)
- This function should create an empty group with name @var{group}.
- There should be no return data.
- @item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE)
- This function should run the expiry process on all articles in the
- @var{articles} range (which is currently a simple list of article
- numbers.) It is left up to the back end to decide how old articles
- should be before they are removed by this function. If @var{force} is
- non-@code{nil}, all @var{articles} should be deleted, no matter how new
- they are.
- This function should return a list of articles that it did not/was not
- able to delete.
- There should be no result data returned.
- @item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM
- &optional LAST)
- This function should move @var{article} (which is a number) from
- @var{group} by calling @var{accept-form}.
- This function should ready the article in question for moving by
- removing any header lines it has added to the article, and generally
- should ``tidy up'' the article. Then it should @code{eval}
- @var{accept-form} in the buffer where the ``tidy'' article is. This
- will do the actual copying. If this @code{eval} returns a
- non-@code{nil} value, the article should be removed.
- If @var{last} is @code{nil}, that means that there is a high likelihood
- that there will be more requests issued shortly, so that allows some
- optimizations.
- The function should return a cons where the @code{car} is the group name and
- the @code{cdr} is the article number that the article was entered as.
- There should be no data returned.
- @item (nnchoke-request-accept-article GROUP &optional SERVER LAST)
- This function takes the current buffer and inserts it into @var{group}.
- If @var{last} in @code{nil}, that means that there will be more calls to
- this function in short order.
- The function should return a cons where the @code{car} is the group name and
- the @code{cdr} is the article number that the article was entered as.
- There should be no data returned.
- @item (nnchoke-request-replace-article ARTICLE GROUP BUFFER)
- This function should remove @var{article} (which is a number) from
- @var{group} and insert @var{buffer} there instead.
- There should be no data returned.
- @item (nnchoke-request-delete-group GROUP FORCE &optional SERVER)
- This function should delete @var{group}. If @var{force}, it should
- really delete all the articles in the group, and then delete the group
- itself. (If there is such a thing as ``the group itself''.)
- There should be no data returned.
- @item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER)
- This function should rename @var{group} into @var{new-name}. All
- articles in @var{group} should move to @var{new-name}.
- There should be no data returned.
- @end table
- @node Error Messaging
- @subsubsection Error Messaging
- @findex nnheader-report
- @findex nnheader-get-report
- The back ends should use the function @code{nnheader-report} to report
- error conditions---they should not raise errors when they aren't able to
- perform a request. The first argument to this function is the back end
- symbol, and the rest are interpreted as arguments to @code{format} if
- there are multiple of them, or just a string if there is one of them.
- This function must always returns @code{nil}.
- @lisp
- (nnheader-report 'nnchoke "You did something totally bogus")
- (nnheader-report 'nnchoke "Could not request group %s" group)
- @end lisp
- Gnus, in turn, will call @code{nnheader-get-report} when it gets a
- @code{nil} back from a server, and this function returns the most
- recently reported message for the back end in question. This function
- takes one argument---the server symbol.
- Internally, these functions access @var{back-end}@code{-status-string},
- so the @code{nnchoke} back end will have its error message stored in
- @code{nnchoke-status-string}.
- @node Writing New Back Ends
- @subsubsection Writing New Back Ends
- Many back ends are quite similar. @code{nnml} is just like
- @code{nnspool}, but it allows you to edit the articles on the server.
- @code{nnmh} is just like @code{nnml}, but it doesn't use an active file,
- and it doesn't maintain overview databases. @code{nndir} is just like
- @code{nnml}, but it has no concept of ``groups'', and it doesn't allow
- editing articles.
- It would make sense if it were possible to ``inherit'' functions from
- back ends when writing new back ends. And, indeed, you can do that if you
- want to. (You don't have to if you don't want to, of course.)
- All the back ends declare their public variables and functions by using a
- package called @code{nnoo}.
- To inherit functions from other back ends (and allow other back ends to
- inherit functions from the current back end), you should use the
- following macros:
- @table @code
- @item nnoo-declare
- This macro declares the first parameter to be a child of the subsequent
- parameters. For instance:
- @lisp
- (nnoo-declare nndir
- nnml nnmh)
- @end lisp
- @code{nndir} has declared here that it intends to inherit functions from
- both @code{nnml} and @code{nnmh}.
- @item defvoo
- This macro is equivalent to @code{defvar}, but registers the variable as
- a public server variable. Most state-oriented variables should be
- declared with @code{defvoo} instead of @code{defvar}.
- In addition to the normal @code{defvar} parameters, it takes a list of
- variables in the parent back ends to map the variable to when executing
- a function in those back ends.
- @lisp
- (defvoo nndir-directory nil
- "Where nndir will look for groups."
- nnml-current-directory nnmh-current-directory)
- @end lisp
- This means that @code{nnml-current-directory} will be set to
- @code{nndir-directory} when an @code{nnml} function is called on behalf
- of @code{nndir}. (The same with @code{nnmh}.)
- @item nnoo-define-basics
- This macro defines some common functions that almost all back ends should
- have.
- @example
- (nnoo-define-basics nndir)
- @end example
- @item deffoo
- This macro is just like @code{defun} and takes the same parameters. In
- addition to doing the normal @code{defun} things, it registers the
- function as being public so that other back ends can inherit it.
- @item nnoo-map-functions
- This macro allows mapping of functions from the current back end to
- functions from the parent back ends.
- @example
- (nnoo-map-functions nndir
- (nnml-retrieve-headers 0 nndir-current-group 0 0)
- (nnmh-request-article 0 nndir-current-group 0 0))
- @end example
- This means that when @code{nndir-retrieve-headers} is called, the first,
- third, and fourth parameters will be passed on to
- @code{nnml-retrieve-headers}, while the second parameter is set to the
- value of @code{nndir-current-group}.
- @item nnoo-import
- This macro allows importing functions from back ends. It should be the
- last thing in the source file, since it will only define functions that
- haven't already been defined.
- @example
- (nnoo-import nndir
- (nnmh
- nnmh-request-list
- nnmh-request-newgroups)
- (nnml))
- @end example
- This means that calls to @code{nndir-request-list} should just be passed
- on to @code{nnmh-request-list}, while all public functions from
- @code{nnml} that haven't been defined in @code{nndir} yet should be
- defined now.
- @end table
- Below is a slightly shortened version of the @code{nndir} back end.
- @lisp
- ;;; nndir.el --- single directory newsgroup access for Gnus
- ;; Copyright (C) 1995,96 Free Software Foundation, Inc.
- ;;; Code:
- (require 'nnheader)
- (require 'nnmh)
- (require 'nnml)
- (require 'nnoo)
- (eval-when-compile (require 'cl))
- (nnoo-declare nndir
- nnml nnmh)
- (defvoo nndir-directory nil
- "Where nndir will look for groups."
- nnml-current-directory nnmh-current-directory)
- (defvoo nndir-nov-is-evil nil
- "*Non-nil means that nndir will never retrieve NOV headers."
- nnml-nov-is-evil)
- (defvoo nndir-current-group ""
- nil
- nnml-current-group nnmh-current-group)
- (defvoo nndir-top-directory nil nil nnml-directory nnmh-directory)
- (defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail)
- (defvoo nndir-status-string "" nil nnmh-status-string)
- (defconst nndir-version "nndir 1.0")
- ;;; Interface functions.
- (nnoo-define-basics nndir)
- (deffoo nndir-open-server (server &optional defs)
- (setq nndir-directory
- (or (cadr (assq 'nndir-directory defs))
- server))
- (unless (assq 'nndir-directory defs)
- (push `(nndir-directory ,server) defs))
- (push `(nndir-current-group
- ,(file-name-nondirectory
- (directory-file-name nndir-directory)))
- defs)
- (push `(nndir-top-directory
- ,(file-name-directory (directory-file-name nndir-directory)))
- defs)
- (nnoo-change-server 'nndir server defs))
- (nnoo-map-functions nndir
- (nnml-retrieve-headers 0 nndir-current-group 0 0)
- (nnmh-request-article 0 nndir-current-group 0 0)
- (nnmh-request-group nndir-current-group 0 0)
- (nnmh-close-group nndir-current-group 0))
- (nnoo-import nndir
- (nnmh
- nnmh-status-message
- nnmh-request-list
- nnmh-request-newgroups))
- (provide 'nndir)
- @end lisp
- @node Hooking New Back Ends Into Gnus
- @subsubsection Hooking New Back Ends Into Gnus
- @vindex gnus-valid-select-methods
- Having Gnus start using your new back end is rather easy---you just
- declare it with the @code{gnus-declare-backend} functions. This will
- enter the back end into the @code{gnus-valid-select-methods} variable.
- @code{gnus-declare-backend} takes two parameters---the back end name and
- an arbitrary number of @dfn{abilities}.
- Here's an example:
- @lisp
- (gnus-declare-backend "nnchoke" 'mail 'respool 'address)
- @end lisp
- The abilities can be:
- @table @code
- @item mail
- This is a mailish back end---followups should (probably) go via mail.
- @item post
- This is a newsish back end---followups should (probably) go via news.
- @item post-mail
- This back end supports both mail and news.
- @item none
- This is neither a post nor mail back end---it's something completely
- different.
- @item respool
- It supports respooling---or rather, it is able to modify its source
- articles and groups.
- @item address
- The name of the server should be in the virtual server name. This is
- true for almost all back ends.
- @item prompt-address
- The user should be prompted for an address when doing commands like
- @kbd{B} in the group buffer. This is true for back ends like
- @code{nntp}, but not @code{nnmbox}, for instance.
- @end table
- @node Mail-like Back Ends
- @subsubsection Mail-like Back Ends
- One of the things that separate the mail back ends from the rest of the
- back ends is the heavy dependence by the mail back ends on common
- functions in @file{nnmail.el}. For instance, here's the definition of
- @code{nnml-request-scan}:
- @lisp
- (deffoo nnml-request-scan (&optional group server)
- (setq nnml-article-file-alist nil)
- (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))
- @end lisp
- It simply calls @code{nnmail-get-new-mail} with a few parameters,
- and @code{nnmail} takes care of all the moving and splitting of the
- mail.
- This function takes four parameters.
- @table @var
- @item method
- This should be a symbol to designate which back end is responsible for
- the call.
- @item exit-function
- This function should be called after the splitting has been performed.
- @item temp-directory
- Where the temporary files should be stored.
- @item group
- This optional argument should be a group name if the splitting is to be
- performed for one group only.
- @end table
- @code{nnmail-get-new-mail} will call @var{back-end}@code{-save-mail} to
- save each article. @var{back-end}@code{-active-number} will be called to
- find the article number assigned to this article.
- The function also uses the following variables:
- @var{back-end}@code{-get-new-mail} (to see whether to get new mail for
- this back end); and @var{back-end}@code{-group-alist} and
- @var{back-end}@code{-active-file} to generate the new active file.
- @var{back-end}@code{-group-alist} should be a group-active alist, like
- this:
- @example
- (("a-group" (1 . 10))
- ("some-group" (34 . 39)))
- @end example
- @node Score File Syntax
- @subsection Score File Syntax
- Score files are meant to be easily parseable, but yet extremely
- mallable. It was decided that something that had the same read syntax
- as an Emacs Lisp list would fit that spec.
- Here's a typical score file:
- @lisp
- (("summary"
- ("win95" -10000 nil s)
- ("Gnus"))
- ("from"
- ("Lars" -1000))
- (mark -100))
- @end lisp
- BNF definition of a score file:
- @example
- score-file = "" / "(" *element ")"
- element = rule / atom
- rule = string-rule / number-rule / date-rule
- string-rule = "(" quote string-header quote space *string-match ")"
- number-rule = "(" quote number-header quote space *number-match ")"
- date-rule = "(" quote date-header quote space *date-match ")"
- quote = <ascii 34>
- string-header = "subject" / "from" / "references" / "message-id" /
- "xref" / "body" / "head" / "all" / "followup"
- number-header = "lines" / "chars"
- date-header = "date"
- string-match = "(" quote <string> quote [ "" / [ space score [ "" /
- space date [ "" / [ space string-match-t ] ] ] ] ] ")"
- score = "nil" / <integer>
- date = "nil" / <natural number>
- string-match-t = "nil" / "s" / "substring" / "S" / "Substring" /
- "r" / "regex" / "R" / "Regex" /
- "e" / "exact" / "E" / "Exact" /
- "f" / "fuzzy" / "F" / "Fuzzy"
- number-match = "(" <integer> [ "" / [ space score [ "" /
- space date [ "" / [ space number-match-t ] ] ] ] ] ")"
- number-match-t = "nil" / "=" / "<" / ">" / ">=" / "<="
- date-match = "(" quote <string> quote [ "" / [ space score [ "" /
- space date [ "" / [ space date-match-t ] ] ] ] ")"
- date-match-t = "nil" / "at" / "before" / "after"
- atom = "(" [ required-atom / optional-atom ] ")"
- required-atom = mark / expunge / mark-and-expunge / files /
- exclude-files / read-only / touched
- optional-atom = adapt / local / eval
- mark = "mark" space nil-or-number
- nil-or-number = "nil" / <integer>
- expunge = "expunge" space nil-or-number
- mark-and-expunge = "mark-and-expunge" space nil-or-number
- files = "files" *[ space <string> ]
- exclude-files = "exclude-files" *[ space <string> ]
- read-only = "read-only" [ space "nil" / space "t" ]
- adapt = "adapt" [ space "ignore" / space "t" / space adapt-rule ]
- adapt-rule = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"
- local = "local" *[ space "(" <string> space <form> ")" ]
- eval = "eval" space <form>
- space = *[ " " / <TAB> / <NEWLINE> ]
- @end example
- Any unrecognized elements in a score file should be ignored, but not
- discarded.
- As you can see, white space is needed, but the type and amount of white
- space is irrelevant. This means that formatting of the score file is
- left up to the programmer---if it's simpler to just spew it all out on
- one looong line, then that's ok.
- The meaning of the various atoms are explained elsewhere in this
- manual (@pxref{Score File Format}).
- @node Headers
- @subsection Headers
- Internally Gnus uses a format for storing article headers that
- corresponds to the @sc{nov} format in a mysterious fashion. One could
- almost suspect that the author looked at the @sc{nov} specification and
- just shamelessly @emph{stole} the entire thing, and one would be right.
- @dfn{Header} is a severely overloaded term. ``Header'' is used in
- RFC 1036 to talk about lines in the head of an article (e.g.,
- @code{From}). It is used by many people as a synonym for
- ``head''---``the header and the body''. (That should be avoided, in my
- opinion.) And Gnus uses a format internally that it calls ``header'',
- which is what I'm talking about here. This is a 9-element vector,
- basically, with each header (ouch) having one slot.
- These slots are, in order: @code{number}, @code{subject}, @code{from},
- @code{date}, @code{id}, @code{references}, @code{chars}, @code{lines},
- @code{xref}, and @code{extra}. There are macros for accessing and
- setting these slots---they all have predictable names beginning with
- @code{mail-header-} and @code{mail-header-set-}, respectively.
- All these slots contain strings, except the @code{extra} slot, which
- contains an alist of header/value pairs (@pxref{To From Newsgroups}).
- @node Ranges
- @subsection Ranges
- @sc{gnus} introduced a concept that I found so useful that I've started
- using it a lot and have elaborated on it greatly.
- The question is simple: If you have a large amount of objects that are
- identified by numbers (say, articles, to take a @emph{wild} example)
- that you want to qualify as being ``included'', a normal sequence isn't
- very useful. (A 200,000 length sequence is a bit long-winded.)
- The solution is as simple as the question: You just collapse the
- sequence.
- @example
- (1 2 3 4 5 6 10 11 12)
- @end example
- is transformed into
- @example
- ((1 . 6) (10 . 12))
- @end example
- To avoid having those nasty @samp{(13 . 13)} elements to denote a
- lonesome object, a @samp{13} is a valid element:
- @example
- ((1 . 6) 7 (10 . 12))
- @end example
- This means that comparing two ranges to find out whether they are equal
- is slightly tricky:
- @example
- ((1 . 5) 7 8 (10 . 12))
- @end example
- and
- @example
- ((1 . 5) (7 . 8) (10 . 12))
- @end example
- are equal. In fact, any non-descending list is a range:
- @example
- (1 2 3 4 5)
- @end example
- is a perfectly valid range, although a pretty long-winded one. This is
- also valid:
- @example
- (1 . 5)
- @end example
- and is equal to the previous range.
- Here's a BNF definition of ranges. Of course, one must remember the
- semantic requirement that the numbers are non-descending. (Any number
- of repetition of the same number is allowed, but apt to disappear in
- range handling.)
- @example
- range = simple-range / normal-range
- simple-range = "(" number " . " number ")"
- normal-range = "(" start-contents ")"
- contents = "" / simple-range *[ " " contents ] /
- number *[ " " contents ]
- @end example
- Gnus currently uses ranges to keep track of read articles and article
- marks. I plan on implementing a number of range operators in C if The
- Powers That Be are willing to let me. (I haven't asked yet, because I
- need to do some more thinking on what operators I need to make life
- totally range-based without ever having to convert back to normal
- sequences.)
- @node Group Info
- @subsection Group Info
- Gnus stores all permanent info on groups in a @dfn{group info} list.
- This list is from three to six elements (or more) long and exhaustively
- describes the group.
- Here are two example group infos; one is a very simple group while the
- second is a more complex one:
- @example
- ("no.group" 5 ((1 . 54324)))
- ("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
- ((tick (15 . 19)) (replied 3 6 (19 . 3)))
- (nnml "")
- ((auto-expire . t) (to-address . "ding@@gnus.org")))
- @end example
- The first element is the @dfn{group name}---as Gnus knows the group,
- anyway. The second element is the @dfn{subscription level}, which
- normally is a small integer. (It can also be the @dfn{rank}, which is a
- cons cell where the @code{car} is the level and the @code{cdr} is the
- score.) The third element is a list of ranges of read articles. The
- fourth element is a list of lists of article marks of various kinds.
- The fifth element is the select method (or virtual server, if you like).
- The sixth element is a list of @dfn{group parameters}, which is what
- this section is about.
- Any of the last three elements may be missing if they are not required.
- In fact, the vast majority of groups will normally only have the first
- three elements, which saves quite a lot of cons cells.
- Here's a BNF definition of the group info format:
- @example
- info = "(" group space ralevel space read
- [ "" / [ space marks-list [ "" / [ space method [ "" /
- space parameters ] ] ] ] ] ")"
- group = quote <string> quote
- ralevel = rank / level
- level = <integer in the range of 1 to inf>
- rank = "(" level "." score ")"
- score = <integer in the range of 1 to inf>
- read = range
- marks-lists = nil / "(" *marks ")"
- marks = "(" <string> range ")"
- method = "(" <string> *elisp-forms ")"
- parameters = "(" *elisp-forms ")"
- @end example
- Actually that @samp{marks} rule is a fib. A @samp{marks} is a
- @samp{<string>} consed on to a @samp{range}, but that's a bitch to say
- in pseudo-BNF.
- If you have a Gnus info and want to access the elements, Gnus offers a
- series of macros for getting/setting these elements.
- @table @code
- @item gnus-info-group
- @itemx gnus-info-set-group
- @findex gnus-info-group
- @findex gnus-info-set-group
- Get/set the group name.
- @item gnus-info-rank
- @itemx gnus-info-set-rank
- @findex gnus-info-rank
- @findex gnus-info-set-rank
- Get/set the group rank (@pxref{Group Score}).
- @item gnus-info-level
- @itemx gnus-info-set-level
- @findex gnus-info-level
- @findex gnus-info-set-level
- Get/set the group level.
- @item gnus-info-score
- @itemx gnus-info-set-score
- @findex gnus-info-score
- @findex gnus-info-set-score
- Get/set the group score (@pxref{Group Score}).
- @item gnus-info-read
- @itemx gnus-info-set-read
- @findex gnus-info-read
- @findex gnus-info-set-read
- Get/set the ranges of read articles.
- @item gnus-info-marks
- @itemx gnus-info-set-marks
- @findex gnus-info-marks
- @findex gnus-info-set-marks
- Get/set the lists of ranges of marked articles.
- @item gnus-info-method
- @itemx gnus-info-set-method
- @findex gnus-info-method
- @findex gnus-info-set-method
- Get/set the group select method.
- @item gnus-info-params
- @itemx gnus-info-set-params
- @findex gnus-info-params
- @findex gnus-info-set-params
- Get/set the group parameters.
- @end table
- All the getter functions take one parameter---the info list. The setter
- functions take two parameters---the info list and the new value.
- The last three elements in the group info aren't mandatory, so it may be
- necessary to extend the group info before setting the element. If this
- is necessary, you can just pass on a non-@code{nil} third parameter to
- the three final setter functions to have this happen automatically.
- @node Extended Interactive
- @subsection Extended Interactive
- @cindex interactive
- @findex gnus-interactive
- Gnus extends the standard Emacs @code{interactive} specification
- slightly to allow easy use of the symbolic prefix (@pxref{Symbolic
- Prefixes}). Here's an example of how this is used:
- @lisp
- (defun gnus-summary-increase-score (&optional score symp)
- (interactive (gnus-interactive "P\ny"))
- ...
- )
- @end lisp
- The best thing to do would have been to implement
- @code{gnus-interactive} as a macro which would have returned an
- @code{interactive} form, but this isn't possible since Emacs checks
- whether a function is interactive or not by simply doing an @code{assq}
- on the lambda form. So, instead we have @code{gnus-interactive}
- function that takes a string and returns values that are usable to
- @code{interactive}.
- This function accepts (almost) all normal @code{interactive} specs, but
- adds a few more.
- @table @samp
- @item y
- @vindex gnus-current-prefix-symbol
- The current symbolic prefix---the @code{gnus-current-prefix-symbol}
- variable.
- @item Y
- @vindex gnus-current-prefix-symbols
- A list of the current symbolic prefixes---the
- @code{gnus-current-prefix-symbol} variable.
- @item A
- The current article number---the @code{gnus-summary-article-number}
- function.
- @item H
- The current article header---the @code{gnus-summary-article-header}
- function.
- @item g
- The current group name---the @code{gnus-group-group-name}
- function.
- @end table
- @node Emacs/XEmacs Code
- @subsection Emacs/XEmacs Code
- @cindex XEmacs
- @cindex Emacsen
- While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the
- platforms must be the primary one. I chose Emacs. Not because I don't
- like XEmacs or Mule, but because it comes first alphabetically.
- This means that Gnus will byte-compile under Emacs with nary a warning,
- while XEmacs will pump out gigabytes of warnings while byte-compiling.
- As I use byte-compilation warnings to help me root out trivial errors in
- Gnus, that's very useful.
- I've also consistently used Emacs function interfaces, but have used
- Gnusey aliases for the functions. To take an example: Emacs defines a
- @code{run-at-time} function while XEmacs defines a @code{start-itimer}
- function. I then define a function called @code{gnus-run-at-time} that
- takes the same parameters as the Emacs @code{run-at-time}. When running
- Gnus under Emacs, the former function is just an alias for the latter.
- However, when running under XEmacs, the former is an alias for the
- following function:
- @lisp
- (defun gnus-xmas-run-at-time (time repeat function &rest args)
- (start-itimer
- "gnus-run-at-time"
- `(lambda ()
- (,function ,@@args))
- time repeat))
- @end lisp
- This sort of thing has been done for bunches of functions. Gnus does
- not redefine any native Emacs functions while running under XEmacs---it
- does this @code{defalias} thing with Gnus equivalents instead. Cleaner
- all over.
- In the cases where the XEmacs function interface was obviously cleaner,
- I used it instead. For example @code{gnus-region-active-p} is an alias
- for @code{region-active-p} in XEmacs, whereas in Emacs it is a function.
- Of course, I could have chosen XEmacs as my native platform and done
- mapping functions the other way around. But I didn't. The performance
- hit these indirections impose on Gnus under XEmacs should be slight.
- @node Various File Formats
- @subsection Various File Formats
- @menu
- * Active File Format:: Information on articles and groups available.
- * Newsgroups File Format:: Group descriptions.
- @end menu
- @node Active File Format
- @subsubsection Active File Format
- The active file lists all groups available on the server in
- question. It also lists the highest and lowest current article numbers
- in each group.
- Here's an excerpt from a typical active file:
- @example
- soc.motss 296030 293865 y
- alt.binaries.pictures.fractals 3922 3913 n
- comp.sources.unix 1605 1593 m
- comp.binaries.ibm.pc 5097 5089 y
- no.general 1000 900 y
- @end example
- Here's a pseudo-BNF definition of this file:
- @example
- active = *group-line
- group-line = group spc high-number spc low-number spc flag <NEWLINE>
- group = <non-white-space string>
- spc = " "
- high-number = <non-negative integer>
- low-number = <positive integer>
- flag = "y" / "n" / "m" / "j" / "x" / "=" group
- @end example
- For a full description of this file, see the manual pages for
- @samp{innd}, in particular @samp{active(5)}.
- @node Newsgroups File Format
- @subsubsection Newsgroups File Format
- The newsgroups file lists groups along with their descriptions. Not all
- groups on the server have to be listed, and not all groups in the file
- have to exist on the server. The file is meant purely as information to
- the user.
- The format is quite simple; a group name, a tab, and the description.
- Here's the definition:
- @example
- newsgroups = *line
- line = group tab description <NEWLINE>
- group = <non-white-space string>
- tab = <TAB>
- description = <string>
- @end example
- @page
- @node Emacs for Heathens
- @section Emacs for Heathens
- Believe it or not, but some people who use Gnus haven't really used
- Emacs much before they embarked on their journey on the Gnus Love Boat.
- If you are one of those unfortunates whom ``@kbd{C-M-a}'', ``kill the
- region'', and ``set @code{gnus-flargblossen} to an alist where the key
- is a regexp that is used for matching on the group name'' are magical
- phrases with little or no meaning, then this appendix is for you. If
- you are already familiar with Emacs, just ignore this and go fondle your
- cat instead.
- @menu
- * Keystrokes:: Entering text and executing commands.
- * Emacs Lisp:: The built-in Emacs programming language.
- @end menu
- @node Keystrokes
- @subsection Keystrokes
- @itemize @bullet
- @item
- Q: What is an experienced Emacs user?
- @item
- A: A person who wishes that the terminal had pedals.
- @end itemize
- Yes, when you use Emacs, you are apt to use the control key, the shift
- key and the meta key a lot. This is very annoying to some people
- (notably @code{vi}le users), and the rest of us just love the hell out
- of it. Just give up and submit. Emacs really does stand for
- ``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you
- may have heard from other disreputable sources (like the Emacs author).
- The shift keys are normally located near your pinky fingers, and are
- normally used to get capital letters and stuff. You probably use it all
- the time. The control key is normally marked ``CTRL'' or something like
- that. The meta key is, funnily enough, never marked as such on any
- keyboard. The one I'm currently at has a key that's marked ``Alt'',
- which is the meta key on this keyboard. It's usually located somewhere
- to the left hand side of the keyboard, usually on the bottom row.
- Now, us Emacs people don't say ``press the meta-control-m key'',
- because that's just too inconvenient. We say ``press the @kbd{C-M-m}
- key''. @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the
- prefix that means ``control''. So ``press @kbd{C-k}'' means ``press
- down the control key, and hold it down while you press @kbd{k}''.
- ``Press @kbd{C-M-k}'' means ``press down and hold down the meta key and
- the control key and then press @kbd{k}''. Simple, ay?
- This is somewhat complicated by the fact that not all keyboards have a
- meta key. In that case you can use the ``escape'' key. Then @kbd{M-k}
- means ``press escape, release escape, press @kbd{k}''. That's much more
- work than if you have a meta key, so if that's the case, I respectfully
- suggest you get a real keyboard with a meta key. You can't live without
- it.
- @node Emacs Lisp
- @subsection Emacs Lisp
- Emacs is the King of Editors because it's really a Lisp interpreter.
- Each and every key you tap runs some Emacs Lisp code snippet, and since
- Emacs Lisp is an interpreted language, that means that you can configure
- any key to run any arbitrary code. You just, like, do it.
- Gnus is written in Emacs Lisp, and is run as a bunch of interpreted
- functions. (These are byte-compiled for speed, but it's still
- interpreted.) If you decide that you don't like the way Gnus does
- certain things, it's trivial to have it do something a different way.
- (Well, at least if you know how to write Lisp code.) However, that's
- beyond the scope of this manual, so we are simply going to talk about
- some common constructs that you normally use in your @file{.emacs} file
- to customize Gnus.
- If you want to set the variable @code{gnus-florgbnize} to four (4), you
- write the following:
- @lisp
- (setq gnus-florgbnize 4)
- @end lisp
- This function (really ``special form'') @code{setq} is the one that can
- set a variable to some value. This is really all you need to know. Now
- you can go and fill your @code{.emacs} file with lots of these to change
- how Gnus works.
- If you have put that thing in your @code{.emacs} file, it will be read
- and @code{eval}ed (which is lisp-ese for ``run'') the next time you
- start Emacs. If you want to change the variable right away, simply say
- @kbd{C-x C-e} after the closing parenthesis. That will @code{eval} the
- previous ``form'', which is a simple @code{setq} statement here.
- Go ahead---just try it, if you're located at your Emacs. After you
- @kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which
- is the return value of the form you @code{eval}ed.
- Some pitfalls:
- If the manual says ``set @code{gnus-read-active-file} to @code{some}'',
- that means:
- @lisp
- (setq gnus-read-active-file 'some)
- @end lisp
- On the other hand, if the manual says ``set @code{gnus-nntp-server} to
- @samp{nntp.ifi.uio.no}'', that means:
- @lisp
- (setq gnus-nntp-server "nntp.ifi.uio.no")
- @end lisp
- So be careful not to mix up strings (the latter) with symbols (the
- former). The manual is unambiguous, but it can be confusing.
- @page
- @include gnus-faq.texi
- @node Index
- @chapter Index
- @printindex cp
- @node Key Index
- @chapter Key Index
- @printindex ky
- @summarycontents
- @contents
- @bye
- @iftex
- @iflatex
- \end{document}
- @end iflatex
- @end iftex
- @c End:
|