From 71bd07b57dad86becf48249b4ec3baacec304f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Tue, 3 Dec 2024 19:47:11 -0800 Subject: [PATCH] zellij example --- examples/zellij-unquoted-bindings.kdl | 298 ++++++++++++++++++++++++++ examples/zellij.kdl | 297 +++++++++++++++++++++++++ src/document.rs | 3 + src/v2_parser.rs | 4 + 4 files changed, 602 insertions(+) create mode 100644 examples/zellij-unquoted-bindings.kdl create mode 100644 examples/zellij.kdl diff --git a/examples/zellij-unquoted-bindings.kdl b/examples/zellij-unquoted-bindings.kdl new file mode 100644 index 0000000..3ca7187 --- /dev/null +++ b/examples/zellij-unquoted-bindings.kdl @@ -0,0 +1,298 @@ +// This config is just like `zellij.kdl`, except it shows what it would look +// like if modifiers were done using `+` instead of spaces (thus needing to be +// quoted). +keybinds { + normal { + // uncomment this and adjust key if using copy_on_select=#false + /- bind Alt+c { Copy } + } + locked { + bind Ctrl+g { SwitchToMode Normal } + } + resize { + bind Ctrl+n { SwitchToMode Normal } + bind h Left { Resize Left } + bind j Down { Resize Down } + bind k Up { Resize Up } + bind l Right { Resize Right } + bind "=" + { Resize Increase } + bind - { Resize Decrease } + } + pane { + bind Ctrl+p { SwitchToMode Normal } + bind h Left { MoveFocus Left } + bind l Right { MoveFocus Right } + bind j Down { MoveFocus Down } + bind k Up { MoveFocus Up } + bind p { SwitchFocus } + bind n { NewPane; SwitchToMode Normal } + bind d { NewPane Down; SwitchToMode Normal } + bind r { NewPane Right; SwitchToMode Normal } + bind x { CloseFocus; SwitchToMode Normal } + bind f { ToggleFocusFullscreen; SwitchToMode Normal } + bind z { TogglePaneFrames; SwitchToMode Normal } + bind w { ToggleFloatingPanes; SwitchToMode Normal } + bind e { TogglePaneEmbedOrFloating; SwitchToMode Normal } + bind c { SwitchToMode RenamePane; PaneNameInput 0 } + } + move { + bind Ctrl+h { SwitchToMode Normal } + bind n Tab { MovePane } + bind h Left { MovePane Left } + bind j Down { MovePane Down } + bind k Up { MovePane Up } + bind l Right { MovePane Right } + } + tab { + bind Ctrl+t { SwitchToMode Normal } + bind r { SwitchToMode RenameTab; TabNameInput 0 } + bind h Left Up k { GoToPreviousTab } + bind l Right Down j { GoToNextTab } + bind n { NewTab; SwitchToMode Normal } + bind x { CloseTab; SwitchToMode Normal } + bind s { ToggleActiveSyncTab; SwitchToMode Normal } + bind "1" { GoToTab 1; SwitchToMode Normal } + bind "2" { GoToTab 2; SwitchToMode Normal } + bind "3" { GoToTab 3; SwitchToMode Normal } + bind "4" { GoToTab 4; SwitchToMode Normal } + bind "5" { GoToTab 5; SwitchToMode Normal } + bind "6" { GoToTab 6; SwitchToMode Normal } + bind "7" { GoToTab 7; SwitchToMode Normal } + bind "8" { GoToTab 8; SwitchToMode Normal } + bind "9" { GoToTab 9; SwitchToMode Normal } + bind Tab { ToggleTab } + } + scroll { + bind Ctrl+s { SwitchToMode Normal } + bind e { EditScrollback; SwitchToMode Normal } + bind s { SwitchToMode EnterSearch; SearchInput 0 } + bind Ctrl+c { ScrollToBottom; SwitchToMode Normal } + bind j Down { ScrollDown } + bind k Up { ScrollUp } + bind Ctrl+f PageDown Right l { PageScrollDown } + bind Ctrl+b PageUp Left h { PageScrollUp } + bind d { HalfPageScrollDown } + bind u { HalfPageScrollUp } + // uncomment this and adjust key if using copy_on_select=#false + /- bind Alt+c { Copy } + } + search { + bind Ctrl+s { SwitchToMode Normal } + bind Ctrl+c { ScrollToBottom; SwitchToMode Normal } + bind j Down { ScrollDown } + bind k Up { ScrollUp } + bind Ctrl+f PageDown Right l { PageScrollDown } + bind Ctrl+b PageUp Left h { PageScrollUp } + bind d { HalfPageScrollDown } + bind u { HalfPageScrollUp } + bind n { Search down } + bind p { Search up } + bind c { SearchToggleOption CaseSensitivity } + bind w { SearchToggleOption Wrap } + bind o { SearchToggleOption WholeWord } + } + entersearch { + bind Ctrl+c Esc { SwitchToMode Scroll } + bind Enter { SwitchToMode Search } + } + renametab { + bind Ctrl+c { SwitchToMode Normal } + bind Esc { UndoRenameTab; SwitchToMode Tab } + } + renamepane { + bind Ctrl+c { SwitchToMode Normal } + bind Esc { UndoRenamePane; SwitchToMode Pane } + } + session { + bind Ctrl+o { SwitchToMode Normal } + bind Ctrl+s { SwitchToMode Scroll } + bind d { Detach } + } + tmux { + bind "[" { SwitchToMode Scroll } + bind Ctrl+b { Write 2; SwitchToMode Normal } + bind "\"" { NewPane Down; SwitchToMode Normal } + bind % { NewPane Right; SwitchToMode Normal } + bind z { ToggleFocusFullscreen; SwitchToMode Normal } + bind c { NewTab; SwitchToMode Normal } + bind , { SwitchToMode RenameTab } + bind p { GoToPreviousTab; SwitchToMode Normal } + bind n { GoToNextTab; SwitchToMode Normal } + bind Left { MoveFocus Left; SwitchToMode Normal } + bind Right { MoveFocus Right; SwitchToMode Normal } + bind Down { MoveFocus Down; SwitchToMode Normal } + bind Up { MoveFocus Up; SwitchToMode Normal } + bind h { MoveFocus Left; SwitchToMode Normal } + bind l { MoveFocus Right; SwitchToMode Normal } + bind j { MoveFocus Down; SwitchToMode Normal } + bind k { MoveFocus Up; SwitchToMode Normal } + bind o { FocusNextPane } + bind d { Detach } + bind x { CloseFocus; SwitchToMode Normal } + } + shared_except locked { + bind Ctrl+g { SwitchToMode Locked } + bind Ctrl+q { Quit } + bind Alt+n { NewPane } + bind Alt+h Alt+Left { MoveFocusOrTab Left } + bind Alt+l Alt+Right { MoveFocusOrTab Right } + bind Alt+j Alt+Down { MoveFocus Down } + bind Alt+k Alt+Up { MoveFocus Up } + bind Alt+= Alt++ { Resize Increase } + bind Alt+- { Resize Decrease } + } + shared_except normal locked { + bind Enter Space Esc { SwitchToMode Normal } + } + shared_except pane locked { + bind Ctrl+p { SwitchToMode Pane } + } + shared_except resize locked { + bind Ctrl+n { SwitchToMode Resize } + } + shared_except scroll locked { + bind Ctrl+s { SwitchToMode Scroll } + } + shared_except session locked { + bind Ctrl+o { SwitchToMode Session } + } + shared_except tab locked { + bind Ctrl+t { SwitchToMode Tab } + } + shared_except move locked { + bind Ctrl+h { SwitchToMode Move } + } + shared_except tmux locked { + bind Ctrl+b { SwitchToMode Tmux } + } +} + +plugins { + tab-bar { path tab-bar } + status-bar { path status-bar } + strider { path strider } + compact-bar { path compact-bar } +} + +// Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP +// eg. when terminal window with an active zellij session is closed +// Options: +// - detach (Default) +// - quit +// +/- on_force_close quit + +// Send a request for a simplified ui (without arrow fonts) to plugins +// Options: +// - #true +// - #false (Default) +// +/- simplified_ui #true + +// Choose the path to the default shell that zellij will use for opening new panes +// Default: $SHELL +// +/- default_shell $SHELL + +// Toggle between having pane frames around the panes +// Options: +// - #true (default) +// - #false +// +/- pane_frames #true + +// Define color themes for Zellij +// For more examples, see: https://github.com/zellij-org/zellij/tree/main/example/themes +// Once these themes are defined, one of them should to be selected in the "theme" section of this file +// +// themes { +// dracula { +// fg 248 248 242 +// bg 40 42 54 +// red 255 85 85 +// green 80 250 123 +// yellow 241 250 140 +// blue 98 114 164 +// magenta 255 121 198 +// orange 255 184 108 +// cyan 139 233 253 +// black 0 0 0 +// white 255 255 255 +// } +// } + +// Choose the theme that is specified in the themes section. +// Default: default +// +/- theme default + +// The name of the default layout to load on startup +// Default: "default" +// +/- default_layout compact + +// Choose the mode that zellij uses when starting up. +// Default: normal +// +/- default_mode locked + +// Toggle enabling the mouse mode. +// On certain configurations, or terminals this could +// potentially interfere with copying text. +// Options: +// - #true (default) +// - #false +// +/- mouse_mode #false + +// Configure the scroll back buffer size +// This is the number of lines zellij stores for each pane in the scroll back +// buffer. Excess number of lines are discarded in a FIFO fashion. +// Valid values: positive integers +// Default value: 10000 +// +/- scroll_buffer_size 10000 + +// Provide a command to execute when copying text. The text will be piped to +// the stdin of the program to perform the copy. This can be used with +// terminal emulators which do not support the OSC 52 ANSI control sequence +// that will be used by default if this option is not set. +// Examples: +// +/- copy_command xclip -selection clipboard // x11 +/- copy_command wl-copy // wayland +/- copy_command pbcopy // osx + +// Choose the destination for copied text +// Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. +// Does not apply when using copy_command. +// Options: +// - system (default) +// - primary +// +/- copy_clipboard primary + +// Enable or disable automatic copy (and clear) of selection when releasing mouse +// Default: #true +// +/- copy_on_select #false + +// Path to the default editor to use to edit pane scrollbuffer +// Default: $EDITOR or $VISUAL +// +/- scrollback_editor $EDITOR + +// When attaching to an existing session with other users, +// should the session be mirrored (true) +// or should each user have their own cursor (false) +// Default: #false +// +/- mirror_session #true + +// The folder in which Zellij will look for layouts +// +/- layout_dir "/path/to/my/layout_dir" + +// The folder in which Zellij will look for themes +// +/- theme_dir "/path/to/my/theme_dir" \ No newline at end of file diff --git a/examples/zellij.kdl b/examples/zellij.kdl new file mode 100644 index 0000000..613cbf0 --- /dev/null +++ b/examples/zellij.kdl @@ -0,0 +1,297 @@ +// If you'd like to override the default keybindings completely, be sure to +// change "keybinds" to "keybinds clear-defaults=#true" +keybinds { + normal { + // uncomment this and adjust key if using copy_on_select=#false + /- bind "Alt c" { Copy } + } + locked { + bind "Ctrl g" { SwitchToMode Normal } + } + resize { + bind "Ctrl n" { SwitchToMode Normal } + bind h Left { Resize Left } + bind j Down { Resize Down } + bind k Up { Resize Up } + bind l Right { Resize Right } + bind "=" + { Resize Increase } + bind - { Resize Decrease } + } + pane { + bind "Ctrl p" { SwitchToMode Normal } + bind h Left { MoveFocus Left } + bind l Right { MoveFocus Right } + bind j Down { MoveFocus Down } + bind k Up { MoveFocus Up } + bind p { SwitchFocus } + bind n { NewPane; SwitchToMode Normal } + bind d { NewPane Down; SwitchToMode Normal } + bind r { NewPane Right; SwitchToMode Normal } + bind x { CloseFocus; SwitchToMode Normal } + bind f { ToggleFocusFullscreen; SwitchToMode Normal } + bind z { TogglePaneFrames; SwitchToMode Normal } + bind w { ToggleFloatingPanes; SwitchToMode Normal } + bind e { TogglePaneEmbedOrFloating; SwitchToMode Normal } + bind c { SwitchToMode RenamePane; PaneNameInput 0 } + } + move { + bind "Ctrl h" { SwitchToMode Normal } + bind n Tab { MovePane } + bind h Left { MovePane Left } + bind j Down { MovePane Down } + bind k Up { MovePane Up } + bind l Right { MovePane Right } + } + tab { + bind "Ctrl t" { SwitchToMode Normal } + bind r { SwitchToMode RenameTab; TabNameInput 0 } + bind h Left Up k { GoToPreviousTab } + bind l Right Down j { GoToNextTab } + bind n { NewTab; SwitchToMode Normal } + bind x { CloseTab; SwitchToMode Normal } + bind s { ToggleActiveSyncTab; SwitchToMode Normal } + bind "1" { GoToTab 1; SwitchToMode Normal } + bind "2" { GoToTab 2; SwitchToMode Normal } + bind "3" { GoToTab 3; SwitchToMode Normal } + bind "4" { GoToTab 4; SwitchToMode Normal } + bind "5" { GoToTab 5; SwitchToMode Normal } + bind "6" { GoToTab 6; SwitchToMode Normal } + bind "7" { GoToTab 7; SwitchToMode Normal } + bind "8" { GoToTab 8; SwitchToMode Normal } + bind "9" { GoToTab 9; SwitchToMode Normal } + bind Tab { ToggleTab } + } + scroll { + bind "Ctrl s" { SwitchToMode Normal } + bind e { EditScrollback; SwitchToMode Normal } + bind s { SwitchToMode EnterSearch; SearchInput 0 } + bind "Ctrl c" { ScrollToBottom; SwitchToMode Normal } + bind j Down { ScrollDown } + bind k Up { ScrollUp } + bind "Ctrl f" PageDown Right l { PageScrollDown } + bind "Ctrl b" PageUp Left h { PageScrollUp } + bind d { HalfPageScrollDown } + bind u { HalfPageScrollUp } + // uncomment this and adjust key if using copy_on_select=#false + /- bind "Alt c" { Copy } + } + search { + bind "Ctrl s" { SwitchToMode Normal } + bind "Ctrl c" { ScrollToBottom; SwitchToMode Normal } + bind j Down { ScrollDown } + bind k Up { ScrollUp } + bind "Ctrl f" PageDown Right l { PageScrollDown } + bind "Ctrl b" PageUp Left h { PageScrollUp } + bind d { HalfPageScrollDown } + bind u { HalfPageScrollUp } + bind n { Search down } + bind p { Search up } + bind c { SearchToggleOption CaseSensitivity } + bind w { SearchToggleOption Wrap } + bind o { SearchToggleOption WholeWord } + } + entersearch { + bind "Ctrl c" Esc { SwitchToMode Scroll } + bind Enter { SwitchToMode Search } + } + renametab { + bind "Ctrl c" { SwitchToMode Normal } + bind Esc { UndoRenameTab; SwitchToMode Tab } + } + renamepane { + bind "Ctrl c" { SwitchToMode Normal } + bind Esc { UndoRenamePane; SwitchToMode Pane } + } + session { + bind "Ctrl o" { SwitchToMode Normal } + bind "Ctrl s" { SwitchToMode Scroll } + bind d { Detach } + } + tmux { + bind "[" { SwitchToMode Scroll } + bind "Ctrl+b" { Write 2; SwitchToMode Normal } + bind "\"" { NewPane Down; SwitchToMode Normal } + bind % { NewPane Right; SwitchToMode Normal } + bind z { ToggleFocusFullscreen; SwitchToMode Normal } + bind c { NewTab; SwitchToMode Normal } + bind , { SwitchToMode RenameTab } + bind p { GoToPreviousTab; SwitchToMode Normal } + bind n { GoToNextTab; SwitchToMode Normal } + bind Left { MoveFocus Left; SwitchToMode Normal } + bind Right { MoveFocus Right; SwitchToMode Normal } + bind Down { MoveFocus Down; SwitchToMode Normal } + bind Up { MoveFocus Up; SwitchToMode Normal } + bind h { MoveFocus Left; SwitchToMode Normal } + bind l { MoveFocus Right; SwitchToMode Normal } + bind j { MoveFocus Down; SwitchToMode Normal } + bind k { MoveFocus Up; SwitchToMode Normal } + bind o { FocusNextPane } + bind d { Detach } + bind x { CloseFocus; SwitchToMode Normal } + } + shared_except locked { + bind "Ctrl g" { SwitchToMode Locked } + bind "Ctrl q" { Quit } + bind "Alt n" { NewPane } + bind "Alt h" "Alt Left" { MoveFocusOrTab Left } + bind "Alt l" "Alt Right" { MoveFocusOrTab Right } + bind "Alt j" "Alt Down" { MoveFocus Down } + bind "Alt k" "Alt Up" { MoveFocus Up } + bind "Alt =" "Alt +" { Resize Increase } + bind "Alt -" { Resize Decrease } + } + shared_except normal locked { + bind Enter Space Esc { SwitchToMode Normal } + } + shared_except pane locked { + bind "Ctrl p" { SwitchToMode Pane } + } + shared_except resize locked { + bind "Ctrl n" { SwitchToMode Resize } + } + shared_except scroll locked { + bind "Ctrl s" { SwitchToMode Scroll } + } + shared_except session locked { + bind "Ctrl o" { SwitchToMode Session } + } + shared_except tab locked { + bind "Ctrl t" { SwitchToMode Tab } + } + shared_except move locked { + bind "Ctrl h" { SwitchToMode Move } + } + shared_except tmux locked { + bind "Ctrl b" { SwitchToMode Tmux } + } +} + +plugins { + tab-bar { path tab-bar } + status-bar { path status-bar } + strider { path strider } + compact-bar { path compact-bar } +} + +// Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP +// eg. when terminal window with an active zellij session is closed +// Options: +// - detach (Default) +// - quit +// +/- on_force_close quit + +// Send a request for a simplified ui (without arrow fonts) to plugins +// Options: +// - #true +// - #false (Default) +// +/- simplified_ui #true + +// Choose the path to the default shell that zellij will use for opening new panes +// Default: $SHELL +// +/- default_shell $SHELL + +// Toggle between having pane frames around the panes +// Options: +// - #true (default) +// - #false +// +/- pane_frames #true + +// Define color themes for Zellij +// For more examples, see: https://github.com/zellij-org/zellij/tree/main/example/themes +// Once these themes are defined, one of them should to be selected in the "theme" section of this file +// +// themes { +// dracula { +// fg 248 248 242 +// bg 40 42 54 +// red 255 85 85 +// green 80 250 123 +// yellow 241 250 140 +// blue 98 114 164 +// magenta 255 121 198 +// orange 255 184 108 +// cyan 139 233 253 +// black 0 0 0 +// white 255 255 255 +// } +// } + +// Choose the theme that is specified in the themes section. +// Default: default +// +/- theme default + +// The name of the default layout to load on startup +// Default: "default" +// +/- default_layout compact + +// Choose the mode that zellij uses when starting up. +// Default: normal +// +/- default_mode locked + +// Toggle enabling the mouse mode. +// On certain configurations, or terminals this could +// potentially interfere with copying text. +// Options: +// - #true (default) +// - #false +// +/- mouse_mode #false + +// Configure the scroll back buffer size +// This is the number of lines zellij stores for each pane in the scroll back +// buffer. Excess number of lines are discarded in a FIFO fashion. +// Valid values: positive integers +// Default value: 10000 +// +/- scroll_buffer_size 10000 + +// Provide a command to execute when copying text. The text will be piped to +// the stdin of the program to perform the copy. This can be used with +// terminal emulators which do not support the OSC 52 ANSI control sequence +// that will be used by default if this option is not set. +// Examples: +// +/- copy_command xclip -selection clipboard // x11 +/- copy_command wl-copy // wayland +/- copy_command pbcopy // osx + +// Choose the destination for copied text +// Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. +// Does not apply when using copy_command. +// Options: +// - system (default) +// - primary +// +/- copy_clipboard primary + +// Enable or disable automatic copy (and clear) of selection when releasing mouse +// Default: #true +// +/- copy_on_select #false + +// Path to the default editor to use to edit pane scrollbuffer +// Default: $EDITOR or $VISUAL +// +/- scrollback_editor $EDITOR + +// When attaching to an existing session with other users, +// should the session be mirrored (true) +// or should each user have their own cursor (false) +// Default: #false +// +/- mirror_session #true + +// The folder in which Zellij will look for layouts +// +/- layout_dir "/path/to/my/layout_dir" + +// The folder in which Zellij will look for themes +// +/- theme_dir "/path/to/my/theme_dir" \ No newline at end of file diff --git a/src/document.rs b/src/document.rs index 718afcf..f9ea66f 100644 --- a/src/document.rs +++ b/src/document.rs @@ -835,6 +835,9 @@ inline { time; to; live "our" "dreams"; "y;all" } include_str!("../examples/Cargo.kdl").parse::()?; include_str!("../examples/ci.kdl").parse::()?; include_str!("../examples/nuget.kdl").parse::()?; + include_str!("../examples/website.kdl").parse::()?; + include_str!("../examples/zellij.kdl").parse::()?; + include_str!("../examples/zellij-unquoted-bindings.kdl").parse::()?; Ok(()) } } diff --git a/src/v2_parser.rs b/src/v2_parser.rs index d2ab421..c0a1754 100644 --- a/src/v2_parser.rs +++ b/src/v2_parser.rs @@ -1023,6 +1023,10 @@ mod string_tests { string.parse(new_input("foo")).unwrap(), Some(KdlValue::String("foo".into())) ); + assert_eq!( + string.parse(new_input(",")).unwrap(), + Some(KdlValue::String(",".into())) + ); } #[test]