一、双方作战方针和部署
清廷于1884年8月26日被迫对法宣战以后,虽然确定了沿海防御、陆路反攻的方针,命岑毓英催促刘永福赶紧督军进取,又令岑毓英、潘鼎新率滇、桂各军速赴北圻战场,尽力反攻。但是,究竟如何反攻,开始并不明确。后来根据前方奏报,才逐渐确定:东线桂军进攻谅江、太原,西线滇军和黑旗军进攻宣光,并推进到白鹤、永祥附近地域;两军在太原、永祥一带会师后,合力进攻北宁、河内。10月初,清廷鉴于基隆失守,更急于攻法之所必救,电令北圻各军力图进取,“直一逼一西贡等处,庶使分兵西援,台湾乃可稍松”①。对此,岑、潘二人一开始就没有信心。潘鼎新当即表示:“台北吃重,此间一军前进,恐不足牵制;法方于河内、北宁增兵迎拒,西贡万难骤达。”②岑毓英也强调“西贡系南圻地方,隔顺化及宁平、南定等处,皆有法人坚守,道阻且长,万难进龋”③潘鼎新和岑毓英等固然有畏敌怯战的一面,但清廷进军西贡的要求也是当时清军兵力难以胜任的,这反映了清廷战略指导上的无知。
法军方面,因米乐回国养病,由波里也于9月8日接任远东军总司令。当时,北圻法军计有第一、第二两旅及内河舰队等共约一万八千余人,分守陆岸(今陆南)、谅江、太原、宣光、馆司等前沿要地,兵力比较分散。波里也根据法国政一府东攻台北、西取谅山的战略方针,决定在北圻采取西守东攻的作战方针,即西线坚守宣光、兴化,东线集中兵力夺取谅山,得手后,再转兵西向。
二、东线桂军反攻失利
东线桂军奉命再度开赴北圻战场后,开始进展顺利,至1884年9月中旬,署理广西提督苏元春率领的桂军主力十三个营(约四千八百人)进抵船头(今陆岸),10月初曾一度攻占陆岸;与此同时,记名提督方友升及总兵周寿昌等所部九个营(约三千二百人)进占郎甲及其以北地区。上述东、西两路桂军“互相犄角,自为战守”。潘鼎新率淮军五营及道员赵济川一营驻谅山,“整理一操一练,以备两路策应”①。此外,副将马盛治所部六个营驻于牧马、新街一带,牵制太原守敌。东线清军兵力共约一万二千人,然而,“营哨各官大半代理,一精一壮能战者仅十之二三”②。
这时,法军已在河内、北宁集结完毕。波里也为了粉碎东线清军的反攻,进而夺取战略要地谅山,以第二旅编成两个纵队,分别进攻郎甲、船头,以第一旅一部兵力配置于谅江附近,准备随时机动。法军主力于10月8日自河内出发。
10月8日,尼格里率领第二旅主力约三千人进攻谅江北面十余里的郎甲。驻守该村的方友升等麻痹大意,没有做好必要的防御准备,对关系郎甲安危的南堡高地也未予以足够重视。因此,法军轻取南堡高地,随即在此布置炮兵,以密集炮火掩护主力从两侧迅速包围了郎甲村。守军仓促应战,除方友升率领一部撤至郎甲东侧高地外,尚有数百人被围于村中。清军为解救被围部队,两次由侧翼反击敌军炮兵阵地,均未成功。法军乘势一抽一出部分兵力进攻村北高地周寿昌部。该部兵力数倍于进攻之敌,但稍事抵抗就向观音桥、屯梅方向溃退。法军接着全力进攻郎甲村,守军浴血奋战,与敌人肉一搏拚杀,直至全部牺牲。此战,清军伤亡七百余人,法军死伤百余人。尼格里也在这次战斗中受伤,暂时返回河内。波里也兼统第二旅,以一部兵力守郎甲,其余撤至谅江,后又向东增援船头。
进犯船头的法军第二旅一部千余人,由端尼埃上校率领,搭乘炮舰五艘、拖般十余只,于10月2日离北宁,经七庙,沿陆南江(今陆岸河)前进。苏元春率领的东路清军在船头附近筑有堑壕、堡垒等较坚固的防御工事,并在西南二十里的尼村附近配置部分兵力,防止敌军上岸。10月6日上午,法军进至尼村,舰炮齐发,与守军展开激战。清军伤亡较重,但仍竭力抵抗,终于迫使敌人后撤。此后,双方相持于船头以西地区。9日,法军得到增援, 10日再次发起进攻。清军总兵陈嘉督军迎战。当法军第一梯队四个连向船头主阵地冲击时,陈嘉以一部兵力依托阵地顽强抵抗,亲率主力向法军右翼猛烈反击,将敌两个连大部歼灭,并击毙其右翼指挥官。残余法军狼狈逃窜。与此同时,法军左翼两个连仍在拚死挣扎,端尼埃也以其所控制的机动兵力在炮兵及舰炮火力支援下疯狂反扑。陈嘉见翼侧受到威胁,主动撤回主阵地。此后,战斗又成对峙状态。
清军在船头重创法军一精一锐部队,歼敌二百余人,士气为之一振。法国侵略者为船头守军“这样奋不顾身地激烈作战”①而惶恐不安。但是,株守谅山的潘鼎新未能及时调部增援。苏元春在获知西路郎甲失守、后援无望的情况下,便于10月11日夜间率部撤回谷松。
郎甲、船头既失,桂军东、西两路的形势为之大变,战局开始陷入被动。清廷力促滇、桂两军联成一气,规复北宁、河内,甚至直捣西贡的战略意图,随之成了泡影。但是,这时法军对台湾淡水的进攻遭到失败,土气为之沮丧。巴德诺声称:“尼格里将军在郎甲的胜利,在某种范围内,可减轻台湾消息的令人不快印象,但其效能,是否将被北京朝廷敏锐地觉到,尚属疑问。我们东京的远征队,距离中国边境还太远,不能使帝国政一府受到严重的警告。”①茹费理也认为只有乘胜向广西边境推进,方足以“有力地引起帝国政一府的忧虑”②。然而,波里也在攻占郎甲、船头之后,鉴于援兵未到,加之后方受到越南义军的牵制,无力继续发展进攻,不得不暂取守势,于是将主力撤回北宁、河内,以一部兵力在船头、郎甲一线巡逻警戒。12月以后,法国陆续增兵远东,三分之一赴台,三分之二赴越,并将北圻战场的法军改归陆军部指挥(原由海军部指挥)。在待援期间,波里也积极进行攻取谅山的各种准备,以船头为基地,修筑工事、道路,屯积作战物资。
清军方面,西线滇军和黑旗军已于1884年10月底进抵宣光城下,正在竭力围攻。东线桂军也陆续补充了兵力,调整了部署:以驻谷松的苏元春、陈嘉所部十八营为中路;以驻观音桥的杨玉科、方友升所部九营为西路;以驻车里、那一陽一一带的王德榜所部湘军十营为东路;另以叶家祥所部淮军五营、董履高所部桂军五营驻谅山为后应。此外,马盛治所部桂军六营仍驻新街一带。以上共有兵力五十余营,约二万人。
为了策应西线的军事行动,打乱北圻法军西守东攻的作战部署,清政一府曾命令东线清军乘北圻法军转入防御之机,主动出击,先发制敌。但是,潘鼎新根据李鸿章“切勿攻坚伤一精一锐”③等指示,仅以小辨模的出击牵制船头方向的法军,作出一点策应西线作战的姿态。12月16日,中路清军二千人在纸作社(船头东北)伏击法军巡逻部队,毙伤敌军百余人,取得了胜利。年底,东路湘军进至船头东面的丰谷,准备配合中路进攻船头。1885年1月3、4两日,丰谷清军突遭法军四千余人猛烈攻击,“王德榜督军苦战,死伤颇多,因少后门槍,且子药已尽,势难抵御”①,被迫丢弃大量物资,撤回车里。潘鼎新恐法军由那一陽一迂回苏、王两部之后而攻取谅山,急忙从谅山调淮军两营守那一陽一,并要求清廷迅速增援。
在此以前,两广总督张之洞也认为法军专注谅山,“桂军各道分防,兵力尚薄,必应由东路再增劲兵,以收犄角夹击之效”②,于是命冯子材率粤军十营,总兵王孝祺率淮军、粤军共八营,分别由钦州、梧州起程,经由广西赴越。由于谅山吃紧,冯子材以八营由上思州直接入越,协同王德榜部守东路;自率两营赴龙州筹办粮饷军械和招募新兵。王孝祺部中途哗变,溃散近半,至龙州时不及二千人。
1885年1月底,法军第一、第二旅主力七千余人,在船头一带集结完毕,准备转守为攻,向广西边境大举进军。法军扬言分两路前进:一路攻谷松,一路攻车里。实则全军指向谷松,并力进攻中路。
潘鼎新企图阻止法军进攻,命中路清军(包括新配属的董履高部五营)前出到竹山附近高地设防。2月4日,法军集中炮火轰击竹山清军营垒,随即展开猛攻。守军顽强抵御,但因仓卒移防,工事不坚,伤亡甚众,被迫后撤。次日,法军再次发起攻击,守军不支,退守谷松。2月6日,法军在炮火掩护下猛攻谷松,清军被迫撤至谅山南面三十五里处的委坡一带。
中路清军溃败,谅山垂危。“东西两军相去远,闻调赴援,一日之间号令屡改。”①潘鼎新时而令王德榜、杨玉科等部回援谅山,时而令其仍扎原处,时而令其夜袭法军后路,最后又令其飞援谅山,但为时已晚,无济于事了。就在2月12日,法军攻占委坡,潘鼎新于当夜逃离谅山入关,苏元春随之率部退入关内。2月13日,法军未经战斗,即占领了战略要地谅山。至此,法军在东线达到了预期的作战目的,波里也随即于2月17日率领第一旅(约三千人)离开谅山,以便经河内赶赴西线,解救被围于宣光的法军。
谅山弃守后,冯子材毅然以守关自任,亲率一营从龙州赶到镇南关,和王孝祺部一起拦截溃散兵丁,并急调协守东路的冯军八个营回守镇南关。可是,潘鼎新竟“告以守关无须该军,令仍顾东路”②。2月19日,西路杨玉科部自观音桥、屯梅绕道撤至文渊(今同登)。杨玉科以主力防守文渊两侧高地,自率一部驻镇南关。2月23日,尼格里指挥法军第二旅进攻文渊,守军浴血奋战,节节抵抗。杨玉科亲临前线指挥战斗,阻止了敌人的前进。但由于清军发射的炮弹多未爆炸,未能予敌以大量杀伤。午后,杨玉科中炮牺牲,守军随即溃散,退入关内。法军乘势侵占镇南关,前锋一度侵入我国境内近十公里的幕府附近。
由于兵力不足,补给困难,加之不时受到当地群众武装的袭扰,法军于2月25日炸毁镇南关城墙及其附近工事,退回文渊、谅山。根据波里也离开谅山前的指令,法军在镇南关废墟上立一木牌,上书“……广西的门户已不再存在了”。但是,当地军民在同一地方写着:“我们将用法国人的头颅重建我们的门户!”①以此作为对侵略者的回答。
冯子材闻镇南关失守,立即疾驰二百余里,由东路统兵回援;王德榜也率部赶回,驻于镇南关东面三十里的油隘一带。
潘鼎新则畏敌如虎,在文渊战斗之前,即由镇南关继续后逃至幕府。2月23日,正当文渊前线激战之际,他又经凭祥、海村连夜逃到关内一百余里的龙州,由于遭到当地各阶层人民的愤怒斥责,“始乘船由水路返海村,日驻岸,夜驻船”②。事后,他竟谎报自己在文渊战斗中“督亲兵助战,槍炮声震山谷,逆一党一(法军)纷纷倒地”③,并诡称由他指挥各军“收复”了镇南关等等,以推卸东线反攻失利的责任。
东线清军反攻失利,主要原因在于前敌指挥潘鼎新消极怯战,畏敌如虎,以致屡误战机。“潘军不是没有战争经验,又用新式槍械,节节败退,完全是接受李鸿章失败主义的影响。”④潘鼎新在作战指挥上,明显地犯了消极被动、分兵把口的错误。东线清军顺利进抵船头、郎甲一线以后,正值法军兵力分散、援军未到和越南义军纷起袭扰的有利时机,战场的优势和主动,基本上在清军方面。然而,潘鼎新却滞留谅山,与西线方面互相观望,消极等待,强调“一俟滇军牵制西路,此间有隙可乘”,才能“趁势袭缺⑤,使法军得以从容集结兵力,分别夺取郎甲,船头。清军被迫退守山区,丧失了战场上的主动权。尔后,清军经过调整补充,实力大为加强;法军则因国内援军未到,宣光被围,处境相当困难,不得不转攻为守,仅以部分兵力守备前沿阵地。这时,清军在全局形势上仍有可能挽回颓势。以越北山区的有利地形,完全可以正面钳制,侧后攻击,粉碎法军的进攻。可是,由于清军在总的战略指导上消极被动,以致在兵力部署上仍将前线数十营部队分散于观音桥、谷松、车里各点,正面宽广,没有形成重点,加上配置于谅山纵深的兵力又没有适时向前机动,起不到预备队的作用,以致形成前后分兵把口,被动挨打的态势。在作战过程中,潘鼎新决心犹豫,朝令夕改,不能组织第一线各部之间的相互协同,特别是法军专攻中路,苏元春部节节败退之际,没有及时机动翼侧军队加强纵深防御或向敌人侧后出击,使法军得以长一驱一直一入,连续突破中路防御,直一逼一谅山。此外,清军中派系矛盾的长期存在,也严重影响了各部之间的统一与协同。如王德榜“自负湘中老将,每与督师(潘鼎新)龃龉”①,潘鼎新便有意“征调屡更”,使之无所适从,疲于奔命,最后反诬王“催援不至”。丰谷之战,苏元春不及时援救王德榜部,法军攻中路苏元春部时,王也就消极观望,不主动支援,给了法军以各个击破的机会。
三、西线滇军东下受阻
在正式对法宣战前后,清廷多次命令西线指挥官岑毓英再度督师出关,与东线桂军合力规复北圻各城。但岑迟至1884年9月28日才命令原留驻于文盘、大滩一带的黑旗军十个营(约三千七百人)、滇军张世荣部五个营(约二千五百人)分道前进:黑旗军黄守忠、吴凤典两部由山路绕赴陆安,出馆司之后;刘永福、张世荣率部沿红河直下,期收夹击之效。岑毓英企图先后夺取陛司、宣光,并以集结于云南边境的滇军主力六千余人沿红河逐次进占夏和、清波以及临洮等地,得手后,再与东线清军会师,并力进攻北宁、河内。
北圻法军为贯彻其西守东攻的作战方针,于10月11日撤走馆司守军,以便缩短防线,固守兴化、端雄、宣光,保证河内以西地区的安全。岑毓英鉴于馆司之敌自动撤离,便将黑旗军及滇军张世荣部集中指向宣光。
宣光城筑有石墙,依山傍水,“向称天险,城内一山耸峙,悬炮可击外军,城外植竹五六重,兵难破入”①。10月中旬,清军陆续进抵宣光附近,因法军水陆防守甚严,便在离城十里的琅玡、中门等处扎营。此时,东线桂军已失郎甲、船头,清廷严令滇军速进,以分敌势。岑毓英乃于10月20日由保胜移驻文盘,并调原驻扎于云南边境的记名提督吴永安、邹复胜所部四千人和记名总兵覃修纲所部二千余人进扎馆司、夏和、清波一带,伺机向兴化等地进击,威胁敌军后路;同时,令宣光清军逐步进一逼一城下,四面围困敌人。
法军为确保宣光,稳定北圻西线防御态势,从11月4日至12日,多次派兵增援,但大都被清军击退。11月12日起,清军于宣光东南十余华里的左育地方清河(今泸江)两岸挖筑地营,并将以前截获的船只装石塞河,以期截断法军水路交通。11月18日,法军端雄、山西地区指挥官多米尼亲率步、炮、工兵千余人,搭乘炮舰五艘、民船十余只,趁连日大雨、清河水涨之机,增援宣光,遭到埋伏于左育清河两岸的清军夹击,不能通过。次日,法军舍舟登岸,分两路进犯左育。清军依托地营毙伤法军百余人,但因工事尚未全部构成,又遭敌人腹背夹击,被迫撤出阵地。法军立即上船,驶抵宣光,加强了城防力量。岑毓英强调必须先取宣光,滇桂各军联为一气,才能相机进取,因而使黑旗军和大量滇军长期顿兵于坚城之下,不能东进,坐视法军集中兵力专注谅山。
12月,清军围城部队又得到补充。月初,唐景崧在龙州招募的四个营(二千人)经牧马进抵宣光城外(后又扩编为六个营);月底,记名总兵丁槐所部十三小营(共三千人)出马白关,经河一陽一(今河江)进至宣光。1885年1月中旬,岑毓英由文盘进扎馆司,随即派兵三千六百人由记名提督何秀林率领前往宣光方向,进一步加强围城兵力。在此期间,宣光清军重新调整了部署:由黑旗军和何秀林部担任阻援,唐景崧、丁槐(兼统张世荣部)两部分驻城北和城南(均离城一公里左右),担任攻城。
1月26日,唐、丁两部合力夺取宣光城南法军据点,法军开东门出援,双方展开激战,彼此伤亡很重。后因何秀林部赶来增援,法军又撤入城内。接着,清军采用“滚草龙”的战法①,于31日夺取了南门炮台,并歼敌二百余人。此后,法军被迫龟缩城中,由于水路被黑旗军切断,供一应日缺,处境极艰,只好用玻璃瓶、竹筒等封装求援信,投入清河顺流而下,向端雄、河内告急。2月,清军连续攻城,多次挖地道用地雷炸开城墙,从缺口突入城内,但因法军阻击火力较猛,均未成功。
波里也为解宣光之围,亲率由谅山撤回的法军第一旅溯河而上,2月27日于端雄登陆,与不久前派出的先遣部队会合。
清军侦知法军大队来援,立即由何秀林部拨一千人前往左育,协助黑旗军阻援。另以覃修纲部二千人出扎临洮府附近,待法军攻左育时,向端雄前进,断敌后路。3月2日,法军分路进攻左育及对岸的同章。左育黑旗军依托地营顽强抗击,并引发地雷,多次打退法军的冲击,毙伤大量敌人。后由于防守同章的黄守忠部黑旗军被敌击溃①,法军占据对河高地,安设炮位,向左育黑旗军轮番炮击。刘永福所部黑旗军伤亡近千人,不得不撤出左育阵地。新赶到的何秀林部也不支败退。覃修纲部进至端雄,闻法军已抵宣光,只得仍回临洮、清波。
岑毓英见宣光法军兵力大增,随即命令疲惫不堪的围城部队撤至宣光附近山区休整;唐景崧所部六营则经占化撤往牧马。西线清军围攻宣光的计划半途而废,东下河内的意图随之落空。据岑毓英奏称:此次以近万人攻城,“历三十五、六昼夜,久雨泥滑,死者一千数百余人,伤者二千余人,疲惫不堪,不能不暂为休息。”②岑毓英明知“顿兵坚城,徒伤一精一锐”③,唐景崧也“明知攻坚,兵家下策也”,可是又强调“事急不得不攻,且城垂拔亦不肯松劲”④。不难看出,此次行动的失利,实属作战指导上的严重错误所致。以滇军当时的兵力,一面围宣光,一面沿河东进,威胁河内,使敌不敢增援宣光,是可能办到的。此着不行,顿兵坚城,反为敌所牵制,置优势兵力于无用。宣光既久攻不下,就应适时把作战重点改为打援,援兵既挫,宣光不难攻下。此着又不用,结果丧失主动,为敌所败。
四、清军陆路大捷(参见附图十五)
(一)临洮败敌
1885年3月,法军既解宣光之围,即以第一旅留守宣光,其余部队撤回端雄、河内等地。接着,波里也企图向兴化以西红河两岸滇军发动进攻,进一步改善法军在北圻西线的态势,保障主力继续在东线发展进攻。岑毓英获此情报,即令覃修纲部(此时约为四千人)严守夏和、清波、锦溪等红河两岸要点,令云南农民军竹春、陶美等部千余人及越南义军一部,与滇军李应珍部共同防守临洮府以东村落,刘永福则率黑旗军进驻临洮。
3月23日,法军非洲兵千余人及越南教民一批,由兴化渡红河,进攻临洮东南的山围社。在此防守的中越军民联合部队坚守地营,沉着应战。待敌接近时,槍炮齐鸣,并引发地雷,打退了进攻之敌。法军连续几次冲击,守军均依托工事,发挥近战火力,顽强奋战,毙伤不少敌人,守住了阵地。傍晚,正当法军进退维谷之时,与刘永福有联系的越南义军在村落四周遍插黑旗,用中国话齐声喊杀。法军以为突遭黑旗军包围,惊魂落魄,纷纷脱掉军服,乘夜从附近的河沟泅水,偷偷向越池方向逃窜。守军没有发觉,未予追击。
中越军民在临洮附近大败法军,毙伤敌军数百人①,缴获法军红白衣裤、军帽等千余件。这是西线战场上取得的一次较大胜利。这次战斗的主要特点,是中越两国军民紧密配合,英勇战斗。另外,守军充分利用地形,构筑了比较适应当时作战情况的野战工事——地营,减煞了敌人的火力优势,弥补了自己火力不强的弱点,也是这次取胜的一个重要原因。
唐景崧对滇军构筑地营一事,作了相当详细的记载①,这表明滇军在这方面有其独到之处,至少在他看来,如此完善的地营是当时战争中的新鲜事物。
“野战筑城工事具有和军队同样悠久的历史。”“兵力上处于劣势的军队,可借以成功地抵抗优势敌人,因而野战工事能对战局的结果起重大影响。”②随着野战炮兵的大量使用和火炮射速与弹丸威力的加大,仅凭地面工事远远不能适应战争的需要,从而迫使人们向地下发展,构筑既能防护自己、又能攻击敌人的地下工事。地营的出现和发展,正是战争发展的必然产物。在中法战争中,滇军和黑旗军一直重视这一作战手段,“扎营之处,兵卒均荷锄铲刀锯之类,掘地锯木”③,修筑基本上相当于今日有被覆的野战掩体的地营,在各次战斗中都收到了较好的效果。
(二)镇南关大捷(参见附图十六)
在潘鼎新不战而逃、东线法军直一逼一广西国门的情况下,龙州等地商民惊徙,游勇肆掠,难民蔽江而下,广西全省大震,形势十分严重。清廷以广西关外各军迭次失利,于2月17日电令冯子材帮办广西关外军务。冯子材虽已年近七旬,但“久任广西提督,三次出关,威惠素著,得桂、越人心”①。由于潘鼎新远离前线,前敌将领公推冯为东线总指挥。②冯子材决心“保关克谅”,并相机收复北圻各城。他一面调整部署,令部下赶修工事,一面整顿军纪,安定民心,迅速稳定和改善了防御态势。
与此同时,清政一府通过总税务司赫德的私人代表金登干①在巴黎与法国政一府之间的秘密谈判正在加紧进行。由于法军在北圻东线占领谅山之后,接着于3月3日在西线解了宣光之围,法国政一府急于趁胜迫和,以缓和国内人民对旷日持久的战争所表现的强烈不满。为了保证它在和议中处于更加有利的地位,法国政一府要求东线法军继续发展进攻。波里也随即于3月16日电告尼格里:现在正与中国进行谈判,若能对龙州有所动作,派北非骑兵前去,将大有裨益。你看有什么办法,可以使中国人相信我们不久就要向龙州进攻。②接着,波里也向谅山方面增派援军。尼格里认为威胁龙州是“玩一种危险的把戏”③,但还是积极备战,待命行动。
根据当面敌情和广西中越边境的地形条件,冯子材经过反复勘察,选定关前隘(今隘口南)附近的有利地形构筑防御阵地。关前隘在镇南关内约八华里处,东西两面高山夹峙,中间为宽约二华里的隘口。东面的大青山高八百余米,向南倾斜与小青山相连,再南为马鞍山,一直延伸到镇南关的东面。西面的凤尾山高六百余米,同样向南倾斜,直至龙门关(一东西向峡口,有小路可通扣波),然后经一座大石山延伸到镇南关的西面。关前隘南面的谷地宽二华里多,谷地南端有几座小石山,往南直至镇南关都是起伏不平的山丘,统称横坡岭。冯子材命令部队在关前隘附近筑起一道土石长墙(长三里多,高约七尺,宽约四尺),横跨东西两岭之间,墙外挖掘四尺宽的深堑,以利坚守,并在东西岭上修筑堡垒多座,构成一个较完整的山地防御阵地体系。
在兵力部署上,冯子材亲率所部冯军担任关前隘正面防御,扼守长墙和山险要地;王孝祺部八个营屯于冯军后面半华里处,作为正面防御的第二梯队;王德榜所部湘军十个营屯于油隘,保障入关旁路的安全,并相机袭击敌后;苏元春及陈嘉所部桂军十八营屯于幕府(关前隘之后五华里),作为总预备队;魏纲所部鄂军八个营驻平而关,控制由艽封(今七溪)至龙州的水道。此外,蒋宗汉部(杨玉科阵亡后,所部由蒋统领)及方友升部共十余营屯于凭祥,潘鼎新率淮军五营屯于海村,以镇后路。加上驻龙州、新街等处部队,东线清军总兵力约达八十余营。
8月9日,尼格里派北非骑兵和越伪军各一部,企图由文渊练扣波进占艽封、牧马,绕出镇南关之北,摆出一副威胁龙州、切断唐景崧部(当时已由宣光撤至占化)和马盛治部(驻新街)归路的架势。冯子材根据越南人民提一供的情报,立即派驻龙州的冯军五个营①前往扣波,苏元春则率桂军暨魏纲部前往艽封。8月13日,法军进至艽封,见清军已先期到达,便掉头南撤。到达扣波的冯军奋力拦击,法军败回文渊。尔后,苏元春部仍回幕府,魏纲部八营和冯军五营则分别留守艽封、扣波。
3月21日,冯子材为打乱敌人的进攻部署,不顾潘鼎新等人的阻挠,决定先发制敌,毅然率王孝祺部出关夜袭法军前哨据点文渊,一度冲入街心,毙伤不少敌人,并毁炮台两座后主动撤回,取得了较大胜利。由于清军的主动出击,尼格里感到自己已处于被动地位,为争取主动,他不待援军到齐,决定提前发起进攻。
3月23日晨,法军第二旅主力一千余人趁大雾偷偷进入镇南关。上午10时30分,大雾开始消散,法军便分两路进攻:主力沿东岭前进;另一路沿关前隘谷地前进,企图在主力夺取大青山顶峰大堡之后,两路前后夹击,攻占关前隘清军阵地。此外,法军一部近千人配置于镇南关东南高地,作为预备队,并向油隘方向担任警戒。冯子材立即商请驻于幕府的苏元春部前来接应,又通知王德榜部从侧后截击敌人。冯子材自率所部和王孝祺部奋力迎击当面之敌。法军在猛烈炮火掩护下,经过几小时的拚死争夺,占领了尚未完工的东岭五座堡垒(分别构筑于小青山五个相连的山峰上)中的三座。冯子材见形势逐渐危急,激昂地高呼:“法再入关,有何面目见粤民?何以生为!”②冯、王两部将士在一爱一国热情激励下,誓与长墙共存亡,个个奋不顾身,英勇抗击,阻止了敌人的前进。下午4时许,苏元春、陈嘉等率部自幕府赶来增援。不久,蒋宗汉、方友升部也闻讯赶来。各部奋力抵抗,战斗甚为激烈,彼此势均力敌,死伤相当。当天,王德榜部自油隘出击法军右翼,牵制了敌预备队的机动,并一度切断敌人运送军一火、粮食的交通线,有力地配合了东岭的战斗。入夜,清军进一步调整部署,由苏元春部协助冯军守长墙,王孝祺部守西岭,陈嘉部守东岭,蒋宗汉、方友升部扼守大青山顶峰。冯子材还派人持大令飞调驻扣波的五营冯军前来抄袭法军左翼。附近群众连夜挑水送饭,赶运弹药。将士们磨刀擦槍,修补工事,严阵以待。经过一番整顿,前线军民更加同仇敌忾,决心与侵略者血战到底。
3月24日晨,尼格里指挥法军分三路再次发起冲击。在侥幸取胜的心理支配下,尼格里首先派其副手陆军中校一爱一尔明加率兵一部,利用大雾偷偷向大青山顶前进,企图突然夺取大堡,控制东岭制高点;但由于地形险峻,道路难行,法军偷袭未逞,不得已沿原路退回。上午11时许,尼格里见山顶久无动静,以为偷袭部队已不战而占领了山顶大堡,便命令以猛烈炮火轰击清军正面防御工事,企图掩护沿谷地前进的法军接近长墙,配合东岭法军一举突破关前隘阵地。冯子材立即传令各部统领:“有退者,无论何将遇何军,皆诛之!”①并于各路设卡,堵截逃兵。当敌人接近长墙时,冯子材持矛大呼,率领两个儿子跃出长墙,冲入敌阵,展开白刃格斗。全军将士见主帅身先士卒,一齐大开栅门,向敌人冲去。当地人民群众和部分散兵游勇也主动前来助战,“伺便随处狙击”②。中午,从扣波赶来增援的五营冯军在游击杨瑞山、都司麦凤标等率领下,由摩沙村(龙门关西口)冲进龙门关,突然出现在法军侧后,给进攻之敌以意想不到的打击。经过一场激烈的殊死战斗,中路法军狼狈退回谷地。在关前隘长墙激战的同时,陈嘉、蒋宗汉相继率部反复争夺被法军占领的东岭三座堡垒。直到傍晚,王德榜部在击溃敌之增援部队及消灭其运输队后,从关外夹击法军右侧后,配合东岭守军夺回了全部敌占堡垒。这时,王孝祺部也已击退沿西岭进攻之敌,并由西岭包抄敌后。法军三面被围,伤亡甚众,后援不及,弹药将尽,开始全线溃散。于是,尼格里不得不下令撤退,法军丢下数百具一尸一体,狼狈逃回文渊。
冯子材指挥东线清军取得了镇南关大捷,共毙伤敌军一精一锐近千人,缴获大批槍炮、干粮,大大鼓舞了中越两国军民的斗志,沉重打击了法国侵略者的气焰。这是中法战争中关系全局的一战。它不仅使北圻东线反攻转败为胜,而且使整个战局发生了根本一性一的变化。“法人自谓入中国以来,从未受此大创。”①3月27日晚,法军惨败的消息传到巴黎,立刻在法国统治阶级中引起巨大的震动和恐慌。他们害怕因此而动摇法国在远东初步建立起来的殖民统治,因而群起抨击茹费理的远东政策。法国人民也纷起反对茹费理政一府的殖民战争。3月29日,法军在谅山惨败的消息接踵传至巴黎,茹费理内阁随即于3月31日在一片责骂声中垮台了。
东线法军经镇南关惨败之后,人数不满二千,在文渊稍事休整,主力即仓卒撤至谅山,和已经到达那里的援兵会合,总数增加到四千五百人左右。冯子材为了不给溃败之敌以喘一息机会,于3月26日亲率所部及王孝祺部出关进攻文渊,并通知王德榜部由小路抄袭敌之右翼。文渊守敌倾巢出战,清军“分路四面环攻,槍炮雨密”②。战不多时,守敌头目中弹落马,余众溃逃,清军立将文渊收复。
这时,越南义军已在谅山通往那一陽一、屯梅等交通线上加紧袭扰,给法军后方以很大威胁。尼格里企图坚守谅山,等待更多援兵到达后再次进犯镇南关,做了如下部署:主力扼守驱驴北面的一个高地,以确保驱驴,屏一蔽谅山;一部兵力配置于淇江(今奇穷河)南岸,分守通向谷松、屯梅的交通要道;将老弱残兵编成“城堡班”,驻守谅山城垣碉堡。
冯子材鉴于谅山为越南北部军事要地,“若不急先攻取,实难成破竹之势”。并且认为,法军连战皆败,心胆已寒,“与其明攻多损士卒,不如暗取包易见功”。因此,与苏元春等密商,“以正兵明攻驱驴,出奇兵暗取谅山”。①3月27日,冯子材派杨瑞山率所部绕道而进,乘夜渡过淇江,于次日黄昏潜至谅山,散伏城外各处。
3月28日,冯子材、苏元春、王德榜、王孝祺各部次第向前挺一进,分三路一逼一攻驱驴:冯子材、苏元春率主力进攻正面;王孝祺部和冯军一部进攻西面;王德榜部进攻东面。法军依托驱驴北面高地的坚固工事,负隅顽抗,阻止了清军的进攻。尼格里鉴于其左翼和正面阵地工事坚固,而东面地形较难防守,决定由一爱一尔明加率军一部,向东面的王德榜部发起反击。下午2时许,冯、苏两部趁敌人调动兵力、正面防御力量有所减弱之机,再次发起猛烈攻击。激战中,尼格里胸部中弹重伤,接替指挥的一爱一尔明加随即下令向淇江南岸撤退。谅山守敌在慌乱中砍断浮桥,致使部分法军在溃逃中落水溺死。之后,法军退入谅山城,并立即部署分两路向南撤退。
3月29日拂晓,清军主力徒涉淇江,向谅山挺一进。在此之前,埋伏于城外的杨瑞山部乘法军熟睡之机,突然发起攻击。城中法军仓皇应战,一片混乱。杨瑞山等“督率各营员弁、勇丁,蚁附而上,劈开城门,兵刃交下”②。法军死伤累累,残部向南逃窜。清军追击二十余里,并边进边搜山,从山谷中俘获不少敌人。
清军在克复谅山的过程中,共毙伤法军近千人,并缴获大量军械物资,仅杨瑞山部就夺获大小火炮三十余门。
谅山既克,清军乘胜分东西两路向南追击。3月31日,东路陈嘉部及王德榜部攻克谷松,西路冯军一部克复屯梅,进一逼一郎甲。法军犹如惊弓之鸟,一口气逃到郎甲、船头一带。
在这大好形势鼓舞下,越南义军的活动更加频繁。北宁总督黄廷经集合各路义民二万余人,“建冯军旗号,自愿挑浆饭,作向导,随军助剿,或分道进攻”①。河内、海一陽一、太原、西贡等地人民也纷纷酝酿起义,盼望清军早日挥戈南下,赶走法国侵略者。冯子材决定于4月中旬亲率东线全军进攻北宁、河内;唐景崧部也准备出牧马,攻太原;广东方面,准备派兵出钦州,沿北圻东海岸进攻广安;会办云南军务鲍超所部三十余营生力军正向龙州前进,随时准备入越;西线滇军也已克复广威等地,正向兴化发展进攻。但就在这时,清廷下达了妥胁求和的停战撤兵令,彻底破坏了前线军民乘胜进军的作战计划。