@@ -253,8 +253,14 @@ func (cfg *Config) ParseFlags(flags Flags, f *flag.FlagSet, arguments []string)
253253 f .BoolVar (& cfg .HideDiagnostics , "hidediag" , false , "hide diagnostics sent by LSP server" )
254254 f .BoolVar (& cfg .RPCTrace , "rpc.trace" , false , "print the full rpc trace in lsp inspector format" )
255255 f .StringVar (& workspaces , "workspaces" , "" , "colon-separated list of initial workspace directories" )
256- f .Var (& userServers , "server" , `language server command for filename match (e.g. '\.go$:gopls')` )
257- f .Var (& dialServers , "dial" , `language server address for filename match (e.g. '\.go$:localhost:4389')` )
256+ f .Var (& userServers , "server" , `map filename to language server command. The format is
257+ 'handlers:cmd' where cmd is the LSP server command and handlers is
258+ a comma separated list of 'regexp[@lang]'. The regexp matches the
259+ filename and lang is a language identifier. (e.g. '\.go$:gopls' or
260+ 'go.mod$@go.mod,go.sum$@go.sum,\.go$@go:gopls')` )
261+ f .Var (& dialServers , "dial" , `map filename to language server address. The format is
262+ 'handlers:host:port'. See -server flag for format of
263+ handlers. (e.g. '\.go$:localhost:4389')` )
258264 }
259265 if err := f .Parse (arguments ); err != nil {
260266 return err
@@ -273,20 +279,20 @@ func (cfg *Config) ParseFlags(flags Flags, f *flag.FlagSet, arguments []string)
273279 cfg .Servers [key ] = & Server {
274280 Command : strings .Fields (sa .args ),
275281 }
276- handlers = append ( handlers , FilenameHandler {
277- Pattern : sa . pattern ,
278- ServerKey : key ,
279- })
282+ for _ , h := range sa . handlers {
283+ h . ServerKey = key
284+ handlers = append ( handlers , h )
285+ }
280286 }
281287 for i , sa := range dialServers {
282288 key := fmt .Sprintf ("_userDialServer%v" , i )
283289 cfg .Servers [key ] = & Server {
284290 Address : sa .args ,
285291 }
286- handlers = append ( handlers , FilenameHandler {
287- Pattern : sa . pattern ,
288- ServerKey : key ,
289- })
292+ for _ , h := range sa . handlers {
293+ h . ServerKey = key
294+ handlers = append ( handlers , h )
295+ }
290296 }
291297 // Prepend to give higher priority to command line flags.
292298 cfg .FilenameHandlers = append (handlers , cfg .FilenameHandlers ... )
@@ -295,7 +301,8 @@ func (cfg *Config) ParseFlags(flags Flags, f *flag.FlagSet, arguments []string)
295301}
296302
297303type serverArgs struct {
298- pattern , args string
304+ handlers []FilenameHandler
305+ args string
299306}
300307
301308type serverFlag []serverArgs
@@ -309,12 +316,31 @@ func (sf *serverFlag) Set(val string) error {
309316 if len (f ) != 2 {
310317 return errors .New ("flag value must contain a colon" )
311318 }
319+ // allow f[0] to be empty, as that's a valid regexp that matches anything
312320 if len (f [1 ]) == 0 {
313321 return errors .New ("empty server command or addresss" )
314322 }
323+ pairs := strings .Split (f [0 ], "," )
324+ args := f [1 ]
325+
326+ var handlers []FilenameHandler
327+ for _ , pp := range pairs {
328+ f := strings .SplitN (pp , "@" , 2 )
329+ if len (f ) != 2 {
330+ handlers = append (handlers , FilenameHandler {
331+ Pattern : pp ,
332+ LanguageID : "" ,
333+ })
334+ } else {
335+ handlers = append (handlers , FilenameHandler {
336+ Pattern : f [0 ],
337+ LanguageID : f [1 ],
338+ })
339+ }
340+ }
315341 * sf = append (* sf , serverArgs {
316- pattern : f [ 0 ] ,
317- args : f [ 1 ] ,
342+ handlers : handlers ,
343+ args : args ,
318344 })
319345 return nil
320346}
0 commit comments