@@ -77,6 +77,7 @@ fn enumerate_shells() -> Vec<Shell> {
77
77
Box :: new( Bash ) ,
78
78
Box :: new( Zsh ) ,
79
79
Box :: new( Fish ) ,
80
+ Box :: new( Nu ) ,
80
81
]
81
82
}
82
83
@@ -255,6 +256,53 @@ impl UnixShell for Fish {
255
256
}
256
257
}
257
258
259
+ struct Nu ;
260
+
261
+ impl UnixShell for Nu {
262
+ fn does_exist ( & self , process : & Process ) -> bool {
263
+ // nu has to either be the shell or be callable for nu setup.
264
+ matches ! ( process. var( "SHELL" ) , Ok ( sh) if sh. contains( "nu" ) )
265
+ || utils:: find_cmd ( & [ "nu" ] , process) . is_some ( )
266
+ }
267
+
268
+ fn rcfiles ( & self , process : & Process ) -> Vec < PathBuf > {
269
+ let mut paths = vec ! [ ] ;
270
+
271
+ if let Ok ( p) = process. var ( "XDG_CONFIG_HOME" ) {
272
+ let path = PathBuf :: from ( p) . join ( "nushell/" ) ;
273
+ paths. push ( path. join ( "env.nu" ) ) ;
274
+ paths. push ( path. join ( "config.nu" ) ) ;
275
+ }
276
+
277
+ if let Some ( p) = process. home_dir ( ) {
278
+ let path = p. join ( ".config/nushell/" ) ;
279
+ paths. push ( path. join ( "env.nu" ) ) ;
280
+ paths. push ( path. join ( "config.nu" ) ) ;
281
+ }
282
+ paths
283
+ }
284
+
285
+ fn update_rcs ( & self , process : & Process ) -> Vec < PathBuf > {
286
+ let mut rcs = self . rcfiles ( process) ;
287
+ if rcs. len ( ) == 4 {
288
+ // The first two rcfile takes precedence (XDG_CONFIG_HOME).
289
+ rcs. truncate ( 2 ) ;
290
+ }
291
+ rcs
292
+ }
293
+
294
+ fn env_script ( & self ) -> ShellScript {
295
+ ShellScript {
296
+ name : "env.nu" ,
297
+ content : include_str ! ( "env.nu" ) ,
298
+ }
299
+ }
300
+
301
+ fn source_string ( & self , process : & Process ) -> Result < String > {
302
+ Ok ( format ! ( r#"source "{}/env.nu""# , cargo_home_str( process) ?) )
303
+ }
304
+ }
305
+
258
306
pub ( crate ) fn legacy_paths ( process : & Process ) -> impl Iterator < Item = PathBuf > + ' _ {
259
307
let zprofiles = Zsh :: zdotdir ( process)
260
308
. into_iter ( )
0 commit comments