@@ -3,6 +3,7 @@ use super::Command;
33use crate :: Error ;
44use async_trait:: async_trait;
55use clap:: { Arg , ArgMatches , Command as ClapCommand } ;
6+ use std:: collections:: HashMap ;
67
78/// Abstract `edit` command
89///
@@ -161,21 +162,39 @@ impl Command for EditCommand {
161162 args. extend_from_slice ( & editor_args) ;
162163 }
163164
164- let editor_env = & conf. code . editor_env ;
165- let mut env: Vec < & str > = vec ! [ "" , "" ] ;
166- if !editor_env. is_empty ( ) {
167- env = editor_env. splitn ( 2 , '=' ) . collect ( ) ;
168- if env. len ( ) != 2 {
169- return Err ( crate :: Error :: FeatureError (
170- "Invalid environment variable, please check your configuration for errors"
171- . into ( ) ,
172- ) ) ;
165+ // Set environment variables for editor
166+ //
167+ // for example:
168+ //
169+ // ```toml
170+ // [code]
171+ // editor = "nvim"
172+ // editor_envs = [ "XDG_DATA_HOME=...", "XDG_CONFIG_HOME=...", "XDG_STATE_HOME=..." ]
173+ // ```
174+ //
175+ // ```rust
176+ // Command::new("nvim").envs(&[ ("XDG_DATA_HOME", "..."), ("XDG_CONFIG_HOME", "..."), ("XDG_STATE_HOME", "..."), ]);
177+ // ```
178+ let mut envs: HashMap < String , String > = Default :: default ( ) ;
179+ if let Some ( editor_envs) = & conf. code . editor_envs {
180+ for env in editor_envs. iter ( ) {
181+ let parts: Vec < & str > = env. split ( '=' ) . collect ( ) ;
182+ if parts. len ( ) == 2 {
183+ let name = parts[ 0 ] . trim ( ) ;
184+ let value = parts[ 1 ] . trim ( ) ;
185+ envs. insert ( name. to_string ( ) , value. to_string ( ) ) ;
186+ } else {
187+ return Err ( crate :: Error :: FeatureError ( format ! (
188+ "Invalid editor environment variable: {}" ,
189+ & env
190+ ) ) ) ;
191+ }
173192 }
174193 }
175194
176195 args. push ( path) ;
177196 std:: process:: Command :: new ( conf. code . editor )
178- . env ( env [ 0 ] , env [ 1 ] )
197+ . envs ( envs )
179198 . args ( args)
180199 . status ( ) ?;
181200 Ok ( ( ) )
0 commit comments