# Environment Variables and Pipes Alternative to `CallLua`, `CallLuaSilently` messages that call Lua functions, there are `Call0`, `CallSilently0`, `BashExec0`, `BashExecSilently0` messages that call shell commands. ### Example: Simple file opener using xdg-open and $XPLR_FOCUS_PATH ```lua xplr.config.modes.builtin.default.key_bindings.on_key["X"] = { help = "open", messages = { { BashExecSilently0 = [===[ xdg-open "${XPLR_FOCUS_PATH:?}" ]===], }, }, } ``` However, unlike the Lua functions, these shell commands have to read the useful information and send messages via environment variables and temporary files called "pipe"s. These environment variables and files are only available when a command is being executed. ### Example: Using Environment Variables and Pipes ```lua xplr.config.modes.builtin.default.key_bindings.on_key["space"] = { help = "ask name and greet", messages = { { BashExec0 = [===[ echo "What's your name?" read name greeting="Hello $name!" message="$greeting You are inside $PWD" "$XPLR" -m 'LogSuccess: %q' "$message" ]===] } } } -- Now, when you press "space" in default mode, you will be prompted for your -- name. Enter your name to receive a nice greeting and to know your location. ``` Visit the [**fzf integration tutorial**][19] for another example. To see the environment variables and pipes, invoke the shell by typing `:!` in default mode and run the following command: ``` env | grep ^XPLR ``` You will see something like: ``` XPLR=xplr XPLR_FOCUS_INDEX=0 XPLR_MODE=action to XPLR_PIPE_SELECTION_OUT=/run/user/1000/xplr/session/122278/pipe/selection_out XPLR_INPUT_BUFFER= XPLR_PIPE_GLOBAL_HELP_MENU_OUT=/run/user/1000/xplr/session/122278/pipe/global_help_menu_out XPLR_PID=122278 XPLR_PIPE_MSG_IN=/run/user/1000/xplr/session/122278/pipe/msg_in XPLR_PIPE_LOGS_OUT=/run/user/1000/xplr/session/122278/pipe/logs_out XPLR_PIPE_RESULT_OUT=/run/user/1000/xplr/session/122278/pipe/result_out XPLR_PIPE_HISTORY_OUT=/run/user/1000/xplr/session/122278/pipe/history_out XPLR_FOCUS_PATH=/home/sayanarijit/Documents/GitHub/xplr/docs/en/book XPLR_SESSION_PATH=/run/user/1000/xplr/session/122278 XPLR_APP_VERSION=0.14.3 XPLR_PIPE_DIRECTORY_NODES_OUT=/run/user/1000/xplr/session/122278/pipe/directory_nodes_out ``` The environment variables starting with `XPLR_PIPE_` are the temporary files called ["pipe"s][18]. The other variables are single-line variables containing simple information: - [XPLR][38] - [XPLR_APP_VERSION][30] - [XPLR_FOCUS_INDEX][31] - [XPLR_FOCUS_PATH][32] - [XPLR_INPUT_BUFFER][33] - [XPLR_INITIAL_PWD][40] - [XPLR_MODE][34] - [XPLR_PID][35] - [XPLR_SESSION_PATH][36] - [XPLR_VROOT][39] ### Environment variables #### XPLR The binary path of xplr command. #### XPLR_APP_VERSION Self-explanatory. #### XPLR_FOCUS_INDEX Contains the index of the currently focused item, as seen in [column-renderer/index][10]. #### XPLR_FOCUS_PATH Contains the full path of the currently focused node. #### XPLR_INITIAL_PWD The $PWD then xplr started. #### XPLR_INPUT_BUFFER The line currently in displaying in the xplr input buffer. For e.g. the search input while searching. See [Reading Input][37]. #### XPLR_MODE Contains the mode xplr is currently in, see [modes][11]. #### XPLR_PID Contains the process ID of the current xplr process. #### XPLR_SESSION_PATH Contains the current session path, like /tmp/runtime-"$USER"/xplr/session/"$XPLR_PID"/, you can find temporary files here, such as pipes. #### XPLR_VROOT Contains the path of current virtual root, is set. ### Pipes #### Input pipe Currently there is only one input pipe. - [XPLR_PIPE_MSG_IN][20] #### Output pipes `XPLR_PIPE_*_OUT` are the output pipes that contain data which cannot be exposed directly via environment variables, like multi-line strings. These pipes can be accessed as plain text files located in $XPLR_SESSION_PATH. Depending on the message (e.g. `Call` or `Call0`), each line will be separated by newline or null character (`\n` or `\0`). - [XPLR_PIPE_SELECTION_OUT][21] - [XPLR_PIPE_GLOBAL_HELP_MENU_OUT][22] - [XPLR_PIPE_LOGS_OUT][23] - [XPLR_PIPE_RESULT_OUT][24] - [XPLR_PIPE_HISTORY_OUT][25] - [XPLR_PIPE_DIRECTORY_NODES_OUT][26] #### XPLR_PIPE_MSG_IN Append new messages to this pipe in [YAML][27] (or [JSON][7]) syntax. These messages will be read and handled by xplr after the command execution. Depending on the message (e.g. `Call` or `Call0`) you need to separate each message using newline or null character (`\n` or `\0`). > **_NOTE:_** Since version `v0.20.0`, it's recommended to avoid writing > directly to this file, as safely escaping YAML strings is a lot of work. Use > `xplr -m` / `xplr --pipe-msg-in` to pass messages to xplr in a safer way. > > It uses [jf][41] syntax to safely convert an YAML template into a valid message. > > Example: `"$XPLR" -m 'ChangeDirectory: %q' "${HOME:?}"` #### XPLR_PIPE_SELECTION_OUT List of selected paths. #### XPLR_PIPE_GLOBAL_HELP_MENU_OUT The full help menu. #### XPLR_PIPE_LOGS_OUT List of logs. #### XPLR_PIPE_RESULT_OUT Result (selected paths if any, else the focused path) #### XPLR_PIPE_HISTORY_OUT List of last visited paths (similar to jump list in vim). #### XPLR_PIPE_DIRECTORY_NODES_OUT List of paths, filtered and sorted as displayed in the [files table][28]. [7]: https://www.json.org [10]: column-renderer.md#index [11]: modes.md#modes [18]: #pipes [19]: configure-key-bindings.md#tutorial-adding-a-new-mode [20]: #xplr_pipe_msg_in [21]: #xplr_pipe_selection_out [22]: #xplr_pipe_global_help_menu_out [23]: #xplr_pipe_logs_out [24]: #xplr_pipe_result_out [25]: #xplr_pipe_history_out [26]: #xplr_pipe_directory_nodes_out [27]: https://www.yaml.org [28]: layout.md#table [30]: #xplr_app_version [31]: #xplr_focus_index [32]: #xplr_focus_path [33]: #xplr_input_buffer [34]: #xplr_mode [35]: #xplr_pid [36]: #xplr_session_path [37]: messages.md#reading-input [38]: #xplr [39]: #xplr_vroot [40]: #xplr_initial_pwd [41]: https://github.com/sayanarijit/jf